@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.
Files changed (81) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.d.ts +12 -0
  3. package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.d.ts.map +1 -0
  4. package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.js +89 -0
  5. package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.js.map +1 -0
  6. package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.d.ts +11 -0
  7. package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.d.ts.map +1 -0
  8. package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.js +55 -0
  9. package/dist/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.js.map +1 -0
  10. package/dist/async-lazy-dropdown-state/index.d.ts +3 -0
  11. package/dist/async-lazy-dropdown-state/index.d.ts.map +1 -0
  12. package/dist/async-lazy-dropdown-state/index.js +3 -0
  13. package/dist/async-lazy-dropdown-state/index.js.map +1 -0
  14. package/dist/async-lazy-dropdown-state/use-async-lazy-dropdown-state.d.ts +5 -0
  15. package/dist/async-lazy-dropdown-state/use-async-lazy-dropdown-state.d.ts.map +1 -0
  16. package/dist/async-lazy-dropdown-state/use-async-lazy-dropdown-state.js +26 -0
  17. package/dist/async-lazy-dropdown-state/use-async-lazy-dropdown-state.js.map +1 -0
  18. package/dist/date-range.d.ts +5 -0
  19. package/dist/date-range.d.ts.map +1 -0
  20. package/dist/date-range.js +2 -0
  21. package/dist/date-range.js.map +1 -0
  22. package/dist/demo/dropdown-state.d.ts +3 -0
  23. package/dist/demo/dropdown-state.d.ts.map +1 -0
  24. package/dist/demo/dropdown-state.js +133 -0
  25. package/dist/demo/dropdown-state.js.map +1 -0
  26. package/dist/demo/index.d.ts +2 -0
  27. package/dist/demo/index.d.ts.map +1 -0
  28. package/dist/demo/index.js +2 -0
  29. package/dist/demo/index.js.map +1 -0
  30. package/dist/dropdown-state.d.ts +42 -0
  31. package/dist/dropdown-state.d.ts.map +1 -0
  32. package/dist/dropdown-state.js +314 -0
  33. package/dist/dropdown-state.js.map +1 -0
  34. package/dist/form-helpers.d.ts +70 -0
  35. package/dist/form-helpers.d.ts.map +1 -0
  36. package/dist/form-helpers.js +232 -0
  37. package/dist/form-helpers.js.map +1 -0
  38. package/dist/form-validators.d.ts +30 -0
  39. package/dist/form-validators.d.ts.map +1 -0
  40. package/dist/form-validators.js +56 -0
  41. package/dist/form-validators.js.map +1 -0
  42. package/dist/index.d.ts +6 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +6 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/persistent-form-state/domain-storage.d.ts +14 -0
  47. package/dist/persistent-form-state/domain-storage.d.ts.map +1 -0
  48. package/dist/persistent-form-state/domain-storage.js +42 -0
  49. package/dist/persistent-form-state/domain-storage.js.map +1 -0
  50. package/dist/persistent-form-state/in-memory-storage.d.ts +13 -0
  51. package/dist/persistent-form-state/in-memory-storage.d.ts.map +1 -0
  52. package/dist/persistent-form-state/in-memory-storage.js +30 -0
  53. package/dist/persistent-form-state/in-memory-storage.js.map +1 -0
  54. package/dist/persistent-form-state/index.d.ts +2 -0
  55. package/dist/persistent-form-state/index.d.ts.map +1 -0
  56. package/dist/persistent-form-state/index.js +2 -0
  57. package/dist/persistent-form-state/index.js.map +1 -0
  58. package/dist/persistent-form-state/persistent-form-state.d.ts +18 -0
  59. package/dist/persistent-form-state/persistent-form-state.d.ts.map +1 -0
  60. package/dist/persistent-form-state/persistent-form-state.js +93 -0
  61. package/dist/persistent-form-state/persistent-form-state.js.map +1 -0
  62. package/package.json +45 -0
  63. package/src/__tests__/__snapshots__/form-helpers.test.ts.snap +37 -0
  64. package/src/__tests__/form-helpers.test.ts +229 -0
  65. package/src/__tests__/form-validators.test.ts +55 -0
  66. package/src/async-lazy-dropdown-state/async-lazy-dropdown-state.stories.tsx +66 -0
  67. package/src/async-lazy-dropdown-state/async-lazy-dropdown-state.ts +77 -0
  68. package/src/async-lazy-dropdown-state/index.ts +2 -0
  69. package/src/async-lazy-dropdown-state/use-async-lazy-dropdown-state.ts +38 -0
  70. package/src/date-range.ts +4 -0
  71. package/src/demo/dropdown-state.tsx +233 -0
  72. package/src/demo/index.ts +1 -0
  73. package/src/dropdown-state.ts +205 -0
  74. package/src/form-helpers.ts +259 -0
  75. package/src/form-validators.ts +106 -0
  76. package/src/index.ts +5 -0
  77. package/src/persistent-form-state/__tests__/domain-storage.test.ts +81 -0
  78. package/src/persistent-form-state/domain-storage.ts +43 -0
  79. package/src/persistent-form-state/in-memory-storage.ts +32 -0
  80. package/src/persistent-form-state/index.ts +1 -0
  81. 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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"}
@@ -0,0 +1,6 @@
1
+ export * from './date-range';
2
+ export * from './persistent-form-state';
3
+ export * from './dropdown-state';
4
+ export * from './form-helpers';
5
+ export * from './form-validators';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ export * from './date-range';
2
+ export * from './persistent-form-state';
3
+ export * from './dropdown-state';
4
+ export * from './form-helpers';
5
+ export * from './form-validators';
6
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export * from './persistent-form-state';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export * from './persistent-form-state';
2
+ //# sourceMappingURL=index.js.map
@@ -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
+ `;