@xyo-network/react-form-group 3.0.1 → 3.0.3

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 (56) hide show
  1. package/dist/browser/FormGroup.d.ts +44 -0
  2. package/dist/browser/FormGroup.d.ts.map +1 -0
  3. package/dist/browser/InputError.d.ts +5 -0
  4. package/dist/browser/InputError.d.ts.map +1 -0
  5. package/dist/browser/context/Context.d.ts +7 -0
  6. package/dist/browser/context/Context.d.ts.map +1 -0
  7. package/dist/browser/context/Provider.d.ts +8 -0
  8. package/dist/browser/context/Provider.d.ts.map +1 -0
  9. package/dist/browser/context/State.d.ts +7 -0
  10. package/dist/browser/context/State.d.ts.map +1 -0
  11. package/dist/browser/context/index.d.ts +5 -0
  12. package/dist/browser/context/index.d.ts.map +1 -0
  13. package/dist/browser/context/use.d.ts +6 -0
  14. package/dist/browser/context/use.d.ts.map +1 -0
  15. package/dist/browser/control/AbstractControl.d.ts +22 -0
  16. package/dist/browser/control/AbstractControl.d.ts.map +1 -0
  17. package/dist/browser/control/FormControl.d.ts +25 -0
  18. package/dist/browser/control/FormControl.d.ts.map +1 -0
  19. package/dist/browser/control/FormControlBase.d.ts +26 -0
  20. package/dist/browser/control/FormControlBase.d.ts.map +1 -0
  21. package/dist/browser/control/accessor/ControlValueAccessor.d.ts +21 -0
  22. package/dist/browser/control/accessor/ControlValueAccessor.d.ts.map +1 -0
  23. package/dist/browser/control/accessor/ControlValueAccessorBase.d.ts +45 -0
  24. package/dist/browser/control/accessor/ControlValueAccessorBase.d.ts.map +1 -0
  25. package/dist/browser/control/accessor/FormControlStatus.d.ts +6 -0
  26. package/dist/browser/control/accessor/FormControlStatus.d.ts.map +1 -0
  27. package/dist/browser/control/accessor/ValidControlValue.d.ts +2 -0
  28. package/dist/browser/control/accessor/ValidControlValue.d.ts.map +1 -0
  29. package/dist/browser/control/accessor/index.d.ts +5 -0
  30. package/dist/browser/control/accessor/index.d.ts.map +1 -0
  31. package/dist/browser/control/index.d.ts +5 -0
  32. package/dist/browser/control/index.d.ts.map +1 -0
  33. package/dist/browser/index.d.ts +6 -228
  34. package/dist/browser/index.d.ts.map +1 -0
  35. package/dist/browser/index.mjs +10 -10
  36. package/dist/browser/index.mjs.map +1 -1
  37. package/dist/browser/storage/ArchivistFormGroupStorage.d.ts +13 -0
  38. package/dist/browser/storage/ArchivistFormGroupStorage.d.ts.map +1 -0
  39. package/dist/browser/storage/FormGroupStorage.d.ts +8 -0
  40. package/dist/browser/storage/FormGroupStorage.d.ts.map +1 -0
  41. package/dist/browser/storage/index.d.ts +3 -0
  42. package/dist/browser/storage/index.d.ts.map +1 -0
  43. package/package.json +55 -50
  44. package/src/FormGroup.ts +6 -5
  45. package/src/context/Context.ts +1 -1
  46. package/src/context/Provider.tsx +15 -6
  47. package/src/context/State.ts +3 -3
  48. package/src/control/AbstractControl.ts +5 -3
  49. package/src/control/FormControl.ts +2 -2
  50. package/src/control/FormControlBase.ts +4 -3
  51. package/src/control/accessor/ControlValueAccessor.ts +1 -1
  52. package/src/control/accessor/ControlValueAccessorBase.ts +5 -3
  53. package/src/storage/ArchivistFormGroupStorage.ts +3 -3
  54. package/src/storage/FormGroupStorage.ts +2 -2
  55. package/src/stories/test.stories.tsx +2 -4
  56. package/xy.config.ts +2 -4
