@servicetitan/form-state 22.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.d.ts +12 -0
- package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.d.ts.map +1 -0
- package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.js +89 -0
- package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.js.map +1 -0
- package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.d.ts +11 -0
- package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.d.ts.map +1 -0
- package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.js +55 -0
- package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.js.map +1 -0
- package/dist/async-lazy-dropdown-state/index.d.ts +3 -0
- package/dist/async-lazy-dropdown-state/index.d.ts.map +1 -0
- package/dist/async-lazy-dropdown-state/index.js +3 -0
- package/dist/async-lazy-dropdown-state/index.js.map +1 -0
- package/dist/async-lazy-dropdown-state/use-async-lazy-dropdown-state.d.ts +5 -0
- package/dist/async-lazy-dropdown-state/use-async-lazy-dropdown-state.d.ts.map +1 -0
- package/dist/async-lazy-dropdown-state/use-async-lazy-dropdown-state.js +26 -0
- package/dist/async-lazy-dropdown-state/use-async-lazy-dropdown-state.js.map +1 -0
- package/dist/date-range.d.ts +5 -0
- package/dist/date-range.d.ts.map +1 -0
- package/dist/date-range.js +2 -0
- package/dist/date-range.js.map +1 -0
- package/dist/demo/dropdown-state.d.ts +3 -0
- package/dist/demo/dropdown-state.d.ts.map +1 -0
- package/dist/demo/dropdown-state.js +133 -0
- package/dist/demo/dropdown-state.js.map +1 -0
- package/dist/demo/index.d.ts +2 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +2 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/dropdown-state.d.ts +42 -0
- package/dist/dropdown-state.d.ts.map +1 -0
- package/dist/dropdown-state.js +314 -0
- package/dist/dropdown-state.js.map +1 -0
- package/dist/form-helpers.d.ts +70 -0
- package/dist/form-helpers.d.ts.map +1 -0
- package/dist/form-helpers.js +232 -0
- package/dist/form-helpers.js.map +1 -0
- package/dist/form-validators.d.ts +30 -0
- package/dist/form-validators.d.ts.map +1 -0
- package/dist/form-validators.js +56 -0
- package/dist/form-validators.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/persistent-form-state/domain-storage.d.ts +14 -0
- package/dist/persistent-form-state/domain-storage.d.ts.map +1 -0
- package/dist/persistent-form-state/domain-storage.js +42 -0
- package/dist/persistent-form-state/domain-storage.js.map +1 -0
- package/dist/persistent-form-state/in-memory-storage.d.ts +13 -0
- package/dist/persistent-form-state/in-memory-storage.d.ts.map +1 -0
- package/dist/persistent-form-state/in-memory-storage.js +30 -0
- package/dist/persistent-form-state/in-memory-storage.js.map +1 -0
- package/dist/persistent-form-state/index.d.ts +2 -0
- package/dist/persistent-form-state/index.d.ts.map +1 -0
- package/dist/persistent-form-state/index.js +2 -0
- package/dist/persistent-form-state/index.js.map +1 -0
- package/dist/persistent-form-state/persistent-form-state.d.ts +18 -0
- package/dist/persistent-form-state/persistent-form-state.d.ts.map +1 -0
- package/dist/persistent-form-state/persistent-form-state.js +93 -0
- package/dist/persistent-form-state/persistent-form-state.js.map +1 -0
- package/package.json +45 -0
- package/src/__tests__/__snapshots__/form-helpers.test.ts.snap +37 -0
- package/src/__tests__/form-helpers.test.ts +229 -0
- package/src/__tests__/form-validators.test.ts +55 -0
- package/src/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.tsx +66 -0
- package/src/async-lazy-dropdown-state/async-lazy-dropdown-state.ts +77 -0
- package/src/async-lazy-dropdown-state/index.ts +2 -0
- package/src/async-lazy-dropdown-state/use-async-lazy-dropdown-state.ts +38 -0
- package/src/date-range.ts +4 -0
- package/src/demo/dropdown-state.tsx +233 -0
- package/src/demo/index.ts +1 -0
- package/src/dropdown-state.ts +205 -0
- package/src/form-helpers.ts +259 -0
- package/src/form-validators.ts +106 -0
- package/src/index.ts +5 -0
- package/src/persistent-form-state/__tests__/domain-storage.test.ts +81 -0
- package/src/persistent-form-state/domain-storage.ts +43 -0
- package/src/persistent-form-state/in-memory-storage.ts +32 -0
- package/src/persistent-form-state/index.ts +1 -0
- package/src/persistent-form-state/persistent-form-state.ts +68 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { DatetimeFieldState, FormValues } from './form-helpers';
|
|
2
|
+
import { DateRange } from './date-range';
|
|
3
|
+
interface DateRangeFieldStates {
|
|
4
|
+
startDate: DatetimeFieldState;
|
|
5
|
+
endDate: DatetimeFieldState;
|
|
6
|
+
}
|
|
7
|
+
export declare const FormValidators: {
|
|
8
|
+
required: (value?: FormValues | undefined) => string | false;
|
|
9
|
+
requiredWithCustomMessage: (errorMessage: string) => (value?: FormValues | undefined) => string | false;
|
|
10
|
+
hasLowerCase: (str: string) => boolean;
|
|
11
|
+
hasUpperCase: (str: string) => boolean;
|
|
12
|
+
hasNumber: (str: string) => boolean;
|
|
13
|
+
passwordIsValidFormat: (password: string) => boolean;
|
|
14
|
+
emailFormatIsValid: (email: string) => boolean;
|
|
15
|
+
website: (errorMessage?: string) => (value: string) => string | false;
|
|
16
|
+
minDate: Date;
|
|
17
|
+
maxDate: Date;
|
|
18
|
+
isDateValid: (date: Date | null) => false | "Please provide a valid date";
|
|
19
|
+
isDateRangeValid: (dateRange: DateRangeFieldStates) => false | "Start Date should not be after End Date" | null;
|
|
20
|
+
dateRangeRequired: (errorMessage?: string) => (dateRange: DateRange | undefined) => string | false;
|
|
21
|
+
dateRangeValid: (errorMessage?: string) => (dateRange: DateRange | undefined) => string | false;
|
|
22
|
+
isDateRangeLessThanMaxLength: (maxDays: number) => (val: DateRange | undefined) => string | false | undefined;
|
|
23
|
+
isAlphaNumeric: (str: string) => boolean;
|
|
24
|
+
isMatchingRegex: (regexp: RegExp, entity: string) => (str: string) => string | false;
|
|
25
|
+
minLength: (minLength: number) => (value: string | any[] | undefined) => string | false;
|
|
26
|
+
maxLength: (maxLength: number) => (value: string | any[] | undefined) => string | false;
|
|
27
|
+
exactLength: (exactLength: number) => (value: string | any[] | undefined) => string | false;
|
|
28
|
+
};
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=form-validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-validators.d.ts","sourceRoot":"","sources":["../src/form-validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,UAAU,oBAAoB;IAC1B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,OAAO,EAAE,kBAAkB,CAAC;CAC/B;AAcD,eAAO,MAAM,cAAc;;8CAImB,MAAM;wBAG5B,MAAM;wBAEN,MAAM;qBAET,MAAM;sCAEW,MAAM;gCAMZ,MAAM;gDAQf,MAAM;;;wBAUL,IAAI,GAAG,IAAI;kCAID,oBAAoB;8DAQlC,SAAS,GAAG,SAAS;2DAKrB,SAAS,GAAG,SAAS;4CAOG,MAAM,WAAW,SAAS,GAAG,SAAS;0BAUxD,MAAM;8BAEF,MAAM,UAAU,MAAM,WAAW,MAAM;2BAG1C,MAAM,aAAa,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS;2BAG7C,MAAM,aAAa,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS;+BAGzC,MAAM,aAAa,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS;CAE3E,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { isObservableArray } from 'mobx';
|
|
2
|
+
const isDefined = (value) => {
|
|
3
|
+
if (value === undefined) {
|
|
4
|
+
return false;
|
|
5
|
+
}
|
|
6
|
+
if (Array.isArray(value) || isObservableArray(value)) {
|
|
7
|
+
return !!value.length;
|
|
8
|
+
}
|
|
9
|
+
return typeof value === 'string' ? !!value.trim() : !!value;
|
|
10
|
+
};
|
|
11
|
+
export const FormValidators = {
|
|
12
|
+
required: (value) => FormValidators.requiredWithCustomMessage('Value is required')(value),
|
|
13
|
+
requiredWithCustomMessage: (errorMessage) => (value) => !isDefined(value) && errorMessage,
|
|
14
|
+
hasLowerCase: (str) => /[a-z]/.test(str),
|
|
15
|
+
hasUpperCase: (str) => /[A-Z]/.test(str),
|
|
16
|
+
hasNumber: (str) => /\d/.test(str),
|
|
17
|
+
passwordIsValidFormat: (password) => password.length > 7 &&
|
|
18
|
+
FormValidators.hasLowerCase(password) &&
|
|
19
|
+
FormValidators.hasUpperCase(password) &&
|
|
20
|
+
FormValidators.hasNumber(password),
|
|
21
|
+
emailFormatIsValid: (email) => {
|
|
22
|
+
/* tslint:disable: ter-max-len */
|
|
23
|
+
const regex = /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
|
|
24
|
+
return email.length !== 0 && regex.test(email);
|
|
25
|
+
},
|
|
26
|
+
website: (errorMessage = 'Enter valid website') => {
|
|
27
|
+
return (value) => !/^(https?:\/\/)?(www\.)?([a-zA-Z0-9]+(-?[a-zA-Z0-9])*\.)+[\w]{2,}(\/\S*)?$/i.test(value) && errorMessage;
|
|
28
|
+
},
|
|
29
|
+
minDate: new Date(1900, 0, 1),
|
|
30
|
+
maxDate: new Date(2099, 11, 31),
|
|
31
|
+
isDateValid: (date) => (!date || date > FormValidators.maxDate || date < FormValidators.minDate) &&
|
|
32
|
+
'Please provide a valid date',
|
|
33
|
+
isDateRangeValid: (dateRange) => dateRange.startDate.$ &&
|
|
34
|
+
dateRange.endDate.$ &&
|
|
35
|
+
dateRange.startDate.$ > dateRange.endDate.$ &&
|
|
36
|
+
'Start Date should not be after End Date',
|
|
37
|
+
dateRangeRequired: (errorMessage = 'Date Range is required') => (dateRange) => (!dateRange || !dateRange.from || !dateRange.to) && errorMessage,
|
|
38
|
+
dateRangeValid: (errorMessage = 'Start cannot be after End') => (dateRange) => !!dateRange &&
|
|
39
|
+
!!dateRange.from &&
|
|
40
|
+
!!dateRange.to &&
|
|
41
|
+
dateRange.from > dateRange.to &&
|
|
42
|
+
errorMessage,
|
|
43
|
+
isDateRangeLessThanMaxLength: (maxDays) => (val) => {
|
|
44
|
+
const dayInMillseconds = 1000 * 60 * 60 * 24;
|
|
45
|
+
return ((val === null || val === void 0 ? void 0 : val.from) &&
|
|
46
|
+
val.to &&
|
|
47
|
+
(val.to.getTime() - val.from.getTime()) / dayInMillseconds >= maxDays &&
|
|
48
|
+
`Only ${maxDays} days can be displayed at time`);
|
|
49
|
+
},
|
|
50
|
+
isAlphaNumeric: (str) => /^(\w+,?)*$/.test(str),
|
|
51
|
+
isMatchingRegex: (regexp, entity) => (str) => !regexp.test(str) && `Invalid format for ${entity}`,
|
|
52
|
+
minLength: (minLength) => (value) => value && value.length < minLength ? `Value's min length is ${minLength}` : false,
|
|
53
|
+
maxLength: (maxLength) => (value) => value && value.length > maxLength ? `Value's max length is ${maxLength}` : false,
|
|
54
|
+
exactLength: (exactLength) => (value) => value && value.length !== exactLength ? `Value's length must be ${exactLength}` : false,
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=form-validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-validators.js","sourceRoot":"","sources":["../src/form-validators.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FormStateShape } from '../form-helpers';
|
|
2
|
+
import { ValidatableMapOrArray } from 'formstate';
|
|
3
|
+
export declare class DomainStorage<T extends ValidatableMapOrArray> {
|
|
4
|
+
private readonly version;
|
|
5
|
+
private readonly cacheKey;
|
|
6
|
+
constructor({ cacheKey, version }: {
|
|
7
|
+
cacheKey: string;
|
|
8
|
+
version: number;
|
|
9
|
+
});
|
|
10
|
+
getItem(): FormStateShape<T> | null;
|
|
11
|
+
removeItem(): void;
|
|
12
|
+
setItem(_: string, value: FormStateShape<T>): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=domain-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-storage.d.ts","sourceRoot":"","sources":["../../src/persistent-form-state/domain-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAOlD,qBAAa,aAAa,CAAC,CAAC,SAAS,qBAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAKxE,OAAO,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAiBnC,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;CAIrD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export class DomainStorage {
|
|
2
|
+
constructor({ cacheKey, version }) {
|
|
3
|
+
Object.defineProperty(this, "version", {
|
|
4
|
+
enumerable: true,
|
|
5
|
+
configurable: true,
|
|
6
|
+
writable: true,
|
|
7
|
+
value: void 0
|
|
8
|
+
});
|
|
9
|
+
Object.defineProperty(this, "cacheKey", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
configurable: true,
|
|
12
|
+
writable: true,
|
|
13
|
+
value: void 0
|
|
14
|
+
});
|
|
15
|
+
this.version = version;
|
|
16
|
+
this.cacheKey = cacheKey;
|
|
17
|
+
}
|
|
18
|
+
getItem() {
|
|
19
|
+
try {
|
|
20
|
+
const cachedData = localStorage.getItem(this.cacheKey);
|
|
21
|
+
if (cachedData) {
|
|
22
|
+
const formData = JSON.parse(cachedData);
|
|
23
|
+
if (formData.version === this.version) {
|
|
24
|
+
return formData.value;
|
|
25
|
+
}
|
|
26
|
+
this.removeItem();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
this.removeItem();
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
removeItem() {
|
|
35
|
+
localStorage.removeItem(this.cacheKey);
|
|
36
|
+
}
|
|
37
|
+
setItem(_, value) {
|
|
38
|
+
const formData = { value, version: this.version };
|
|
39
|
+
localStorage.setItem(this.cacheKey, JSON.stringify(formData));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=domain-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-storage.js","sourceRoot":"","sources":["../../src/persistent-form-state/domain-storage.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,aAAa;IAItB,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAyC;QAHxE;;;;;WAAiC;QACjC;;;;;WAAkC;QAG9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,OAAO;QACH,IAAI;YACA,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,UAAU,EAAE;gBACZ,MAAM,QAAQ,GAAsB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC3D,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE;oBACnC,OAAO,QAAQ,CAAC,KAAK,CAAC;iBACzB;gBACD,IAAI,CAAC,UAAU,EAAE,CAAC;aACrB;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,UAAU,EAAE,CAAC;SACrB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,UAAU;QACN,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,CAAS,EAAE,KAAwB;QACvC,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAClD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClE,CAAC;CACJ"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FormStateShape } from '../form-helpers';
|
|
2
|
+
import { ValidatableMapOrArray } from 'formstate';
|
|
3
|
+
export declare class InMemoryStorage<T extends ValidatableMapOrArray> {
|
|
4
|
+
private storage;
|
|
5
|
+
get length(): number;
|
|
6
|
+
clear(): void;
|
|
7
|
+
getItem(key: string): FormStateShape<T> | null;
|
|
8
|
+
key(index: number): string | null;
|
|
9
|
+
removeItem(key: string): void;
|
|
10
|
+
setItem(key: string, value: FormStateShape<T>): void;
|
|
11
|
+
}
|
|
12
|
+
export declare const MemoryStorage: InMemoryStorage<any>;
|
|
13
|
+
//# sourceMappingURL=in-memory-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-storage.d.ts","sourceRoot":"","sources":["../../src/persistent-form-state/in-memory-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,qBAAa,eAAe,CAAC,CAAC,SAAS,qBAAqB;IACxD,OAAO,CAAC,OAAO,CAAwC;IAEvD,IAAI,MAAM,WAET;IAED,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAI9C,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIjC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;CAGvD;AAED,eAAO,MAAM,aAAa,sBAA6B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class InMemoryStorage {
|
|
2
|
+
constructor() {
|
|
3
|
+
Object.defineProperty(this, "storage", {
|
|
4
|
+
enumerable: true,
|
|
5
|
+
configurable: true,
|
|
6
|
+
writable: true,
|
|
7
|
+
value: new Map()
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
get length() {
|
|
11
|
+
return this.storage.size;
|
|
12
|
+
}
|
|
13
|
+
clear() {
|
|
14
|
+
this.storage.clear();
|
|
15
|
+
}
|
|
16
|
+
getItem(key) {
|
|
17
|
+
return this.storage.get(key) !== undefined ? this.storage.get(key) : null;
|
|
18
|
+
}
|
|
19
|
+
key(index) {
|
|
20
|
+
return this.length < index ? null : Array.from(this.storage.keys())[index];
|
|
21
|
+
}
|
|
22
|
+
removeItem(key) {
|
|
23
|
+
this.storage.delete(key);
|
|
24
|
+
}
|
|
25
|
+
setItem(key, value) {
|
|
26
|
+
this.storage.set(key, value);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export const MemoryStorage = new InMemoryStorage();
|
|
30
|
+
//# sourceMappingURL=in-memory-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-storage.js","sourceRoot":"","sources":["../../src/persistent-form-state/in-memory-storage.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,eAAe;IAA5B;QACI;;;;mBAAkB,IAAI,GAAG,EAA6B;WAAC;IAyB3D,CAAC;IAvBG,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,KAAK;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,GAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IAED,GAAG,CAAC,KAAa;QACb,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;IAED,UAAU,CAAC,GAAW;QAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,KAAwB;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,eAAe,EAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistent-form-state/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/persistent-form-state/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { FormState, ValidatableMapOrArray } from 'formstate';
|
|
2
|
+
export declare enum PersistenceMode {
|
|
3
|
+
Session = 0,
|
|
4
|
+
Domain = 1,
|
|
5
|
+
InMemory = 2
|
|
6
|
+
}
|
|
7
|
+
export declare class PersistentFormState<T extends ValidatableMapOrArray> extends FormState<T> {
|
|
8
|
+
private cacheKey;
|
|
9
|
+
private persistenceMode;
|
|
10
|
+
private storageSystem;
|
|
11
|
+
private resetFormSuper;
|
|
12
|
+
constructor($: T, cacheKey: string, persistenceMode: PersistenceMode, autoSave?: boolean, version?: number);
|
|
13
|
+
save: () => void;
|
|
14
|
+
resetForm: () => void;
|
|
15
|
+
private trackChange;
|
|
16
|
+
private getCached;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=persistent-form-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistent-form-state.d.ts","sourceRoot":"","sources":["../../src/persistent-form-state/persistent-form-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAU7D,oBAAY,eAAe;IACvB,OAAO,IAAA;IACP,MAAM,IAAA;IACN,QAAQ,IAAA;CACX;AAED,qBAAa,mBAAmB,CAAC,CAAC,SAAS,qBAAqB,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAM9E,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,eAAe;IAN3B,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,cAAc,CAAc;gBAGhC,CAAC,EAAE,CAAC,EACI,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,eAAe,EACxC,QAAQ,CAAC,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,MAAM;IAqBpB,IAAI,aAEF;IAEF,SAAS,aAGP;IAEF,OAAO,CAAC,WAAW,CAEjB;IAEF,OAAO,CAAC,SAAS,CAMf;CACL"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { autorun } from 'mobx';
|
|
2
|
+
import { FormState } from 'formstate';
|
|
3
|
+
import { MemoryStorage } from './in-memory-storage';
|
|
4
|
+
import { setFormStateValues, formStateToJS, } from '../form-helpers';
|
|
5
|
+
import { DomainStorage } from './domain-storage';
|
|
6
|
+
export var PersistenceMode;
|
|
7
|
+
(function (PersistenceMode) {
|
|
8
|
+
PersistenceMode[PersistenceMode["Session"] = 0] = "Session";
|
|
9
|
+
PersistenceMode[PersistenceMode["Domain"] = 1] = "Domain";
|
|
10
|
+
PersistenceMode[PersistenceMode["InMemory"] = 2] = "InMemory";
|
|
11
|
+
})(PersistenceMode || (PersistenceMode = {}));
|
|
12
|
+
export class PersistentFormState extends FormState {
|
|
13
|
+
constructor($, cacheKey, persistenceMode, autoSave, version) {
|
|
14
|
+
super($);
|
|
15
|
+
Object.defineProperty(this, "cacheKey", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
configurable: true,
|
|
18
|
+
writable: true,
|
|
19
|
+
value: cacheKey
|
|
20
|
+
});
|
|
21
|
+
Object.defineProperty(this, "persistenceMode", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
writable: true,
|
|
25
|
+
value: persistenceMode
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(this, "storageSystem", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
configurable: true,
|
|
30
|
+
writable: true,
|
|
31
|
+
value: void 0
|
|
32
|
+
});
|
|
33
|
+
Object.defineProperty(this, "resetFormSuper", {
|
|
34
|
+
enumerable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
writable: true,
|
|
37
|
+
value: this.reset
|
|
38
|
+
});
|
|
39
|
+
Object.defineProperty(this, "save", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
configurable: true,
|
|
42
|
+
writable: true,
|
|
43
|
+
value: () => {
|
|
44
|
+
this.storageSystem.setItem(this.cacheKey, formStateToJS(this));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(this, "resetForm", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: () => {
|
|
52
|
+
this.resetFormSuper();
|
|
53
|
+
this.storageSystem.removeItem(this.cacheKey);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
Object.defineProperty(this, "trackChange", {
|
|
57
|
+
enumerable: true,
|
|
58
|
+
configurable: true,
|
|
59
|
+
writable: true,
|
|
60
|
+
value: () => {
|
|
61
|
+
autorun(() => this.save(), { delay: 500 });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
Object.defineProperty(this, "getCached", {
|
|
65
|
+
enumerable: true,
|
|
66
|
+
configurable: true,
|
|
67
|
+
writable: true,
|
|
68
|
+
value: () => {
|
|
69
|
+
const data = this.storageSystem.getItem(this.cacheKey);
|
|
70
|
+
if (data) {
|
|
71
|
+
setFormStateValues(this, data);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (PersistenceMode.Domain === this.persistenceMode) {
|
|
76
|
+
if (!version) {
|
|
77
|
+
throw 'Set a data structure version.';
|
|
78
|
+
}
|
|
79
|
+
this.storageSystem = new DomainStorage({ cacheKey, version });
|
|
80
|
+
}
|
|
81
|
+
else if (PersistenceMode.Session === this.persistenceMode) {
|
|
82
|
+
throw 'Use of Session storage is currently unsafe';
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
this.storageSystem = MemoryStorage;
|
|
86
|
+
}
|
|
87
|
+
this.getCached();
|
|
88
|
+
if (autoSave) {
|
|
89
|
+
this.trackChange();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=persistent-form-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistent-form-state.js","sourceRoot":"","sources":["../../src/persistent-form-state/persistent-form-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAmB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAGH,kBAAkB,EAClB,aAAa,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACvB,2DAAO,CAAA;IACP,yDAAM,CAAA;IACN,6DAAQ,CAAA;AACZ,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B;AAED,MAAM,OAAO,mBAAqD,SAAQ,SAAY;IAIlF,YACI,CAAI,EACI,QAAgB,EAChB,eAAgC,EACxC,QAAkB,EAClB,OAAgB;QAEhB,KAAK,CAAC,CAAC,CAAC,CAAC;;;;;mBALD;;;;;;mBACA;;QANZ;;;;;WAA8D;QAC9D;;;;mBAAyB,IAAI,CAAC,KAAK;WAAC;QA4BpC;;;;mBAAO,GAAG,EAAE;gBACR,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,CAAC;WAAC;QAEF;;;;mBAAY,GAAG,EAAE;gBACb,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjD,CAAC;WAAC;QAEF;;;;mBAAsB,GAAG,EAAE;gBACvB,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/C,CAAC;WAAC;QAEF;;;;mBAAoB,GAAG,EAAE;gBACrB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEvD,IAAI,IAAI,EAAE;oBACN,kBAAkB,CAAC,IAAI,EAAE,IAAsD,CAAC,CAAC;iBACpF;YACL,CAAC;WAAC;QApCE,IAAI,eAAe,CAAC,MAAM,KAAK,IAAI,CAAC,eAAe,EAAE;YACjD,IAAI,CAAC,OAAO,EAAE;gBACV,MAAM,+BAA+B,CAAC;aACzC;YACD,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;SACpE;aAAM,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,CAAC,eAAe,EAAE;YACzD,MAAM,4CAA4C,CAAC;SACtD;aAAM;YACH,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;SACtC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,QAAQ,EAAE;YACV,IAAI,CAAC,WAAW,EAAE,CAAC;SACtB;IACL,CAAC;CAsBJ"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@servicetitan/form-state",
|
|
3
|
+
"version": "22.4.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/servicetitan/anvil-uikit-contrib.git",
|
|
8
|
+
"directory": "packages/form-state"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"typings": "./dist/index.d.ts",
|
|
12
|
+
"sideEffects": false,
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"src"
|
|
16
|
+
],
|
|
17
|
+
"devDependencies": {
|
|
18
|
+
"@servicetitan/data-query": "^22.3.0",
|
|
19
|
+
"@servicetitan/design-system": "~11.8.0",
|
|
20
|
+
"@types/debounce": "~1.2.1",
|
|
21
|
+
"@types/react": "~17.0.38",
|
|
22
|
+
"formstate": "^2.0.0",
|
|
23
|
+
"mobx": "~6.6.0",
|
|
24
|
+
"mobx-react": "~7.5.0",
|
|
25
|
+
"react": "^17.0.2"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"@servicetitan/data-query": "^22.3.0",
|
|
29
|
+
"@servicetitan/design-system": "^11.8.0",
|
|
30
|
+
"formstate": "^2.0.0",
|
|
31
|
+
"mobx": "^6.6.0",
|
|
32
|
+
"mobx-react": "^7.5.0",
|
|
33
|
+
"react": "^17.0.2"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"debounce": "^1.2.1"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"cli": {
|
|
42
|
+
"webpack": false
|
|
43
|
+
},
|
|
44
|
+
"gitHead": "8b952d7f41367c61b548af4293b42a93dc3c6ec7"
|
|
45
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`formStateToJS 1`] = `
|
|
4
|
+
Object {
|
|
5
|
+
"field": 0,
|
|
6
|
+
"subForm": Object {
|
|
7
|
+
"subField": 1,
|
|
8
|
+
"subSubForm": Object {
|
|
9
|
+
"subSubField": 1,
|
|
10
|
+
"subSubField2": 2,
|
|
11
|
+
},
|
|
12
|
+
"subSubFormArray": Array [
|
|
13
|
+
Object {
|
|
14
|
+
"veryNestedField": 1,
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
"subSubFormMap": Object {
|
|
18
|
+
"subSubMapField": "x",
|
|
19
|
+
"subSubMapField2": "y",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
"subFormArray": Array [
|
|
23
|
+
Object {
|
|
24
|
+
"a": 1,
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
"subFormArray2": Array [
|
|
28
|
+
1,
|
|
29
|
+
2,
|
|
30
|
+
],
|
|
31
|
+
"subFormMap": Object {
|
|
32
|
+
"subMapField": "one",
|
|
33
|
+
"subMapField2": "two",
|
|
34
|
+
"subMapField3": "three",
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
`;
|