@@ -0,0 +1,44 @@
1
+ import type { Payload } from '@xyo-network/payload-model';
2
+ import { AbstractControl } from './control/index.ts';
3
+ import type { ErrorSummary } from './InputError.ts';
4
+ import type { FormGroupStorage } from './storage/index.ts';
5
+ export type PayloadWithTimestamp = Payload<{
6
+ timestamp?: number;
7
+ }>;
8
+ export type KeyOfString<T> = keyof T extends string ? keyof T : never;
9
+ type FormGroupErrors<TValue> = Record<KeyOfString<TValue>, string>;
10
+ export type FormGroupParams<TStorageValue extends Payload = Payload> = {
11
+ serialize?: boolean;
12
+ storage?: {
13
+ sensitive?: FormGroupStorage<TStorageValue>;
14
+ storage?: FormGroupStorage<TStorageValue>;
15
+ };
16
+ ttlStorage?: number;
17
+ };
18
+ export declare class FormGroup<TValue extends PayloadWithTimestamp = PayloadWithTimestamp, TStorageValue extends PayloadWithTimestamp = PayloadWithTimestamp> extends AbstractControl {
19
+ private fgParams?;
20
+ private _controls;
21
+ private serializeListeners;
22
+ private serializedSensitiveState;
23
+ private serializedState;
24
+ constructor(fgParams?: FormGroupParams<TStorageValue> | undefined);
25
+ get errorSummary(): ErrorSummary;
26
+ get errors(): FormGroupErrors<TValue>;
27
+ get nonSensitiveStorage(): FormGroupStorage<TStorageValue> | undefined;
28
+ get sensitiveStorage(): FormGroupStorage<TStorageValue> | undefined;
29
+ get touched(): boolean;
30
+ get valid(): boolean;
31
+ get values(): TValue;
32
+ getControl(name: string): Record<KeyOfString<TValue>, AbstractControl<import("./control/index.ts").ValidControlValue>>[KeyOfString<TValue>];
33
+ getSerializedValue(name: string, sensitive?: boolean): Promise<string | undefined>;
34
+ registerControl(name: string, control: AbstractControl): void;
35
+ resetControls(): void;
36
+ resetValues(): void;
37
+ unregisterControl(name: string): void;
38
+ validateFields(requiredFields?: string[] | undefined): void;
39
+ private serializeControlValue;
40
+ private serializeValues;
41
+ private setStateValueFromStorage;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=FormGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormGroup.d.ts","sourceRoot":"","sources":["../../src/FormGroup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE1D,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAElE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,GAAG,KAAK,CAAA;AAErE,KAAK,eAAe,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;AAElE,MAAM,MAAM,eAAe,CAAC,aAAa,SAAS,OAAO,GAAG,OAAO,IAAI;IACrE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;QAC3C,OAAO,CAAC,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;KAC1C,CAAA;IACD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AASD,qBAAa,SAAS,CACpB,MAAM,SAAS,oBAAoB,GAAG,oBAAoB,EAC1D,aAAa,SAAS,oBAAoB,GAAG,oBAAoB,CACjE,SAAQ,eAAe;IAQX,OAAO,CAAC,QAAQ,CAAC;IAP7B,OAAO,CAAC,SAAS,CAAqD;IAEtE,OAAO,CAAC,kBAAkB,CAA+C;IAEzE,OAAO,CAAC,wBAAwB,CAAmD;IACnF,OAAO,CAAC,eAAe,CAAmD;gBAEtD,QAAQ,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,YAAA;IAI7D,IAAI,YAAY,iBAaf;IAED,IAAI,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,CAOpC;IAED,IAAI,mBAAmB,gDAEtB;IAED,IAAI,gBAAgB,gDAEnB;IAED,IAAa,OAAO,YAEnB;IAED,IAAa,KAAK,YAEjB;IAED,IAAI,MAAM,IAAI,MAAM,CAOnB;IAED,UAAU,CAAC,IAAI,EAAE,MAAM;IAIjB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAwBtF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;IAMtD,aAAa;IAMb,WAAW;IAMX,iBAAiB,CAAC,IAAI,EAAE,MAAM;IAW9B,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS;IAWpD,OAAO,CAAC,qBAAqB;IAuC7B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,wBAAwB;CAcjC"}
@@ -0,0 +1,5 @@
1
+ export type ErrorSummary = {
2
+ errorMessage: string;
3
+ invalidFields: string[];
4
+ };
5
+ //# sourceMappingURL=InputError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InputError.d.ts","sourceRoot":"","sources":["../../src/InputError.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { FormGroupContextWithPayloadState } from './State.ts';
2
+ export declare const FormGroupBaseContext: import("react").Context<FormGroupContextWithPayloadState<{
3
+ schema: string;
4
+ } & import("@xyo-network/payload-model").PayloadFields, {
5
+ schema: string;
6
+ } & import("@xyo-network/payload-model").PayloadFields> & import("@xyo-network/react-shared").ContextExState>;
7
+ //# sourceMappingURL=Context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.d.ts","sourceRoot":"","sources":["../../../src/context/Context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,YAAY,CAAA;AAElE,eAAO,MAAM,oBAAoB;;;;6GAAsD,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { Payload } from '@xyo-network/payload-model';
2
+ import type { PropsWithChildren } from 'react';
3
+ import type { FormGroupParams } from '../FormGroup.ts';
4
+ export interface FormGroupPayloadProviderProps<TStorage extends Payload = Payload> extends PropsWithChildren {
5
+ params?: FormGroupParams<TStorage>;
6
+ }
7
+ export declare const FormGroupPayloadProvider: ({ children, params, ...props }: FormGroupPayloadProviderProps) => import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=Provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../../src/context/Provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAG9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAItD,MAAM,WAAW,6BAA6B,CAAC,QAAQ,SAAS,OAAO,GAAG,OAAO,CAAE,SAAQ,iBAAiB;IAC1G,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAA;CACnC;AAKD,eAAO,MAAM,wBAAwB,mCAElC,6BAA6B,4CAiB/B,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { Payload } from '@xyo-network/payload-model';
2
+ import type { ContextExState } from '@xyo-network/react-shared';
3
+ import type { FormGroup } from '../FormGroup.ts';
4
+ export interface FormGroupContextWithPayloadState<TValue extends Payload = Payload, TStorageValue extends Payload = Payload> extends ContextExState {
5
+ formGroup?: FormGroup<TValue, TStorageValue>;
6
+ }
7
+ //# sourceMappingURL=State.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"State.d.ts","sourceRoot":"","sources":["../../../src/context/State.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,MAAM,WAAW,gCAAgC,CAAC,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,aAAa,SAAS,OAAO,GAAG,OAAO,CAAE,SAAQ,cAAc;IACjJ,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;CAC7C"}
@@ -0,0 +1,5 @@
1
+ export * from './Context.ts';
2
+ export * from './Provider.tsx';
3
+ export * from './State.ts';
4
+ export * from './use.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA"}
@@ -0,0 +1,6 @@
1
+ export declare const useFormGroup: (required?: boolean) => Omit<import("./State.ts").FormGroupContextWithPayloadState<{
2
+ schema: string;
3
+ } & import("@xyo-network/payload-model").PayloadFields, {
4
+ schema: string;
5
+ } & import("@xyo-network/payload-model").PayloadFields> & import("@xyo-network/react-shared").ContextExState, "provided">;
6
+ //# sourceMappingURL=use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.d.ts","sourceRoot":"","sources":["../../../src/context/use.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY;;;;yHAAkF,CAAA"}
@@ -0,0 +1,22 @@
1
+ import type { ControlValueAccessorBaseEvents, FormControlStatus, ValidControlValue } from './accessor/index.ts';
2
+ import { ControlValueAccessorBase } from './accessor/index.ts';
3
+ export type AbstractControlEvents<TValue> = ControlValueAccessorBaseEvents<TValue> & {
4
+ statusChanged: {
5
+ status: FormControlStatus;
6
+ };
7
+ };
8
+ export declare class AbstractControl<TValue extends ValidControlValue = ValidControlValue> extends ControlValueAccessorBase<TValue, AbstractControlEvents<TValue>> {
9
+ private _status;
10
+ constructor();
11
+ get disabled(): boolean;
12
+ get enabled(): boolean;
13
+ get invalid(): boolean;
14
+ get pending(): boolean;
15
+ get rawValue(): TValue;
16
+ get status(): FormControlStatus | undefined;
17
+ get valid(): boolean;
18
+ setErrorAndValidity(error: string, status: FormControlStatus): void;
19
+ setStatus(status: FormControlStatus): void;
20
+ validate(): boolean;
21
+ }
22
+ //# sourceMappingURL=AbstractControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractControl.d.ts","sourceRoot":"","sources":["../../../src/control/AbstractControl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,wBAAwB,EAKzB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,MAAM,qBAAqB,CAAC,MAAM,IAAI,8BAA8B,CAAC,MAAM,CAAC,GAAG;IACnF,aAAa,EAAE;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAA;CAC7C,CAAA;AAaD,qBAAa,eAAe,CAAC,MAAM,SAAS,iBAAiB,GAAG,iBAAiB,CAAE,SAAQ,wBAAwB,CACjH,MAAM,EACN,qBAAqB,CAAC,MAAM,CAAC,CAC9B;IACC,OAAO,CAAC,OAAO,CAA2C;;IAgB1D,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAQD,IAAI,OAAO,IAAI,OAAO,CAErB;IASD,IAAI,OAAO,IAAI,OAAO,CAErB;IAQD,IAAI,OAAO,IAAI,OAAO,CAErB;IAKD,IAAI,QAAQ,IAAI,MAAM,CAErB;IAKD,IAAI,MAAM,kCAET;IAQD,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB;IAK5D,SAAS,CAAC,MAAM,EAAE,iBAAiB;IASnC,QAAQ,IAAI,OAAO;CAGpB"}
@@ -0,0 +1,25 @@
1
+ import type { EmptyObject } from '@xylabs/object';
2
+ import type { AbstractControl } from './AbstractControl.ts';
3
+ export type CursorPosition = {
4
+ current: number | undefined;
5
+ previous: number | undefined;
6
+ };
7
+ export interface FormControlValidator {
8
+ blurError?: (value: string) => void;
9
+ changeError?: (value: string) => void;
10
+ pattern?: RegExp;
11
+ patternStrict?: RegExp;
12
+ required?: boolean;
13
+ }
14
+ export interface FormControlMask {
15
+ cursorPosition: CursorPosition;
16
+ getCursorPosition?: () => number | undefined;
17
+ mask?: (value: string) => string;
18
+ onCursorChange?: (cursor: number | undefined) => void;
19
+ unmask?: (value: string) => string;
20
+ }
21
+ export interface FormControl<TProps extends EmptyObject = EmptyObject> extends FormControlValidator, FormControlMask, AbstractControl {
22
+ readonly name?: string;
23
+ props: TProps;
24
+ }
25
+ //# sourceMappingURL=FormControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormControl.d.ts","sourceRoot":"","sources":["../../../src/control/FormControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAErC,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,cAAc,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IAC5C,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAChC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IACrD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CACnC;AAED,MAAM,WAAW,WAAW,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,oBAAoB,EAAE,eAAe,EAAE,eAAe;IACnI,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd"}
@@ -0,0 +1,26 @@
1
+ import type { EmptyObject } from '@xylabs/object';
2
+ import { AbstractControl } from './AbstractControl.ts';
3
+ import type { SetOptions } from './accessor/index.ts';
4
+ import type { CursorPosition, FormControl } from './FormControl.ts';
5
+ export declare abstract class FormControlBase<TProps extends EmptyObject = EmptyObject> extends AbstractControl implements FormControl {
6
+ cursorPosition: CursorPosition;
7
+ invalidMessage: string;
8
+ pattern: RegExp;
9
+ patternStrict: RegExp;
10
+ props: TProps;
11
+ required: boolean;
12
+ private _name;
13
+ constructor();
14
+ get name(): string | undefined;
15
+ get rawValue(): import("./accessor/ValidControlValue.ts").ValidControlValue;
16
+ blurError?(value: string): void | undefined;
17
+ changeError?(value: string): void;
18
+ getCursorPosition?(): number | undefined;
19
+ mask?(value: string): string;
20
+ onCursorChange: (cursor: number | undefined) => void;
21
+ setValue(value: string | undefined, setOptions: SetOptions): void;
22
+ unmask?(value: string): string;
23
+ validate(): boolean;
24
+ protected setName(name: string | undefined): void;
25
+ }
26
+ //# sourceMappingURL=FormControlBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormControlBase.d.ts","sourceRoot":"","sources":["../../../src/control/FormControlBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAOnE,8BAAsB,eAAe,CAAC,MAAM,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,eAAgB,YAAW,WAAW;IAI5H,cAAc,EAAE,cAAc,CAA8C;IAE5E,cAAc,SAAkB;IAChC,OAAO,SAAgB;IACvB,aAAa,SAAgB;IAC7B,KAAK,EAAS,MAAM,CAAA;IACpB,QAAQ,UAAQ;IAEhB,OAAO,CAAC,KAAK,CAAgC;;IAM7C,IAAI,IAAI,uBAEP;IAED,IAAa,QAAQ,gEAEpB;IAED,SAAS,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAC3C,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IACjC,iBAAiB,CAAC,IAAI,MAAM,GAAG,SAAS;IACxC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAC5B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAW;IAEtD,QAAQ,CAAC,KAAK,EAAE,MAAM,YAAK,EAAE,UAAU,EAAE,UAAU;IA0B5D,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAGrB,QAAQ,IAAI,OAAO;IAQ5B,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;CAG3C"}
@@ -0,0 +1,21 @@
1
+ import type { ValidControlValue } from './ValidControlValue.ts';
2
+ export interface SetOptions {
3
+ disableEmit?: boolean;
4
+ }
5
+ export interface ControlSerializeSettings {
6
+ sensitive?: boolean;
7
+ serializable?: boolean;
8
+ }
9
+ export interface ControlValueAccessor<T = ValidControlValue> {
10
+ readonly error: string;
11
+ readonly previousValue: T;
12
+ readonly serializeSettings: ControlSerializeSettings;
13
+ readonly touched: boolean;
14
+ readonly value: T;
15
+ registerOnChange(fn: (value: T) => void): void;
16
+ registerOnErrorChange(fn: (error: string) => void): void;
17
+ registerOnTouched(fn: (isTouched: boolean) => void): void;
18
+ setTouched(isTouched: boolean): void;
19
+ setValue(fieldValue: T, options?: SetOptions): void;
20
+ }
21
+ //# sourceMappingURL=ControlValueAccessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlValueAccessor.d.ts","sourceRoot":"","sources":["../../../../src/control/accessor/ControlValueAccessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,iBAAiB;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAA;IACzB,QAAQ,CAAC,iBAAiB,EAAE,wBAAwB,CAAA;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACjB,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,CAAA;IAC9C,qBAAqB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAA;IACxD,iBAAiB,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAA;IACzD,UAAU,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAA;IACpC,QAAQ,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;CACpD"}
@@ -0,0 +1,45 @@
1
+ import type { BaseParams } from '@xylabs/object';
2
+ import { BaseEmitter } from '@xyo-network/module-abstract';
3
+ import type { ControlSerializeSettings, ControlValueAccessor, SetOptions } from './ControlValueAccessor.ts';
4
+ import type { ValidControlValue } from './ValidControlValue.ts';
5
+ export type ControlValueAccessorBaseConfig = {
6
+ disableEvents?: boolean;
7
+ };
8
+ export declare const DefaultSetOptions: SetOptions;
9
+ export type ControlValueAccessorBaseEvents<TValue = ValidControlValue> = {
10
+ errorChanged: {
11
+ error: string;
12
+ };
13
+ touchChanged: {
14
+ touched: boolean;
15
+ };
16
+ valueChanged: {
17
+ value: TValue;
18
+ };
19
+ };
20
+ export declare class ControlValueAccessorBase<TValue = ValidControlValue, TEventData extends ControlValueAccessorBaseEvents<TValue> = ControlValueAccessorBaseEvents<TValue>> extends BaseEmitter<BaseParams, TEventData> implements ControlValueAccessor<TValue> {
21
+ private config;
22
+ private _error;
23
+ private _previousValue;
24
+ private _serializeSettings;
25
+ private _touched;
26
+ private _value;
27
+ constructor(config: ControlValueAccessorBaseConfig);
28
+ get error(): string;
29
+ get previousValue(): TValue;
30
+ get serializeSettings(): ControlSerializeSettings;
31
+ get touched(): boolean;
32
+ get value(): TValue;
33
+ onChange: (_: TValue) => void;
34
+ onErrorChange: (error: string) => void;
35
+ onTouched: (_isTouched: boolean) => void;
36
+ registerOnChange(fn: (_value: TValue) => void): void;
37
+ registerOnErrorChange(fn: (error: string) => void): void;
38
+ registerOnTouched(fn: (isTouched: boolean) => void): void;
39
+ setTouched(isTouched: boolean): void;
40
+ setValue(value: TValue, options?: SetOptions): void;
41
+ protected setError(error: string): void;
42
+ protected setPreviousValue(value: TValue): void;
43
+ protected setSerializeSettings(settings: ControlSerializeSettings): void;
44
+ }
45
+ //# sourceMappingURL=ControlValueAccessorBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlValueAccessorBase.d.ts","sourceRoot":"","sources":["../../../../src/control/accessor/ControlValueAccessorBase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAE1D,OAAO,KAAK,EACV,wBAAwB,EAAE,oBAAoB,EAAE,UAAU,EAC3D,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,MAAM,MAAM,8BAA8B,GAAG;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,UAAmC,CAAA;AAEnE,MAAM,MAAM,8BAA8B,CAAC,MAAM,GAAG,iBAAiB,IAAI;IACvE,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC/B,YAAY,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAA;IAClC,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAChC,CAAA;AAKD,qBAAa,wBAAwB,CACnC,MAAM,GAAG,iBAAiB,EAC1B,UAAU,SAAS,8BAA8B,CAAC,MAAM,CAAC,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAElG,SAAQ,WAAW,CAAC,UAAU,EAAE,UAAU,CAC1C,YAAW,oBAAoB,CAAC,MAAM,CAAC;IAW3B,OAAO,CAAC,MAAM;IAV1B,OAAO,CAAC,MAAM,CAAa;IAE3B,OAAO,CAAC,cAAc,CAAsB;IAE5C,OAAO,CAAC,kBAAkB,CAAsE;IAEhG,OAAO,CAAC,QAAQ,CAAiB;IAEjC,OAAO,CAAC,MAAM,CAAsB;gBAEhB,MAAM,EAAE,8BAA8B;IAO1D,IAAI,KAAK,WAER;IAKD,IAAI,aAAa,WAEhB;IAKD,IAAI,iBAAiB,6BAEpB;IAKD,IAAI,OAAO,YAEV;IAKD,IAAI,KAAK,WAER;IAMD,QAAQ,MAAO,MAAM,UAAO;IAK5B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAW;IAKjD,SAAS,eAAgB,OAAO,UAAO;IAOvC,gBAAgB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAQpD,qBAAqB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IASjD,iBAAiB,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAQzD,UAAU,CAAC,SAAS,EAAE,OAAO;IAgB7B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,aAAoB,GAAG,IAAI;IAmB1D,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAgBhC,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ/C,SAAS,CAAC,oBAAoB,CAAC,QAAQ,EAAE,wBAAwB;CAGlE"}
@@ -0,0 +1,6 @@
1
+ export declare const VALID: "VALID";
2
+ export declare const INVALID: "INVALID";
3
+ export declare const PENDING: "PENDING";
4
+ export declare const DISABLED: "DISABLED";
5
+ export type FormControlStatus = typeof VALID | typeof INVALID | typeof PENDING | typeof DISABLED;
6
+ //# sourceMappingURL=FormControlStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormControlStatus.d.ts","sourceRoot":"","sources":["../../../../src/control/accessor/FormControlStatus.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,SAAmB,CAAA;AAKrC,eAAO,MAAM,OAAO,WAAqB,CAAA;AAMzC,eAAO,MAAM,OAAO,WAAqB,CAAA;AAMzC,eAAO,MAAM,QAAQ,YAAsB,CAAA;AAe3C,MAAM,MAAM,iBAAiB,GAAG,OAAO,KAAK,GAAG,OAAO,OAAO,GAAG,OAAO,OAAO,GAAG,OAAO,QAAQ,CAAA"}
@@ -0,0 +1,2 @@
1
+ export type ValidControlValue = string | undefined;
2
+ //# sourceMappingURL=ValidControlValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidControlValue.d.ts","sourceRoot":"","sources":["../../../../src/control/accessor/ValidControlValue.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './ControlValueAccessor.ts';
2
+ export * from './ControlValueAccessorBase.ts';
3
+ export * from './FormControlStatus.ts';
4
+ export * from './ValidControlValue.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/control/accessor/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './AbstractControl.ts';
2
+ export * from './accessor/index.ts';
3
+ export * from './FormControl.ts';
4
+ export * from './FormControlBase.ts';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/control/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA"}
@@ -1,228 +1,6 @@
1
- import * as react from 'react';
2
- import { PropsWithChildren } from 'react';
3
- import * as _xyo_network_react_shared from '@xyo-network/react-shared';
4
- import { ContextExState } from '@xyo-network/react-shared';
5
- import * as _xyo_network_payload_model from '@xyo-network/payload-model';
6
- import { Payload } from '@xyo-network/payload-model';
7
- import { BaseParams, EmptyObject } from '@xylabs/object';
8
- import { BaseEmitter } from '@xyo-network/module-abstract';
9
- import { Promisable } from '@xylabs/promise';
10
- import * as react_jsx_runtime from 'react/jsx-runtime';
11
- import { ArchivistInstance } from '@xyo-network/archivist-model';
12
-
13
- type ValidControlValue = string | undefined;
14
-
15
- interface SetOptions {
16
- disableEmit?: boolean;
17
- }
18
- interface ControlSerializeSettings {
19
- sensitive?: boolean;
20
- serializable?: boolean;
21
- }
22
- interface ControlValueAccessor<T = ValidControlValue> {
23
- readonly error: string;
24
- readonly previousValue: T;
25
- readonly serializeSettings: ControlSerializeSettings;
26
- readonly touched: boolean;
27
- readonly value: T;
28
- registerOnChange(fn: (value: T) => void): void;
29
- registerOnErrorChange(fn: (error: string) => void): void;
30
- registerOnTouched(fn: (isTouched: boolean) => void): void;
31
- setTouched(isTouched: boolean): void;
32
- setValue(fieldValue: T, options?: SetOptions): void;
33
- }
34
-
35
- type ControlValueAccessorBaseConfig = {
36
- disableEvents?: boolean;
37
- };
38
- declare const DefaultSetOptions: SetOptions;
39
- type ControlValueAccessorBaseEvents<TValue = ValidControlValue> = {
40
- errorChanged: {
41
- error: string;
42
- };
43
- touchChanged: {
44
- touched: boolean;
45
- };
46
- valueChanged: {
47
- value: TValue;
48
- };
49
- };
50
- declare class ControlValueAccessorBase<TValue = ValidControlValue, TEventData extends ControlValueAccessorBaseEvents<TValue> = ControlValueAccessorBaseEvents<TValue>> extends BaseEmitter<BaseParams, TEventData> implements ControlValueAccessor<TValue> {
51
- private config;
52
- private _error;
53
- private _previousValue;
54
- private _serializeSettings;
55
- private _touched;
56
- private _value;
57
- constructor(config: ControlValueAccessorBaseConfig);
58
- get error(): string;
59
- get previousValue(): TValue;
60
- get serializeSettings(): ControlSerializeSettings;
61
- get touched(): boolean;
62
- get value(): TValue;
63
- onChange: (_: TValue) => void;
64
- onErrorChange: (error: string) => void;
65
- onTouched: (_isTouched: boolean) => void;
66
- registerOnChange(fn: (_value: TValue) => void): void;
67
- registerOnErrorChange(fn: (error: string) => void): void;
68
- registerOnTouched(fn: (isTouched: boolean) => void): void;
69
- setTouched(isTouched: boolean): void;
70
- setValue(value: TValue, options?: SetOptions): void;
71
- protected setError(error: string): void;
72
- protected setPreviousValue(value: TValue): void;
73
- protected setSerializeSettings(settings: ControlSerializeSettings): void;
74
- }
75
-
76
- declare const VALID: "VALID";
77
- declare const INVALID: "INVALID";
78
- declare const PENDING: "PENDING";
79
- declare const DISABLED: "DISABLED";
80
- type FormControlStatus = typeof VALID | typeof INVALID | typeof PENDING | typeof DISABLED;
81
-
82
- type AbstractControlEvents<TValue> = ControlValueAccessorBaseEvents<TValue> & {
83
- statusChanged: {
84
- status: FormControlStatus;
85
- };
86
- };
87
- declare class AbstractControl<TValue extends ValidControlValue = ValidControlValue> extends ControlValueAccessorBase<TValue, AbstractControlEvents<TValue>> {
88
- private _status;
89
- constructor();
90
- get disabled(): boolean;
91
- get enabled(): boolean;
92
- get invalid(): boolean;
93
- get pending(): boolean;
94
- get rawValue(): TValue;
95
- get status(): FormControlStatus | undefined;
96
- get valid(): boolean;
97
- setErrorAndValidity(error: string, status: FormControlStatus): void;
98
- setStatus(status: FormControlStatus): void;
99
- validate(): boolean;
100
- }
101
-
102
- type CursorPosition = {
103
- current: number | undefined;
104
- previous: number | undefined;
105
- };
106
- interface FormControlValidator {
107
- blurError?: (value: string) => void;
108
- changeError?: (value: string) => void;
109
- pattern?: RegExp;
110
- patternStrict?: RegExp;
111
- required?: boolean;
112
- }
113
- interface FormControlMask {
114
- cursorPosition: CursorPosition;
115
- getCursorPosition?: () => number | undefined;
116
- mask?: (value: string) => string;
117
- onCursorChange?: (cursor: number | undefined) => void;
118
- unmask?: (value: string) => string;
119
- }
120
- interface FormControl<TProps extends EmptyObject = EmptyObject> extends FormControlValidator, FormControlMask, AbstractControl {
121
- readonly name?: string;
122
- props: TProps;
123
- }
124
-
125
- declare abstract class FormControlBase<TProps extends EmptyObject = EmptyObject> extends AbstractControl implements FormControl {
126
- cursorPosition: CursorPosition;
127
- invalidMessage: string;
128
- pattern: RegExp;
129
- patternStrict: RegExp;
130
- props: TProps;
131
- required: boolean;
132
- private _name;
133
- constructor();
134
- get name(): string | undefined;
135
- get rawValue(): ValidControlValue;
136
- blurError?(value: string): void | undefined;
137
- changeError?(value: string): void;
138
- getCursorPosition?(): number | undefined;
139
- mask?(value: string): string;
140
- onCursorChange: (cursor: number | undefined) => void;
141
- setValue(value: string | undefined, setOptions: SetOptions): void;
142
- unmask?(value: string): string;
143
- validate(): boolean;
144
- protected setName(name: string | undefined): void;
145
- }
146
-
147
- type ErrorSummary = {
148
- errorMessage: string;
149
- invalidFields: string[];
150
- };
151
-
152
- interface FormGroupStorage<TValue extends Payload = Payload> {
153
- clear: () => Promisable<void>;
154
- get: () => Promisable<TValue | undefined>;
155
- insert: (state: TValue) => Promisable<void>;
156
- }
157
-
158
- declare class ArchivistFormGroupStorage implements FormGroupStorage {
159
- private archivist;
160
- constructor(archivist: ArchivistInstance);
161
- clear(): Promise<void>;
162
- get(): Promise<_xyo_network_payload_model.WithMeta<{
163
- schema: string;
164
- } & _xyo_network_payload_model.PayloadFields> | undefined>;
165
- insert(value: Payload): Promise<void>;
166
- }
167
-
168
- type PayloadWithTimestamp = Payload<{
169
- timestamp?: number;
170
- }>;
171
- type KeyOfString<T> = keyof T extends string ? keyof T : never;
172
- type FormGroupErrors<TValue> = Record<KeyOfString<TValue>, string>;
173
- type FormGroupParams<TStorageValue extends Payload = Payload> = {
174
- serialize?: boolean;
175
- storage?: {
176
- sensitive?: FormGroupStorage<TStorageValue>;
177
- storage?: FormGroupStorage<TStorageValue>;
178
- };
179
- ttlStorage?: number;
180
- };
181
- declare class FormGroup<TValue extends PayloadWithTimestamp = PayloadWithTimestamp, TStorageValue extends PayloadWithTimestamp = PayloadWithTimestamp> extends AbstractControl {
182
- private fgParams?;
183
- private _controls;
184
- private serializeListeners;
185
- private serializedSensitiveState;
186
- private serializedState;
187
- constructor(fgParams?: FormGroupParams<TStorageValue> | undefined);
188
- get errorSummary(): ErrorSummary;
189
- get errors(): FormGroupErrors<TValue>;
190
- get nonSensitiveStorage(): FormGroupStorage<TStorageValue> | undefined;
191
- get sensitiveStorage(): FormGroupStorage<TStorageValue> | undefined;
192
- get touched(): boolean;
193
- get valid(): boolean;
194
- get values(): TValue;
195
- getControl(name: string): Record<KeyOfString<TValue>, AbstractControl<ValidControlValue>>[KeyOfString<TValue>];
196
- getSerializedValue(name: string, sensitive?: boolean): Promise<string | undefined>;
197
- registerControl(name: string, control: AbstractControl): void;
198
- resetControls(): void;
199
- resetValues(): void;
200
- unregisterControl(name: string): void;
201
- validateFields(requiredFields?: string[] | undefined): void;
202
- private serializeControlValue;
203
- private serializeValues;
204
- private setStateValueFromStorage;
205
- }
206
-
207
- interface FormGroupContextWithPayloadState<TValue extends Payload = Payload, TStorageValue extends Payload = Payload> extends ContextExState {
208
- formGroup?: FormGroup<TValue, TStorageValue>;
209
- }
210
-
211
- declare const FormGroupBaseContext: react.Context<FormGroupContextWithPayloadState<{
212
- schema: string;
213
- } & _xyo_network_payload_model.PayloadFields, {
214
- schema: string;
215
- } & _xyo_network_payload_model.PayloadFields> & _xyo_network_react_shared.ContextExState>;
216
-
217
- interface FormGroupPayloadProviderProps<TStorage extends Payload = Payload> extends PropsWithChildren {
218
- params?: FormGroupParams<TStorage>;
219
- }
220
- declare const FormGroupPayloadProvider: ({ children, params, ...props }: FormGroupPayloadProviderProps) => react_jsx_runtime.JSX.Element;
221
-
222
- declare const useFormGroup: (required?: boolean) => Omit<FormGroupContextWithPayloadState<{
223
- schema: string;
224
- } & _xyo_network_payload_model.PayloadFields, {
225
- schema: string;
226
- } & _xyo_network_payload_model.PayloadFields> & _xyo_network_react_shared.ContextExState, "provided">;
227
-
228
- export { AbstractControl, type AbstractControlEvents, ArchivistFormGroupStorage, type ControlSerializeSettings, type ControlValueAccessor, ControlValueAccessorBase, type ControlValueAccessorBaseConfig, type ControlValueAccessorBaseEvents, type CursorPosition, DISABLED, DefaultSetOptions, type ErrorSummary, type FormControl, FormControlBase, type FormControlMask, type FormControlStatus, type FormControlValidator, FormGroup, FormGroupBaseContext, type FormGroupContextWithPayloadState, type FormGroupParams, FormGroupPayloadProvider, type FormGroupPayloadProviderProps, type FormGroupStorage, INVALID, type KeyOfString, PENDING, type PayloadWithTimestamp, type SetOptions, VALID, type ValidControlValue, useFormGroup };
1
+ export * from './context/index.ts';
2
+ export * from './control/index.ts';
3
+ export * from './FormGroup.ts';
4
+ export * from './InputError.ts';
5
+ export * from './storage/index.ts';
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,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA"}
@@ -491,16 +491,16 @@ var FormGroupPayloadProvider = /* @__PURE__ */ __name(({ children, params, ...pr
491
491
  }, [
492
492
  params
493
493
  ]);
494
- return (
495
- // eslint-disable-next-line @eslint-react/no-unstable-context-value
496
- /* @__PURE__ */ React.createElement(FormGroupBaseContext.Provider, {
497
- value: {
498
- formGroup,
499
- provided: true
500
- },
501
- ...props
502
- }, children)
503
- );
494
+ const value = useMemo(() => ({
495
+ formGroup,
496
+ provided: true
497
+ }), [
498
+ formGroup
499
+ ]);
500
+ return /* @__PURE__ */ React.createElement(FormGroupBaseContext.Provider, {
501
+ value,
502
+ ...props
503
+ }, children);
504
504
  }, "FormGroupPayloadProvider");
505
505
 
506
506
  // src/context/use.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/context/Context.ts","../../src/context/Provider.tsx","../../src/FormGroup.ts","../../src/control/AbstractControl.ts","../../src/control/accessor/ControlValueAccessorBase.ts","../../src/control/accessor/FormControlStatus.ts","../../src/control/FormControlBase.ts","../../src/context/use.ts","../../src/storage/ArchivistFormGroupStorage.ts"],"sourcesContent":["import { createContextEx } from '@xyo-network/react-shared'\n\nimport { FormGroupContextWithPayloadState } from './State.ts'\n\nexport const FormGroupBaseContext = createContextEx<FormGroupContextWithPayloadState>()\n","import { Payload } from '@xyo-network/payload-model'\nimport React, { PropsWithChildren, useMemo } from 'react'\n\nimport { FormGroup, FormGroupParams } from '../FormGroup.ts'\nimport { FormGroupBaseContext } from './Context.ts'\n\nexport interface FormGroupPayloadProviderProps<TStorage extends Payload = Payload> extends PropsWithChildren {\n params?: FormGroupParams<TStorage>\n}\n\n/**\n * Provides a FormGroup to child components.\n */\nexport const FormGroupPayloadProvider = ({ children, params, ...props }: FormGroupPayloadProviderProps) => {\n const formGroup = useMemo(() => {\n const formGroup = new FormGroup<Payload, Payload>(params)\n return formGroup\n }, [params])\n\n return (\n // eslint-disable-next-line @eslint-react/no-unstable-context-value\n <FormGroupBaseContext.Provider value={{ formGroup, provided: true }} {...props}>\n {children}\n </FormGroupBaseContext.Provider>\n )\n}\n","import { forget } from '@xylabs/forget'\nimport { EventListener } from '@xyo-network/module-events'\nimport { Payload } from '@xyo-network/payload-model'\n\nimport { AbstractControl, ControlValueAccessorBaseEvents } from './control/index.ts'\nimport { ErrorSummary } from './InputError.ts'\nimport { FormGroupStorage } from './storage/index.ts'\n\nexport type PayloadWithTimestamp = Payload<{ timestamp?: number }>\n\nexport type KeyOfString<T> = keyof T extends string ? keyof T : never\n\ntype FormGroupErrors<TValue> = Record<KeyOfString<TValue>, string>\n\nexport type FormGroupParams<TStorageValue extends Payload = Payload> = {\n serialize?: boolean\n storage?: {\n sensitive?: FormGroupStorage<TStorageValue>\n storage?: FormGroupStorage<TStorageValue>\n }\n ttlStorage?: number\n}\n\ntype ValueChangeEventListener = EventListener<ControlValueAccessorBaseEvents['valueChanged']>\n\n/**\n * Organize form controls in a group.\n *\n * NOTE: This is a work in progress and only supports top level controls. Nested controls are not supported.\n */\nexport class FormGroup<\n TValue extends PayloadWithTimestamp = PayloadWithTimestamp,\n TStorageValue extends PayloadWithTimestamp = PayloadWithTimestamp,\n> extends AbstractControl {\n private _controls = {} as Record<KeyOfString<TValue>, AbstractControl>\n\n private serializeListeners: Record<string, ValueChangeEventListener> = {}\n\n private serializedSensitiveState = {} as Record<KeyOfString<TStorageValue>, string>\n private serializedState = {} as Record<KeyOfString<TStorageValue>, string>\n\n constructor(private fgParams?: FormGroupParams<TStorageValue>) {\n super()\n }\n\n get errorSummary() {\n const errorSummary: ErrorSummary = {\n errorMessage: '',\n invalidFields: [],\n }\n for (const [key, value] of Object.entries(this.errors)) {\n if (value) {\n errorSummary.errorMessage = `${errorSummary.errorMessage}, ${value}`\n errorSummary.invalidFields.push(key)\n }\n }\n\n return errorSummary\n }\n\n get errors(): FormGroupErrors<TValue> {\n const value = {} as FormGroupErrors<TValue>\n for (const key in this._controls) {\n const castKey = key as KeyOfString<TValue>\n value[castKey] = this._controls[castKey].error\n }\n return value\n }\n\n get nonSensitiveStorage() {\n return this.fgParams?.storage?.storage\n }\n\n get sensitiveStorage() {\n return this.fgParams?.storage?.sensitive\n }\n\n override get touched() {\n return Object.values<AbstractControl>(this._controls).some(control => control.touched)\n }\n\n override get valid() {\n return Object.values<AbstractControl>(this._controls).every(control => control.valid)\n }\n\n get values(): TValue {\n const value = {} as TValue\n for (const key in this._controls) {\n const castKey = key as KeyOfString<TValue>\n value[castKey] = this._controls[castKey].rawValue as TValue[KeyOfString<TValue>]\n }\n return value\n }\n\n getControl(name: string) {\n return this._controls[name as KeyOfString<TValue>]\n }\n\n async getSerializedValue(name: string, sensitive = false): Promise<string | undefined> {\n const storage = sensitive ? this.sensitiveStorage : this.nonSensitiveStorage\n if (storage) {\n if (!storage) {\n console.warn(`Cannot return value for ${name}. No storage set`)\n return\n }\n\n const savedState = await storage.get()\n if (savedState && name in savedState) {\n const savedValue = savedState[name as keyof typeof savedState] as string\n\n // casting to PayloadWithTimestamp to check for timestamp\n const savedStateWithTimestamp = savedState as unknown as PayloadWithTimestamp\n if (savedStateWithTimestamp.timestamp && this.fgParams?.ttlStorage) {\n const expirationDate = savedStateWithTimestamp.timestamp + (this.fgParams?.ttlStorage ?? 0)\n const now = Date.now()\n return now > expirationDate ? undefined : savedValue\n }\n return savedValue\n }\n }\n }\n\n registerControl(name: string, control: AbstractControl) {\n if (this._controls[name as KeyOfString<TValue>]) console.error(`Replacing Control with name ${name} since it already exists!`)\n this._controls[name as KeyOfString<TValue>] = control\n this.serializeControlValue(name, control)\n }\n\n resetControls() {\n for (const key in this._controls) {\n this.unregisterControl(key)\n }\n }\n\n resetValues() {\n for (const control of Object.values<AbstractControl>(this._controls)) {\n control.setValue('')\n }\n }\n\n unregisterControl(name: string) {\n const control = this._controls[name as KeyOfString<TValue>]\n\n if (control) {\n const listener = this.serializeListeners[name]\n control.off('valueChanged', listener)\n delete this.serializeListeners[name]\n delete this._controls[name as KeyOfString<TValue>]\n }\n }\n\n validateFields(requiredFields?: string[] | undefined) {\n const castRequiredFields = requiredFields as KeyOfString<TValue>[]\n for (const key in this._controls) {\n const castKey = key as KeyOfString<TValue>\n if (castRequiredFields === undefined || castRequiredFields.includes(castKey)) {\n const control = this._controls[castKey]\n control.validate()\n }\n }\n }\n\n private serializeControlValue(name: string, control: AbstractControl) {\n const shouldSerialize = this.fgParams?.serialize\n const sensitiveStorage = this.sensitiveStorage\n const storage = this.nonSensitiveStorage\n\n if (!shouldSerialize && (storage || sensitiveStorage)) console.warn('storage medium set but serialize is not enabled')\n\n if (shouldSerialize && control.serializeSettings.serializable) {\n this.setStateValueFromStorage(name, control)\n\n const listener: ValueChangeEventListener = ({ value }) => {\n // detect if control wants to be serialized\n if (control.serializeSettings.serializable) {\n // detect control's preferred storage\n const targetStorage = control.serializeSettings.sensitive ? sensitiveStorage : storage\n\n // detect control's preferred state\n const targetState = control.serializeSettings.sensitive ? this.serializedSensitiveState : this.serializedState\n\n // set the value\n targetState[name as KeyOfString<TStorageValue>] = value ?? ''\n\n // add a timestamp\n const payloadWithTimestamp = targetState as PayloadWithTimestamp\n payloadWithTimestamp.timestamp = Date.now()\n\n // serialize the value\n this.serializeValues(targetStorage, targetState as TStorageValue)\n }\n }\n\n // listen for value changes\n control.on('valueChanged', listener)\n\n // store the listener for later removal\n this.serializeListeners[name] = listener\n }\n }\n\n private serializeValues(storage?: FormGroupStorage<TStorageValue>, values?: TStorageValue) {\n if (storage && values) {\n const write = async () => await storage.insert(values)\n const clear = async () => await storage.clear()\n\n forget(clear())\n forget(write())\n }\n }\n\n private setStateValueFromStorage(name: string, control: AbstractControl) {\n const read = async () => {\n const savedValue = await this.getSerializedValue(name, control.serializeSettings.sensitive)\n\n if (savedValue) {\n const targetState = control.serializeSettings.sensitive ? this.serializedSensitiveState : this.serializedState\n targetState[name as KeyOfString<TStorageValue>] = savedValue\n\n control.setValue(savedValue, { disableEmit: true })\n }\n }\n\n forget(read())\n }\n}\n","import { forget } from '@xylabs/forget'\n\nimport {\n ControlValueAccessorBase,\n ControlValueAccessorBaseEvents,\n DISABLED,\n FormControlStatus,\n INVALID,\n PENDING,\n VALID,\n ValidControlValue,\n} from './accessor/index.ts'\n\nexport type AbstractControlEvents<TValue> = ControlValueAccessorBaseEvents<TValue> & {\n statusChanged: { status: FormControlStatus }\n}\n\n/**\n * This is the base class for `Control` classes (i.e. FormControl),\n *\n * It provides some of the shared behavior that all controls and groups of controls have, like\n * running validators, calculating status, and resetting state. It also defines the properties\n * that are shared between all sub-classes, like `value`, `valid`, and `dirty`. It shouldn't be\n * instantiated directly.\n *\n * NOTE: Heavily borrowed from Angular's AbstractControl:\n * https://github.com/angular/angular/blob/5dcdbfcba934a930468aec140a7183b034466bdf/packages/forms/src/model/abstract_model.ts\n */\nexport class AbstractControl<TValue extends ValidControlValue = ValidControlValue> extends ControlValueAccessorBase<\n TValue,\n AbstractControlEvents<TValue>\n> {\n private _status: FormControlStatus | undefined = undefined\n\n constructor() {\n super({})\n }\n\n /**\n * A control is `disabled` when its `status` is `DISABLED`.\n *\n * Disabled controls are exempt from validation checks and\n * are not included in the aggregate value of their ancestor\n * controls.\n *\n * @returns True if the control is disabled, false otherwise.\n */\n /** @deprecated - disabled functionality not implemented */\n get disabled(): boolean {\n return this.status === DISABLED\n }\n\n /**\n * A control is `enabled` as long as its `status` is not `DISABLED`.\n *\n * @returns True if the control has any status other than 'DISABLED',\n * false if the status is 'DISABLED'.\n */\n get enabled(): boolean {\n return this.status !== DISABLED\n }\n\n /**\n * A control is `invalid` when its `status` is `INVALID`.\n\n *\n * @returns True if this control has failed one or more of its validation checks,\n * false otherwise.\n */\n get invalid(): boolean {\n return this.status === INVALID\n }\n\n /**\n * A control is `pending` when its `status` is `PENDING`.\n *\n * @returns True if this control is in the process of conducting a validation check,\n * false otherwise.\n */\n get pending(): boolean {\n return this.status == PENDING\n }\n\n /**\n * The raw value of the control.\n */\n get rawValue(): TValue {\n return this.value\n }\n\n /**\n * The current status of the control.\n */\n get status() {\n return this._status\n }\n\n /**\n * A control is `valid` when its `status` is `VALID`.\n *\n * @returns True if the control has passed all of its validation tests,\n * false otherwise.\n */\n get valid(): boolean {\n return this.status === VALID\n }\n\n setErrorAndValidity(error: string, status: FormControlStatus) {\n this.setError(error)\n this.setStatus(status)\n }\n\n setStatus(status: FormControlStatus) {\n if (this._status === status) return\n\n this._status = status\n\n const emit = async () => await this.emit('statusChanged', { status })\n forget(emit())\n }\n\n validate(): boolean {\n return true\n }\n}\n","import { forget } from '@xylabs/forget'\nimport { BaseParams } from '@xylabs/object'\nimport { BaseEmitter } from '@xyo-network/module-abstract'\n\nimport { ControlSerializeSettings, ControlValueAccessor, SetOptions } from './ControlValueAccessor.ts'\nimport { ValidControlValue } from './ValidControlValue.ts'\n\nexport type ControlValueAccessorBaseConfig = {\n disableEvents?: boolean\n}\n\nexport const DefaultSetOptions: SetOptions = { disableEmit: false }\n\nexport type ControlValueAccessorBaseEvents<TValue = ValidControlValue> = {\n errorChanged: { error: string }\n touchChanged: { touched: boolean }\n valueChanged: { value: TValue }\n}\n\n/**\n * The base class for control value accessors interface\n */\nexport class ControlValueAccessorBase<\n TValue = ValidControlValue,\n TEventData extends ControlValueAccessorBaseEvents<TValue> = ControlValueAccessorBaseEvents<TValue>,\n>\n extends BaseEmitter<BaseParams, TEventData>\n implements ControlValueAccessor<TValue> {\n private _error: string = ''\n\n private _previousValue = undefined as TValue\n\n private _serializeSettings: ControlSerializeSettings = { sensitive: false, serializable: false }\n\n private _touched: boolean = false\n\n private _value = undefined as TValue\n\n constructor(private config: ControlValueAccessorBaseConfig) {\n super({})\n }\n\n /**\n * The error message for the control.\n */\n get error() {\n return this._error\n }\n\n /**\n * The \"previous value\" of the input element.\n */\n get previousValue() {\n return this._previousValue\n }\n\n /**\n * The serialize settings of the input element.\n */\n get serializeSettings() {\n return this._serializeSettings\n }\n\n /**\n * The \"touched\" state of the input element.\n */\n get touched() {\n return this._touched\n }\n\n /**\n * The current value of the input element.\n */\n get value() {\n return this._value\n }\n\n /**\n * The registered callback function called when a change or input event occurs on the input\n * element.\n */\n onChange = (_: TValue) => {}\n\n /**\n * Registers a function called when the control error changes.\n */\n onErrorChange: (error: string) => void = () => {}\n\n /**\n * The registered callback function called when a blur event occurs on the input element.\n */\n onTouched = (_isTouched: boolean) => {}\n\n /**\n * Registers a function called when the control value changes.\n * @param {(_value:ValidControlValue)=>void} fn\n * @returns void\n */\n registerOnChange(fn: (_value: TValue) => void): void {\n this.onChange = fn\n }\n\n /**\n * Registers a function called when the control error changes.\n * @param {(error:string)=>void} fn\n */\n registerOnErrorChange(fn: (error: string) => void) {\n this.onErrorChange = fn\n }\n\n /**\n * Registers a function called when the control is touched.\n * @param {(isTouched:boolean)=>void} fn\n * @returns void\n */\n registerOnTouched(fn: (isTouched: boolean) => void): void {\n this.onTouched = fn\n }\n\n /**\n * Sets the \"touched\" state of the input element.\n * @param {boolean} isTouched\n */\n setTouched(isTouched: boolean) {\n if (this.touched !== isTouched) {\n this._touched = isTouched\n this.onTouched(isTouched)\n\n if (this.config.disableEvents) return\n const emit = async () => await this.emit('touchChanged', { touched: isTouched })\n forget(emit())\n }\n }\n\n /**\n * Sets the \"value\" property on the input element.\n * @param {ValidControlValue} value\n * @returns void\n */\n setValue(value: TValue, options = DefaultSetOptions): void {\n this._previousValue = this._value\n\n const normalizedValue = value == null ? ('' as TValue) : value\n\n if (this.value !== normalizedValue) {\n this._value = normalizedValue\n this.onChange(normalizedValue)\n\n if (this.config.disableEvents || options.disableEmit) return\n const emit = async () => await this.emit('valueChanged', { value: normalizedValue })\n forget(emit())\n }\n }\n\n /**\n * Set the error message for the control.\n * @param {string} error\n */\n protected setError(error: string) {\n if (this.error !== error) {\n this._error = error\n this.onErrorChange(error)\n\n if (this.config.disableEvents) return\n const emit = async () => await this.emit('errorChanged', { error })\n forget(emit())\n }\n }\n\n /**\n * Sets the \"previous value\" of the input element.\n * @param {ValidControlValue} value\n * @returns void\n */\n protected setPreviousValue(value: TValue): void {\n this._previousValue = value\n }\n\n /**\n * Sets the serialize settings of the input element.\n * @param {ControlSerializeSettings} settings\n */\n protected setSerializeSettings(settings: ControlSerializeSettings) {\n this._serializeSettings = settings\n }\n}\n","/**\n * Reports that a control is valid, meaning that no errors exist in the input value.\n */\nexport const VALID = 'VALID' as const\n\n/**\n * Reports that a control is invalid, meaning that an error exists in the input value.\n */\nexport const INVALID = 'INVALID' as const\n\n/**\n * Reports that a control is pending, meaning that async validation is occurring and\n * errors are not yet available for the input value.\n */\nexport const PENDING = 'PENDING' as const\n\n/**\n * Reports that a control is disabled, meaning that the control is exempt from ancestor\n * calculations of validity or value.\n */\nexport const DISABLED = 'DISABLED' as const\n\n/**\n * A control can have several different statuses. Each\n * possible status is returned as a string literal.\n *\n * * **VALID**: Reports that a control is valid, meaning that no errors exist in the input\n * value.\n * * **INVALID**: Reports that a control is invalid, meaning that an error exists in the input\n * value.\n * * **PENDING**: Reports that a control is pending, meaning that async validation is\n * occurring and errors are not yet available for the input value.\n * * **DISABLED**: Reports that a control is\n * disabled, meaning that the control is exempt from ancestor calculations of validity or value.\n */\nexport type FormControlStatus = typeof VALID | typeof INVALID | typeof PENDING | typeof DISABLED\n","import { EmptyObject } from '@xylabs/object'\n\nimport { AbstractControl } from './AbstractControl.ts'\nimport { SetOptions } from './accessor/index.ts'\nimport { CursorPosition, FormControl } from './FormControl.ts'\n\nconst AllowAllRegex = /^.*$/s\n\n/**\n * A base class for form controls and their validation.\n */\nexport abstract class FormControlBase<TProps extends EmptyObject = EmptyObject> extends AbstractControl implements FormControl {\n /**\n * The current and previous cursor position of the input element.\n */\n cursorPosition: CursorPosition = { current: undefined, previous: undefined }\n invalidMessage = 'Invalid input'\n pattern = AllowAllRegex\n patternStrict = AllowAllRegex\n props = {} as TProps\n required = false\n\n private _name: string | undefined = undefined\n\n constructor() {\n super()\n }\n\n get name() {\n return this._name\n }\n\n override get rawValue() {\n return this.unmask && this.value ? this.unmask(this.value) : this.value\n }\n\n blurError?(value: string): void | undefined\n changeError?(value: string): void\n getCursorPosition?(): number | undefined\n mask?(value: string): string\n onCursorChange: (cursor: number | undefined) => void = () => {}\n\n override setValue(value: string = '', setOptions: SetOptions) {\n // check for pattern validation\n if (this.unmask && this.pattern) {\n const unmasked = this.unmask(value)\n const match = unmasked.match(this.pattern)\n // set the new value before checking for errors\n super.setValue(this.mask ? this.mask(unmasked) : unmasked, setOptions)\n if (match) {\n // if the value matches the pattern, update the cursor position\n if (this.getCursorPosition) {\n const newCursor = this.getCursorPosition()\n this.onCursorChange(newCursor)\n }\n } else {\n // if no match, set the error and return to the previous value\n this.setValue(this.previousValue, setOptions)\n this.onCursorChange?.(this.cursorPosition.previous)\n }\n } else {\n // if no mask or pattern, just set the value\n super.setValue(value, setOptions)\n }\n // check for changeError validation after pattern validation\n this.changeError?.(value)\n }\n\n unmask?(value: string): string\n\n // For FormControls, validate is the same as running one of the error checking functions\n override validate(): boolean {\n const normalizedValue = this.value ?? ''\n // prefer the blurError function since validation assumes the user is done typing\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n this.blurError ? this.blurError(normalizedValue) : this.changeError?.(normalizedValue)\n return !this.error\n }\n\n protected setName(name: string | undefined) {\n this._name = name\n }\n}\n","import { useContextEx } from '@xyo-network/react-shared'\n\nimport { FormGroupBaseContext } from './Context.ts'\n\nexport const useFormGroup = (required = false) => useContextEx(FormGroupBaseContext, 'FormGroup', required)\n","import { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { Payload } from '@xyo-network/payload-model'\n\nimport { FormGroupStorage } from './FormGroupStorage.ts'\n\nexport class ArchivistFormGroupStorage implements FormGroupStorage {\n constructor(private archivist: ArchivistInstance) {}\n\n async clear() {\n await this.archivist.clear?.()\n }\n\n async get() {\n const all = await this.archivist.all?.()\n return all.at(-1)\n }\n\n async insert(value: Payload) {\n await this.archivist.insert?.([value])\n }\n}\n"],"mappings":"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","names":["createContextEx","FormGroupBaseContext","React","useMemo","forget","forget","forget","BaseEmitter","DefaultSetOptions","disableEmit","ControlValueAccessorBase","BaseEmitter","_error","_previousValue","_serializeSettings","_touched","_value","constructor","config","undefined","sensitive","serializable","onChange","_","onErrorChange","onTouched","_isTouched","error","previousValue","serializeSettings","touched","value","registerOnChange","fn","registerOnErrorChange","registerOnTouched","setTouched","isTouched","disableEvents","emit","forget","setValue","options","normalizedValue","setError","setPreviousValue","setSerializeSettings","settings","VALID","INVALID","PENDING","DISABLED","AbstractControl","ControlValueAccessorBase","_status","undefined","constructor","disabled","status","DISABLED","enabled","invalid","INVALID","pending","PENDING","rawValue","value","valid","VALID","setErrorAndValidity","error","setError","setStatus","emit","forget","validate","AllowAllRegex","FormControlBase","AbstractControl","cursorPosition","current","undefined","previous","invalidMessage","pattern","patternStrict","props","required","_name","constructor","name","rawValue","unmask","value","onCursorChange","setValue","setOptions","unmasked","match","mask","getCursorPosition","newCursor","previousValue","changeError","validate","normalizedValue","blurError","error","setName","FormGroup","AbstractControl","_controls","serializeListeners","serializedSensitiveState","serializedState","constructor","fgParams","errorSummary","errorMessage","invalidFields","key","value","Object","entries","errors","push","castKey","error","nonSensitiveStorage","storage","sensitiveStorage","sensitive","touched","values","some","control","valid","every","rawValue","getControl","name","getSerializedValue","console","warn","savedState","get","savedValue","savedStateWithTimestamp","timestamp","ttlStorage","expirationDate","now","Date","undefined","registerControl","serializeControlValue","resetControls","unregisterControl","resetValues","setValue","listener","off","validateFields","requiredFields","castRequiredFields","includes","validate","shouldSerialize","serialize","serializeSettings","serializable","setStateValueFromStorage","targetStorage","targetState","payloadWithTimestamp","serializeValues","on","write","insert","clear","forget","read","disableEmit","FormGroupPayloadProvider","children","params","props","formGroup","useMemo","FormGroup","FormGroupBaseContext","Provider","value","provided","useContextEx","useFormGroup","required","useContextEx","FormGroupBaseContext","ArchivistFormGroupStorage","constructor","archivist","clear","get","all","at","insert","value"]}
1
+ {"version":3,"sources":["../../src/context/Context.ts","../../src/context/Provider.tsx","../../src/FormGroup.ts","../../src/control/AbstractControl.ts","../../src/control/accessor/ControlValueAccessorBase.ts","../../src/control/accessor/FormControlStatus.ts","../../src/control/FormControlBase.ts","../../src/context/use.ts","../../src/storage/ArchivistFormGroupStorage.ts"],"sourcesContent":["import { createContextEx } from '@xyo-network/react-shared'\n\nimport type { FormGroupContextWithPayloadState } from './State.ts'\n\nexport const FormGroupBaseContext = createContextEx<FormGroupContextWithPayloadState>()\n","import type { Payload } from '@xyo-network/payload-model'\nimport type { PropsWithChildren } from 'react'\nimport React, { useMemo } from 'react'\n\nimport type { FormGroupParams } from '../FormGroup.ts'\nimport { FormGroup } from '../FormGroup.ts'\nimport { FormGroupBaseContext } from './Context.ts'\n\nexport interface FormGroupPayloadProviderProps<TStorage extends Payload = Payload> extends PropsWithChildren {\n params?: FormGroupParams<TStorage>\n}\n\n/**\n * Provides a FormGroup to child components.\n */\nexport const FormGroupPayloadProvider = ({\n children, params, ...props\n}: FormGroupPayloadProviderProps) => {\n const formGroup = useMemo(() => {\n const formGroup = new FormGroup<Payload, Payload>(params)\n return formGroup\n }, [params])\n\n const value = useMemo(() => ({ formGroup, provided: true }), [formGroup])\n\n return (\n\n <FormGroupBaseContext.Provider\n value={value}\n {...props}\n >\n {children}\n </FormGroupBaseContext.Provider>\n )\n}\n","import { forget } from '@xylabs/forget'\nimport type { EventListener } from '@xyo-network/module-events'\nimport type { Payload } from '@xyo-network/payload-model'\n\nimport type { ControlValueAccessorBaseEvents } from './control/index.ts'\nimport { AbstractControl } from './control/index.ts'\nimport type { ErrorSummary } from './InputError.ts'\nimport type { FormGroupStorage } from './storage/index.ts'\n\nexport type PayloadWithTimestamp = Payload<{ timestamp?: number }>\n\nexport type KeyOfString<T> = keyof T extends string ? keyof T : never\n\ntype FormGroupErrors<TValue> = Record<KeyOfString<TValue>, string>\n\nexport type FormGroupParams<TStorageValue extends Payload = Payload> = {\n serialize?: boolean\n storage?: {\n sensitive?: FormGroupStorage<TStorageValue>\n storage?: FormGroupStorage<TStorageValue>\n }\n ttlStorage?: number\n}\n\ntype ValueChangeEventListener = EventListener<ControlValueAccessorBaseEvents['valueChanged']>\n\n/**\n * Organize form controls in a group.\n *\n * NOTE: This is a work in progress and only supports top level controls. Nested controls are not supported.\n */\nexport class FormGroup<\n TValue extends PayloadWithTimestamp = PayloadWithTimestamp,\n TStorageValue extends PayloadWithTimestamp = PayloadWithTimestamp,\n> extends AbstractControl {\n private _controls = {} as Record<KeyOfString<TValue>, AbstractControl>\n\n private serializeListeners: Record<string, ValueChangeEventListener> = {}\n\n private serializedSensitiveState = {} as Record<KeyOfString<TStorageValue>, string>\n private serializedState = {} as Record<KeyOfString<TStorageValue>, string>\n\n constructor(private fgParams?: FormGroupParams<TStorageValue>) {\n super()\n }\n\n get errorSummary() {\n const errorSummary: ErrorSummary = {\n errorMessage: '',\n invalidFields: [],\n }\n for (const [key, value] of Object.entries(this.errors)) {\n if (value) {\n errorSummary.errorMessage = `${errorSummary.errorMessage}, ${value}`\n errorSummary.invalidFields.push(key)\n }\n }\n\n return errorSummary\n }\n\n get errors(): FormGroupErrors<TValue> {\n const value = {} as FormGroupErrors<TValue>\n for (const key in this._controls) {\n const castKey = key as KeyOfString<TValue>\n value[castKey] = this._controls[castKey].error\n }\n return value\n }\n\n get nonSensitiveStorage() {\n return this.fgParams?.storage?.storage\n }\n\n get sensitiveStorage() {\n return this.fgParams?.storage?.sensitive\n }\n\n override get touched() {\n return Object.values<AbstractControl>(this._controls).some(control => control.touched)\n }\n\n override get valid() {\n return Object.values<AbstractControl>(this._controls).every(control => control.valid)\n }\n\n get values(): TValue {\n const value = {} as TValue\n for (const key in this._controls) {\n const castKey = key as KeyOfString<TValue>\n value[castKey] = this._controls[castKey].rawValue as TValue[KeyOfString<TValue>]\n }\n return value\n }\n\n getControl(name: string) {\n return this._controls[name as KeyOfString<TValue>]\n }\n\n async getSerializedValue(name: string, sensitive = false): Promise<string | undefined> {\n const storage = sensitive ? this.sensitiveStorage : this.nonSensitiveStorage\n if (storage) {\n if (!storage) {\n console.warn(`Cannot return value for ${name}. No storage set`)\n return\n }\n\n const savedState = await storage.get()\n if (savedState && name in savedState) {\n const savedValue = savedState[name as keyof typeof savedState] as string\n\n // casting to PayloadWithTimestamp to check for timestamp\n const savedStateWithTimestamp = savedState as unknown as PayloadWithTimestamp\n if (savedStateWithTimestamp.timestamp && this.fgParams?.ttlStorage) {\n const expirationDate = savedStateWithTimestamp.timestamp + (this.fgParams?.ttlStorage ?? 0)\n const now = Date.now()\n return now > expirationDate ? undefined : savedValue\n }\n return savedValue\n }\n }\n }\n\n registerControl(name: string, control: AbstractControl) {\n if (this._controls[name as KeyOfString<TValue>]) console.error(`Replacing Control with name ${name} since it already exists!`)\n this._controls[name as KeyOfString<TValue>] = control\n this.serializeControlValue(name, control)\n }\n\n resetControls() {\n for (const key in this._controls) {\n this.unregisterControl(key)\n }\n }\n\n resetValues() {\n for (const control of Object.values<AbstractControl>(this._controls)) {\n control.setValue('')\n }\n }\n\n unregisterControl(name: string) {\n const control = this._controls[name as KeyOfString<TValue>]\n\n if (control) {\n const listener = this.serializeListeners[name]\n control.off('valueChanged', listener)\n delete this.serializeListeners[name]\n delete this._controls[name as KeyOfString<TValue>]\n }\n }\n\n validateFields(requiredFields?: string[] | undefined) {\n const castRequiredFields = requiredFields as KeyOfString<TValue>[]\n for (const key in this._controls) {\n const castKey = key as KeyOfString<TValue>\n if (castRequiredFields === undefined || castRequiredFields.includes(castKey)) {\n const control = this._controls[castKey]\n control.validate()\n }\n }\n }\n\n private serializeControlValue(name: string, control: AbstractControl) {\n const shouldSerialize = this.fgParams?.serialize\n const sensitiveStorage = this.sensitiveStorage\n const storage = this.nonSensitiveStorage\n\n if (!shouldSerialize && (storage || sensitiveStorage)) console.warn('storage medium set but serialize is not enabled')\n\n if (shouldSerialize && control.serializeSettings.serializable) {\n this.setStateValueFromStorage(name, control)\n\n const listener: ValueChangeEventListener = ({ value }) => {\n // detect if control wants to be serialized\n if (control.serializeSettings.serializable) {\n // detect control's preferred storage\n const targetStorage = control.serializeSettings.sensitive ? sensitiveStorage : storage\n\n // detect control's preferred state\n const targetState = control.serializeSettings.sensitive ? this.serializedSensitiveState : this.serializedState\n\n // set the value\n targetState[name as KeyOfString<TStorageValue>] = value ?? ''\n\n // add a timestamp\n const payloadWithTimestamp = targetState as PayloadWithTimestamp\n payloadWithTimestamp.timestamp = Date.now()\n\n // serialize the value\n this.serializeValues(targetStorage, targetState as TStorageValue)\n }\n }\n\n // listen for value changes\n control.on('valueChanged', listener)\n\n // store the listener for later removal\n this.serializeListeners[name] = listener\n }\n }\n\n private serializeValues(storage?: FormGroupStorage<TStorageValue>, values?: TStorageValue) {\n if (storage && values) {\n const write = async () => await storage.insert(values)\n const clear = async () => await storage.clear()\n\n forget(clear())\n forget(write())\n }\n }\n\n private setStateValueFromStorage(name: string, control: AbstractControl) {\n const read = async () => {\n const savedValue = await this.getSerializedValue(name, control.serializeSettings.sensitive)\n\n if (savedValue) {\n const targetState = control.serializeSettings.sensitive ? this.serializedSensitiveState : this.serializedState\n targetState[name as KeyOfString<TStorageValue>] = savedValue\n\n control.setValue(savedValue, { disableEmit: true })\n }\n }\n\n forget(read())\n }\n}\n","import { forget } from '@xylabs/forget'\n\nimport type {\n ControlValueAccessorBaseEvents,\n FormControlStatus,\n ValidControlValue,\n} from './accessor/index.ts'\nimport {\n ControlValueAccessorBase,\n DISABLED,\n INVALID,\n PENDING,\n VALID,\n} from './accessor/index.ts'\n\nexport type AbstractControlEvents<TValue> = ControlValueAccessorBaseEvents<TValue> & {\n statusChanged: { status: FormControlStatus }\n}\n\n/**\n * This is the base class for `Control` classes (i.e. FormControl),\n *\n * It provides some of the shared behavior that all controls and groups of controls have, like\n * running validators, calculating status, and resetting state. It also defines the properties\n * that are shared between all sub-classes, like `value`, `valid`, and `dirty`. It shouldn't be\n * instantiated directly.\n *\n * NOTE: Heavily borrowed from Angular's AbstractControl:\n * https://github.com/angular/angular/blob/5dcdbfcba934a930468aec140a7183b034466bdf/packages/forms/src/model/abstract_model.ts\n */\nexport class AbstractControl<TValue extends ValidControlValue = ValidControlValue> extends ControlValueAccessorBase<\n TValue,\n AbstractControlEvents<TValue>\n> {\n private _status: FormControlStatus | undefined = undefined\n\n constructor() {\n super({})\n }\n\n /**\n * A control is `disabled` when its `status` is `DISABLED`.\n *\n * Disabled controls are exempt from validation checks and\n * are not included in the aggregate value of their ancestor\n * controls.\n *\n * @returns True if the control is disabled, false otherwise.\n */\n /** @deprecated - disabled functionality not implemented */\n get disabled(): boolean {\n return this.status === DISABLED\n }\n\n /**\n * A control is `enabled` as long as its `status` is not `DISABLED`.\n *\n * @returns True if the control has any status other than 'DISABLED',\n * false if the status is 'DISABLED'.\n */\n get enabled(): boolean {\n return this.status !== DISABLED\n }\n\n /**\n * A control is `invalid` when its `status` is `INVALID`.\n\n *\n * @returns True if this control has failed one or more of its validation checks,\n * false otherwise.\n */\n get invalid(): boolean {\n return this.status === INVALID\n }\n\n /**\n * A control is `pending` when its `status` is `PENDING`.\n *\n * @returns True if this control is in the process of conducting a validation check,\n * false otherwise.\n */\n get pending(): boolean {\n return this.status == PENDING\n }\n\n /**\n * The raw value of the control.\n */\n get rawValue(): TValue {\n return this.value\n }\n\n /**\n * The current status of the control.\n */\n get status() {\n return this._status\n }\n\n /**\n * A control is `valid` when its `status` is `VALID`.\n *\n * @returns True if the control has passed all of its validation tests,\n * false otherwise.\n */\n get valid(): boolean {\n return this.status === VALID\n }\n\n setErrorAndValidity(error: string, status: FormControlStatus) {\n this.setError(error)\n this.setStatus(status)\n }\n\n setStatus(status: FormControlStatus) {\n if (this._status === status) return\n\n this._status = status\n\n const emit = async () => await this.emit('statusChanged', { status })\n forget(emit())\n }\n\n validate(): boolean {\n return true\n }\n}\n","import { forget } from '@xylabs/forget'\nimport type { BaseParams } from '@xylabs/object'\nimport { BaseEmitter } from '@xyo-network/module-abstract'\n\nimport type {\n ControlSerializeSettings, ControlValueAccessor, SetOptions,\n} from './ControlValueAccessor.ts'\nimport type { ValidControlValue } from './ValidControlValue.ts'\n\nexport type ControlValueAccessorBaseConfig = {\n disableEvents?: boolean\n}\n\nexport const DefaultSetOptions: SetOptions = { disableEmit: false }\n\nexport type ControlValueAccessorBaseEvents<TValue = ValidControlValue> = {\n errorChanged: { error: string }\n touchChanged: { touched: boolean }\n valueChanged: { value: TValue }\n}\n\n/**\n * The base class for control value accessors interface\n */\nexport class ControlValueAccessorBase<\n TValue = ValidControlValue,\n TEventData extends ControlValueAccessorBaseEvents<TValue> = ControlValueAccessorBaseEvents<TValue>,\n>\n extends BaseEmitter<BaseParams, TEventData>\n implements ControlValueAccessor<TValue> {\n private _error: string = ''\n\n private _previousValue = undefined as TValue\n\n private _serializeSettings: ControlSerializeSettings = { sensitive: false, serializable: false }\n\n private _touched: boolean = false\n\n private _value = undefined as TValue\n\n constructor(private config: ControlValueAccessorBaseConfig) {\n super({})\n }\n\n /**\n * The error message for the control.\n */\n get error() {\n return this._error\n }\n\n /**\n * The \"previous value\" of the input element.\n */\n get previousValue() {\n return this._previousValue\n }\n\n /**\n * The serialize settings of the input element.\n */\n get serializeSettings() {\n return this._serializeSettings\n }\n\n /**\n * The \"touched\" state of the input element.\n */\n get touched() {\n return this._touched\n }\n\n /**\n * The current value of the input element.\n */\n get value() {\n return this._value\n }\n\n /**\n * The registered callback function called when a change or input event occurs on the input\n * element.\n */\n onChange = (_: TValue) => {}\n\n /**\n * Registers a function called when the control error changes.\n */\n onErrorChange: (error: string) => void = () => {}\n\n /**\n * The registered callback function called when a blur event occurs on the input element.\n */\n onTouched = (_isTouched: boolean) => {}\n\n /**\n * Registers a function called when the control value changes.\n * @param {(_value:ValidControlValue)=>void} fn\n * @returns void\n */\n registerOnChange(fn: (_value: TValue) => void): void {\n this.onChange = fn\n }\n\n /**\n * Registers a function called when the control error changes.\n * @param {(error:string)=>void} fn\n */\n registerOnErrorChange(fn: (error: string) => void) {\n this.onErrorChange = fn\n }\n\n /**\n * Registers a function called when the control is touched.\n * @param {(isTouched:boolean)=>void} fn\n * @returns void\n */\n registerOnTouched(fn: (isTouched: boolean) => void): void {\n this.onTouched = fn\n }\n\n /**\n * Sets the \"touched\" state of the input element.\n * @param {boolean} isTouched\n */\n setTouched(isTouched: boolean) {\n if (this.touched !== isTouched) {\n this._touched = isTouched\n this.onTouched(isTouched)\n\n if (this.config.disableEvents) return\n const emit = async () => await this.emit('touchChanged', { touched: isTouched })\n forget(emit())\n }\n }\n\n /**\n * Sets the \"value\" property on the input element.\n * @param {ValidControlValue} value\n * @returns void\n */\n setValue(value: TValue, options = DefaultSetOptions): void {\n this._previousValue = this._value\n\n const normalizedValue = value == null ? ('' as TValue) : value\n\n if (this.value !== normalizedValue) {\n this._value = normalizedValue\n this.onChange(normalizedValue)\n\n if (this.config.disableEvents || options.disableEmit) return\n const emit = async () => await this.emit('valueChanged', { value: normalizedValue })\n forget(emit())\n }\n }\n\n /**\n * Set the error message for the control.\n * @param {string} error\n */\n protected setError(error: string) {\n if (this.error !== error) {\n this._error = error\n this.onErrorChange(error)\n\n if (this.config.disableEvents) return\n const emit = async () => await this.emit('errorChanged', { error })\n forget(emit())\n }\n }\n\n /**\n * Sets the \"previous value\" of the input element.\n * @param {ValidControlValue} value\n * @returns void\n */\n protected setPreviousValue(value: TValue): void {\n this._previousValue = value\n }\n\n /**\n * Sets the serialize settings of the input element.\n * @param {ControlSerializeSettings} settings\n */\n protected setSerializeSettings(settings: ControlSerializeSettings) {\n this._serializeSettings = settings\n }\n}\n","/**\n * Reports that a control is valid, meaning that no errors exist in the input value.\n */\nexport const VALID = 'VALID' as const\n\n/**\n * Reports that a control is invalid, meaning that an error exists in the input value.\n */\nexport const INVALID = 'INVALID' as const\n\n/**\n * Reports that a control is pending, meaning that async validation is occurring and\n * errors are not yet available for the input value.\n */\nexport const PENDING = 'PENDING' as const\n\n/**\n * Reports that a control is disabled, meaning that the control is exempt from ancestor\n * calculations of validity or value.\n */\nexport const DISABLED = 'DISABLED' as const\n\n/**\n * A control can have several different statuses. Each\n * possible status is returned as a string literal.\n *\n * * **VALID**: Reports that a control is valid, meaning that no errors exist in the input\n * value.\n * * **INVALID**: Reports that a control is invalid, meaning that an error exists in the input\n * value.\n * * **PENDING**: Reports that a control is pending, meaning that async validation is\n * occurring and errors are not yet available for the input value.\n * * **DISABLED**: Reports that a control is\n * disabled, meaning that the control is exempt from ancestor calculations of validity or value.\n */\nexport type FormControlStatus = typeof VALID | typeof INVALID | typeof PENDING | typeof DISABLED\n","import type { EmptyObject } from '@xylabs/object'\n\nimport { AbstractControl } from './AbstractControl.ts'\nimport type { SetOptions } from './accessor/index.ts'\nimport type { CursorPosition, FormControl } from './FormControl.ts'\n\nconst AllowAllRegex = /^.*$/s\n\n/**\n * A base class for form controls and their validation.\n */\nexport abstract class FormControlBase<TProps extends EmptyObject = EmptyObject> extends AbstractControl implements FormControl {\n /**\n * The current and previous cursor position of the input element.\n */\n cursorPosition: CursorPosition = { current: undefined, previous: undefined }\n\n invalidMessage = 'Invalid input'\n pattern = AllowAllRegex\n patternStrict = AllowAllRegex\n props = {} as TProps\n required = false\n\n private _name: string | undefined = undefined\n\n constructor() {\n super()\n }\n\n get name() {\n return this._name\n }\n\n override get rawValue() {\n return this.unmask && this.value ? this.unmask(this.value) : this.value\n }\n\n blurError?(value: string): void | undefined\n changeError?(value: string): void\n getCursorPosition?(): number | undefined\n mask?(value: string): string\n onCursorChange: (cursor: number | undefined) => void = () => {}\n\n override setValue(value: string = '', setOptions: SetOptions) {\n // check for pattern validation\n if (this.unmask && this.pattern) {\n const unmasked = this.unmask(value)\n const match = unmasked.match(this.pattern)\n // set the new value before checking for errors\n super.setValue(this.mask ? this.mask(unmasked) : unmasked, setOptions)\n if (match) {\n // if the value matches the pattern, update the cursor position\n if (this.getCursorPosition) {\n const newCursor = this.getCursorPosition()\n this.onCursorChange(newCursor)\n }\n } else {\n // if no match, set the error and return to the previous value\n this.setValue(this.previousValue, setOptions)\n this.onCursorChange?.(this.cursorPosition.previous)\n }\n } else {\n // if no mask or pattern, just set the value\n super.setValue(value, setOptions)\n }\n // check for changeError validation after pattern validation\n this.changeError?.(value)\n }\n\n unmask?(value: string): string\n\n // For FormControls, validate is the same as running one of the error checking functions\n override validate(): boolean {\n const normalizedValue = this.value ?? ''\n // prefer the blurError function since validation assumes the user is done typing\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n this.blurError ? this.blurError(normalizedValue) : this.changeError?.(normalizedValue)\n return !this.error\n }\n\n protected setName(name: string | undefined) {\n this._name = name\n }\n}\n","import { useContextEx } from '@xyo-network/react-shared'\n\nimport { FormGroupBaseContext } from './Context.ts'\n\nexport const useFormGroup = (required = false) => useContextEx(FormGroupBaseContext, 'FormGroup', required)\n","import type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { Payload } from '@xyo-network/payload-model'\n\nimport type { FormGroupStorage } from './FormGroupStorage.ts'\n\nexport class ArchivistFormGroupStorage implements FormGroupStorage {\n constructor(private archivist: ArchivistInstance) {}\n\n async clear() {\n await this.archivist.clear?.()\n }\n\n async get() {\n const all = await this.archivist.all?.()\n return all.at(-1)\n }\n\n async insert(value: Payload) {\n await this.archivist.insert?.([value])\n }\n}\n"],"mappings":"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","names":["createContextEx","FormGroupBaseContext","React","useMemo","forget","forget","forget","BaseEmitter","DefaultSetOptions","disableEmit","ControlValueAccessorBase","BaseEmitter","_error","_previousValue","_serializeSettings","_touched","_value","constructor","config","undefined","sensitive","serializable","onChange","_","onErrorChange","onTouched","_isTouched","error","previousValue","serializeSettings","touched","value","registerOnChange","fn","registerOnErrorChange","registerOnTouched","setTouched","isTouched","disableEvents","emit","forget","setValue","options","normalizedValue","setError","setPreviousValue","setSerializeSettings","settings","VALID","INVALID","PENDING","DISABLED","AbstractControl","ControlValueAccessorBase","_status","undefined","constructor","disabled","status","DISABLED","enabled","invalid","INVALID","pending","PENDING","rawValue","value","valid","VALID","setErrorAndValidity","error","setError","setStatus","emit","forget","validate","AllowAllRegex","FormControlBase","AbstractControl","cursorPosition","current","undefined","previous","invalidMessage","pattern","patternStrict","props","required","_name","constructor","name","rawValue","unmask","value","onCursorChange","setValue","setOptions","unmasked","match","mask","getCursorPosition","newCursor","previousValue","changeError","validate","normalizedValue","blurError","error","setName","FormGroup","AbstractControl","_controls","serializeListeners","serializedSensitiveState","serializedState","constructor","fgParams","errorSummary","errorMessage","invalidFields","key","value","Object","entries","errors","push","castKey","error","nonSensitiveStorage","storage","sensitiveStorage","sensitive","touched","values","some","control","valid","every","rawValue","getControl","name","getSerializedValue","console","warn","savedState","get","savedValue","savedStateWithTimestamp","timestamp","ttlStorage","expirationDate","now","Date","undefined","registerControl","serializeControlValue","resetControls","unregisterControl","resetValues","setValue","listener","off","validateFields","requiredFields","castRequiredFields","includes","validate","shouldSerialize","serialize","serializeSettings","serializable","setStateValueFromStorage","targetStorage","targetState","payloadWithTimestamp","serializeValues","on","write","insert","clear","forget","read","disableEmit","FormGroupPayloadProvider","children","params","props","formGroup","useMemo","FormGroup","value","provided","FormGroupBaseContext","Provider","useContextEx","useFormGroup","required","useContextEx","FormGroupBaseContext","ArchivistFormGroupStorage","constructor","archivist","clear","get","all","at","insert","value"]}
@@ -0,0 +1,13 @@
1
+ import type { ArchivistInstance } from '@xyo-network/archivist-model';
2
+ import type { Payload } from '@xyo-network/payload-model';
3
+ import type { FormGroupStorage } from './FormGroupStorage.ts';
4
+ export declare class ArchivistFormGroupStorage implements FormGroupStorage {
5
+ private archivist;
6
+ constructor(archivist: ArchivistInstance);
7
+ clear(): Promise<void>;
8
+ get(): Promise<import("@xyo-network/payload-model").WithMeta<{
9
+ schema: string;
10
+ } & import("@xyo-network/payload-model").PayloadFields> | undefined>;
11
+ insert(value: Payload): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=ArchivistFormGroupStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArchivistFormGroupStorage.d.ts","sourceRoot":"","sources":["../../../src/storage/ArchivistFormGroupStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,qBAAa,yBAA0B,YAAW,gBAAgB;IACpD,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,iBAAiB;IAE1C,KAAK;IAIL,GAAG;;;IAKH,MAAM,CAAC,KAAK,EAAE,OAAO;CAG5B"}
@@ -0,0 +1,8 @@
1
+ import type { Promisable } from '@xylabs/promise';
2
+ import type { Payload } from '@xyo-network/payload-model';
3
+ export interface FormGroupStorage<TValue extends Payload = Payload> {
4
+ clear: () => Promisable<void>;
5
+ get: () => Promisable<TValue | undefined>;
6
+ insert: (state: TValue) => Promisable<void>;
7
+ }
8
+ //# sourceMappingURL=FormGroupStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormGroupStorage.d.ts","sourceRoot":"","sources":["../../../src/storage/FormGroupStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEzD,MAAM,WAAW,gBAAgB,CAAC,MAAM,SAAS,OAAO,GAAG,OAAO;IAChE,KAAK,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,CAAA;IAC7B,GAAG,EAAE,MAAM,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACzC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,CAAA;CAC5C"}
@@ -0,0 +1,3 @@
1
+ export * from './ArchivistFormGroupStorage.ts';
2
+ export * from './FormGroupStorage.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAA;AAC9C,cAAc,uBAAuB,CAAA"}
package/package.json CHANGED
@@ -1,39 +1,30 @@
1
1
  {
2
2
  "name": "@xyo-network/react-form-group",
3
- "author": {
4
- "email": "support@xyo.network",
5
- "name": "XYO Development Team",
6
- "url": "https://xyo.network"
7
- },
3
+ "version": "3.0.3",
4
+ "description": "Common React library for all XYO projects that use React",
5
+ "keywords": [
6
+ "xyo",
7
+ "utility",
8
+ "typescript",
9
+ "react"
10
+ ],
11
+ "homepage": "https://xyo.network",
8
12
  "bugs": {
9
- "email": "support@xyo.network",
10
- "url": "https://github.com/XYOracleNetwork/sdk-xyo-react-js/issues"
11
- },
12
- "dependencies": {
13
- "@mui/icons-material": "^5.16.7",
14
- "@xylabs/forget": "^4.0.1",
15
- "@xylabs/object": "^4.0.1",
16
- "@xylabs/promise": "^4.0.1",
17
- "@xyo-network/archivist-model": "^3.0.2",
18
- "@xyo-network/module-abstract": "^3.0.2",
19
- "@xyo-network/module-events": "^3.0.2",
20
- "@xyo-network/payload-model": "^3.0.2",
21
- "@xyo-network/react-shared": "^3.0.1"
13
+ "url": "git+https://github.com/XYOracleNetwork/sdk-xyo-react-js/issues",
14
+ "email": "support@xyo.network"
22
15
  },
23
- "peerDependencies": {
24
- "@mui/material": "^5",
25
- "@mui/styles": "^5",
26
- "react": "^18",
27
- "react-dom": "^18"
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/XYOracleNetwork/sdk-xyo-react-js.git"
28
19
  },
29
- "devDependencies": {
30
- "@storybook/react": "^8.2.9",
31
- "@xylabs/ts-scripts-yarn3": "^4.0.0-rc.15",
32
- "@xylabs/tsconfig-react": "^4.0.0-rc.15",
33
- "typescript": "^5.5.4"
20
+ "license": "LGPL-3.0-only",
21
+ "author": {
22
+ "name": "XYO Development Team",
23
+ "email": "support@xyo.network",
24
+ "url": "https://xyo.network"
34
25
  },
35
- "description": "Common React library for all XYO projects that use React",
36
- "docs": "dist/docs.json",
26
+ "sideEffects": false,
27
+ "type": "module",
37
28
  "exports": {
38
29
  ".": {
39
30
  "import": {
@@ -46,27 +37,41 @@
46
37
  "./package.json": "./package.json"
47
38
  },
48
39
  "module": "dist/browser/index.mjs",
49
- "homepage": "https://xyo.network",
50
- "keywords": [
51
- "xyo",
52
- "utility",
53
- "typescript",
54
- "react"
55
- ],
56
- "license": "LGPL-3.0-only",
57
- "publishConfig": {
58
- "access": "public"
40
+ "types": "dist/browser/index.d.ts",
41
+ "scripts": {
42
+ "license": "yarn license-checker --exclude \"MIT, ISC, Apache-2.0, BSD, BSD-2-Clause, CC-BY-4.0, Unlicense, CC-BY-3.0, CC0-1.0\"",
43
+ "lint-pkg": "npmPkgJsonLint ."
59
44
  },
60
- "repository": {
61
- "type": "git",
62
- "url": "https://github.com/XYOracleNetwork/sdk-xyo-react-js.git"
45
+ "dependencies": {
46
+ "@mui/icons-material": "^5.16.7",
47
+ "@xylabs/forget": "^4.0.5",
48
+ "@xylabs/object": "^4.0.5",
49
+ "@xylabs/promise": "^4.0.5",
50
+ "@xyo-network/archivist-model": "^3.0.15",
51
+ "@xyo-network/module-abstract": "^3.0.15",
52
+ "@xyo-network/module-events": "^3.0.15",
53
+ "@xyo-network/payload-model": "^3.0.15",
54
+ "@xyo-network/react-shared": "^3.0.3"
63
55
  },
64
- "scripts": {
65
- "lint-pkg": "npmPkgJsonLint .",
66
- "license": "yarn license-checker --exclude \"MIT, ISC, Apache-2.0, BSD, BSD-2-Clause, CC-BY-4.0, Unlicense, CC-BY-3.0, CC0-1.0\""
56
+ "devDependencies": {
57
+ "@mui/material": "^5.16.7",
58
+ "@mui/styles": "^5.16.7",
59
+ "@storybook/react": "^8.2.9",
60
+ "@xylabs/ts-scripts-yarn3": "^4.0.7",
61
+ "@xylabs/tsconfig-react": "^4.0.7",
62
+ "react": "^18.3.1",
63
+ "react-dom": "^18.3.1",
64
+ "storybook": "^8.2.9",
65
+ "typescript": "^5.5.4"
67
66
  },
68
- "sideEffects": false,
69
- "types": "dist/browser/index.d.ts",
70
- "version": "3.0.1",
71
- "type": "module"
67
+ "peerDependencies": {
68
+ "@mui/material": "^5",
69
+ "@mui/styles": "^5",
70
+ "react": "^18",
71
+ "react-dom": "^18"
72
+ },
73
+ "publishConfig": {
74
+ "access": "public"
75
+ },
76
+ "docs": "dist/docs.json"
72
77
  }
package/src/FormGroup.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import { forget } from '@xylabs/forget'
2
- import { EventListener } from '@xyo-network/module-events'
3
- import { Payload } from '@xyo-network/payload-model'
2
+ import type { EventListener } from '@xyo-network/module-events'
3
+ import type { Payload } from '@xyo-network/payload-model'
4
4
 
5
- import { AbstractControl, ControlValueAccessorBaseEvents } from './control/index.ts'
6
- import { ErrorSummary } from './InputError.ts'
7
- import { FormGroupStorage } from './storage/index.ts'
5
+ import type { ControlValueAccessorBaseEvents } from './control/index.ts'
6
+ import { AbstractControl } from './control/index.ts'
7
+ import type { ErrorSummary } from './InputError.ts'
8
+ import type { FormGroupStorage } from './storage/index.ts'
8
9
 
9
10
  export type PayloadWithTimestamp = Payload<{ timestamp?: number }>
10
11
 
@@ -1,5 +1,5 @@
1
1
  import { createContextEx } from '@xyo-network/react-shared'
2
2
 
3
- import { FormGroupContextWithPayloadState } from './State.ts'
3
+ import type { FormGroupContextWithPayloadState } from './State.ts'
4
4
 
5
5
  export const FormGroupBaseContext = createContextEx<FormGroupContextWithPayloadState>()
@@ -1,7 +1,9 @@
1
- import { Payload } from '@xyo-network/payload-model'
2
- import React, { PropsWithChildren, useMemo } from 'react'
1
+ import type { Payload } from '@xyo-network/payload-model'
2
+ import type { PropsWithChildren } from 'react'
3
+ import React, { useMemo } from 'react'
3
4
 
4
- import { FormGroup, FormGroupParams } from '../FormGroup.ts'
5
+ import type { FormGroupParams } from '../FormGroup.ts'
6
+ import { FormGroup } from '../FormGroup.ts'
5
7
  import { FormGroupBaseContext } from './Context.ts'
6
8
 
7
9
  export interface FormGroupPayloadProviderProps<TStorage extends Payload = Payload> extends PropsWithChildren {
@@ -11,15 +13,22 @@ export interface FormGroupPayloadProviderProps<TStorage extends Payload = Payloa
11
13
  /**
12
14
  * Provides a FormGroup to child components.
13
15
  */
14
- export const FormGroupPayloadProvider = ({ children, params, ...props }: FormGroupPayloadProviderProps) => {
16
+ export const FormGroupPayloadProvider = ({
17
+ children, params, ...props
18
+ }: FormGroupPayloadProviderProps) => {
15
19
  const formGroup = useMemo(() => {
16
20
  const formGroup = new FormGroup<Payload, Payload>(params)
17
21
  return formGroup
18
22
  }, [params])
19
23
 
24
+ const value = useMemo(() => ({ formGroup, provided: true }), [formGroup])
25
+
20
26
  return (
21
- // eslint-disable-next-line @eslint-react/no-unstable-context-value
22
- <FormGroupBaseContext.Provider value={{ formGroup, provided: true }} {...props}>
27
+
28
+ <FormGroupBaseContext.Provider
29
+ value={value}
30
+ {...props}
31
+ >
23
32
  {children}
24
33
  </FormGroupBaseContext.Provider>
25
34
  )
@@ -1,7 +1,7 @@
1
- import { Payload } from '@xyo-network/payload-model'
2
- import { ContextExState } from '@xyo-network/react-shared'
1
+ import type { Payload } from '@xyo-network/payload-model'
2
+ import type { ContextExState } from '@xyo-network/react-shared'
3
3
 
4
- import { FormGroup } from '../FormGroup.ts'
4
+ import type { FormGroup } from '../FormGroup.ts'
5
5
 
6
6
  export interface FormGroupContextWithPayloadState<TValue extends Payload = Payload, TStorageValue extends Payload = Payload> extends ContextExState {
7
7
  formGroup?: FormGroup<TValue, TStorageValue>
@@ -1,14 +1,16 @@
1
1
  import { forget } from '@xylabs/forget'
2
2
 
3
+ import type {
4
+ ControlValueAccessorBaseEvents,
5
+ FormControlStatus,
6
+ ValidControlValue,
7
+ } from './accessor/index.ts'
3
8
  import {
4
9
  ControlValueAccessorBase,
5
- ControlValueAccessorBaseEvents,
6
10
  DISABLED,
7
- FormControlStatus,
8
11
  INVALID,
9
12
  PENDING,
10
13
  VALID,
11
- ValidControlValue,
12
14
  } from './accessor/index.ts'
13
15
 
14
16
  export type AbstractControlEvents<TValue> = ControlValueAccessorBaseEvents<TValue> & {
@@ -1,6 +1,6 @@
1
- import { EmptyObject } from '@xylabs/object'
1
+ import type { EmptyObject } from '@xylabs/object'
2
2
 
3
- import { AbstractControl } from './AbstractControl.ts'
3
+ import type { AbstractControl } from './AbstractControl.ts'
4
4
 
5
5
  export type CursorPosition = {
6
6
  current: number | undefined
@@ -1,8 +1,8 @@
1
- import { EmptyObject } from '@xylabs/object'
1
+ import type { EmptyObject } from '@xylabs/object'
2
2
 
3
3
  import { AbstractControl } from './AbstractControl.ts'
4
- import { SetOptions } from './accessor/index.ts'
5
- import { CursorPosition, FormControl } from './FormControl.ts'
4
+ import type { SetOptions } from './accessor/index.ts'
5
+ import type { CursorPosition, FormControl } from './FormControl.ts'
6
6
 
7
7
  const AllowAllRegex = /^.*$/s
8
8
 
@@ -14,6 +14,7 @@ export abstract class FormControlBase<TProps extends EmptyObject = EmptyObject>
14
14
  * The current and previous cursor position of the input element.
15
15
  */
16
16
  cursorPosition: CursorPosition = { current: undefined, previous: undefined }
17
+
17
18
  invalidMessage = 'Invalid input'
18
19
  pattern = AllowAllRegex
19
20
  patternStrict = AllowAllRegex
@@ -1,4 +1,4 @@
1
- import { ValidControlValue } from './ValidControlValue.ts'
1
+ import type { ValidControlValue } from './ValidControlValue.ts'
2
2
 
3
3
  export interface SetOptions {
4
4
  disableEmit?: boolean
@@ -1,9 +1,11 @@
1
1
  import { forget } from '@xylabs/forget'
2
- import { BaseParams } from '@xylabs/object'
2
+ import type { BaseParams } from '@xylabs/object'
3
3
  import { BaseEmitter } from '@xyo-network/module-abstract'
4
4
 
5
- import { ControlSerializeSettings, ControlValueAccessor, SetOptions } from './ControlValueAccessor.ts'
6
- import { ValidControlValue } from './ValidControlValue.ts'
5
+ import type {
6
+ ControlSerializeSettings, ControlValueAccessor, SetOptions,
7
+ } from './ControlValueAccessor.ts'
8
+ import type { ValidControlValue } from './ValidControlValue.ts'
7
9
 
8
10
  export type ControlValueAccessorBaseConfig = {
9
11
  disableEvents?: boolean
@@ -1,7 +1,7 @@
1
- import { ArchivistInstance } from '@xyo-network/archivist-model'
2
- import { Payload } from '@xyo-network/payload-model'
1
+ import type { ArchivistInstance } from '@xyo-network/archivist-model'
2
+ import type { Payload } from '@xyo-network/payload-model'
3
3
 
4
- import { FormGroupStorage } from './FormGroupStorage.ts'
4
+ import type { FormGroupStorage } from './FormGroupStorage.ts'
5
5
 
6
6
  export class ArchivistFormGroupStorage implements FormGroupStorage {
7
7
  constructor(private archivist: ArchivistInstance) {}
@@ -1,5 +1,5 @@
1
- import { Promisable } from '@xylabs/promise'
2
- import { Payload } from '@xyo-network/payload-model'
1
+ import type { Promisable } from '@xylabs/promise'
2
+ import type { Payload } from '@xyo-network/payload-model'
3
3
 
4
4
  export interface FormGroupStorage<TValue extends Payload = Payload> {
5
5
  clear: () => Promisable<void>
@@ -2,12 +2,10 @@
2
2
  * More to come...
3
3
  */
4
4
 
5
- import { Meta, StoryFn } from '@storybook/react'
5
+ import type { Meta, StoryFn } from '@storybook/react'
6
6
  import React from 'react'
7
7
 
8
- export default {
9
- title: 'modules/form/test',
10
- } as Meta
8
+ export default { title: 'modules/form/test' } as Meta
11
9
 
12
10
  const Template: StoryFn<React.FC> = (args) => {
13
11
  return <div {...args}></div>
package/xy.config.ts CHANGED
@@ -1,9 +1,7 @@
1
- import { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
1
+ import type { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
2
2
  const config: XyTsupConfig = {
3
3
  compile: {
4
- browser: {
5
- src: true,
6
- },
4
+ browser: { src: true },
7
5
  node: {},
8
6
  neutral: {},
9
7
  },