@tstdl/base 0.91.41 → 0.91.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/examples/orm/user.model.d.ts +1 -3
  2. package/examples/orm/user.model.js +0 -10
  3. package/orm/index.d.ts +1 -0
  4. package/orm/index.js +1 -0
  5. package/orm/types.d.ts +2 -2
  6. package/orm/types.js +2 -2
  7. package/package.json +1 -1
  8. package/form/abstract-control.d.ts +0 -72
  9. package/form/abstract-control.js +0 -82
  10. package/form/controls/checkbox.control.d.ts +0 -10
  11. package/form/controls/checkbox.control.js +0 -19
  12. package/form/controls/chip-select.control.d.ts +0 -36
  13. package/form/controls/chip-select.control.js +0 -56
  14. package/form/controls/date.control.d.ts +0 -26
  15. package/form/controls/date.control.js +0 -64
  16. package/form/controls/hidden.control.d.ts +0 -11
  17. package/form/controls/hidden.control.js +0 -22
  18. package/form/controls/index.d.ts +0 -10
  19. package/form/controls/index.js +0 -10
  20. package/form/controls/items.control.d.ts +0 -38
  21. package/form/controls/items.control.js +0 -41
  22. package/form/controls/number.control.d.ts +0 -33
  23. package/form/controls/number.control.js +0 -73
  24. package/form/controls/radio-group.control.d.ts +0 -22
  25. package/form/controls/radio-group.control.js +0 -28
  26. package/form/controls/select.control.d.ts +0 -17
  27. package/form/controls/select.control.js +0 -26
  28. package/form/controls/text.control.d.ts +0 -47
  29. package/form/controls/text.control.js +0 -94
  30. package/form/controls/time.control.d.ts +0 -24
  31. package/form/controls/time.control.js +0 -44
  32. package/form/form-array.d.ts +0 -71
  33. package/form/form-array.js +0 -188
  34. package/form/form-button.d.ts +0 -41
  35. package/form/form-button.js +0 -49
  36. package/form/form-container.d.ts +0 -24
  37. package/form/form-container.js +0 -33
  38. package/form/form-control.d.ts +0 -45
  39. package/form/form-control.js +0 -92
  40. package/form/form-dialog.d.ts +0 -22
  41. package/form/form-dialog.js +0 -24
  42. package/form/form-element.d.ts +0 -7
  43. package/form/form-element.js +0 -6
  44. package/form/form-group.d.ts +0 -70
  45. package/form/form-group.js +0 -134
  46. package/form/form-header-footer-element.d.ts +0 -14
  47. package/form/form-header-footer-element.js +0 -20
  48. package/form/form-portal.d.ts +0 -10
  49. package/form/form-portal.js +0 -13
  50. package/form/form-text.d.ts +0 -13
  51. package/form/form-text.js +0 -15
  52. package/form/form-wrapper.d.ts +0 -40
  53. package/form/form-wrapper.js +0 -64
  54. package/form/index.d.ts +0 -15
  55. package/form/index.js +0 -15
  56. package/form/localization.d.ts +0 -49
  57. package/form/localization.js +0 -56
  58. package/form/types.d.ts +0 -11
  59. package/form/types.js +0 -1
  60. package/form/utils.d.ts +0 -38
  61. package/form/utils.js +0 -47
  62. package/form/validators/boolean.validator.d.ts +0 -3
  63. package/form/validators/boolean.validator.js +0 -15
  64. package/form/validators/date.validator.d.ts +0 -4
  65. package/form/validators/date.validator.js +0 -26
  66. package/form/validators/form.validator.d.ts +0 -10
  67. package/form/validators/form.validator.js +0 -3
  68. package/form/validators/index.d.ts +0 -9
  69. package/form/validators/index.js +0 -9
  70. package/form/validators/max-length.validator.d.ts +0 -3
  71. package/form/validators/max-length.validator.js +0 -17
  72. package/form/validators/number.validator.d.ts +0 -4
  73. package/form/validators/number.validator.js +0 -22
  74. package/form/validators/pattern.validator.d.ts +0 -3
  75. package/form/validators/pattern.validator.js +0 -16
  76. package/form/validators/required.validator.d.ts +0 -3
  77. package/form/validators/required.validator.js +0 -16
  78. package/form/validators/time.validator.d.ts +0 -4
  79. package/form/validators/time.validator.js +0 -22
  80. package/form/validators/unique.validator.d.ts +0 -5
  81. package/form/validators/unique.validator.js +0 -22
@@ -1,41 +0,0 @@
1
- import type { PartialProperty, ReactiveValue, TypedOmit } from '../types.js';
2
- import type { FormDialog } from './form-dialog.js';
3
- import { FormHeaderFooterElement, type FormHeaderFooterElementOptions } from './form-header-footer-element.js';
4
- import type { DynamicTextOption } from './types.js';
5
- export type FormButtonSize = 'normal' | 'small';
6
- export type FormButtonColor = 'transparent' | 'white' | 'accent' | 'neutral' | 'stone' | 'red' | 'orange' | 'amber' | 'yellow' | 'lime' | 'green' | 'emerald' | 'teal' | 'cyan' | 'sky' | 'blue' | 'indigo' | 'violet' | 'purple' | 'fuchsia' | 'pink' | 'rose';
7
- export type FormButtonType = 'button' | 'submit' | 'reset';
8
- export type FormButtonDesign = 'flat' | 'outline' | 'icon' | 'icon-outline' | 'none';
9
- export type IconLocation = 'before' | 'after';
10
- export type IconSize = 'small' | 'normal';
11
- export type FormButtonHandler = () => any;
12
- export type FormButtonOptions = FormHeaderFooterElementOptions & {
13
- handler: FormButtonHandler;
14
- label?: ReactiveValue<DynamicTextOption>;
15
- type?: ReactiveValue<FormButtonType | null>;
16
- disabled?: ReactiveValue<boolean | null>;
17
- design?: ReactiveValue<FormButtonDesign | null>;
18
- color?: ReactiveValue<FormButtonColor | null>;
19
- icon?: ReactiveValue<string | null>;
20
- iconLocation?: ReactiveValue<IconLocation | null>;
21
- iconSize?: ReactiveValue<IconSize | null>;
22
- };
23
- export declare class FormButton extends FormHeaderFooterElement {
24
- #private;
25
- readonly handler: FormButtonHandler;
26
- readonly label: import("../signals/api.js").Signal<DynamicTextOption>;
27
- readonly type: import("../signals/api.js").Signal<FormButtonType>;
28
- readonly disabled: import("../signals/api.js").Signal<boolean>;
29
- readonly style: import("../signals/api.js").Signal<FormButtonDesign>;
30
- readonly color: import("../signals/api.js").Signal<FormButtonColor>;
31
- readonly icon: import("../signals/api.js").Signal<string | null>;
32
- readonly iconLocation: import("../signals/api.js").Signal<IconLocation>;
33
- readonly iconSize: import("../signals/api.js").Signal<IconSize>;
34
- constructor(options: FormButtonOptions);
35
- }
36
- export declare function formButton(options: FormButtonOptions): FormButton;
37
- export declare function dialogFormButton(options: {
38
- dialog: FormDialog;
39
- showErrors?: boolean;
40
- } & TypedOmit<PartialProperty<FormButtonOptions, 'handler'>, 'icon' | 'color'>): FormButton;
41
- export declare function isFormButton(value: any): value is FormButton;
@@ -1,49 +0,0 @@
1
- import { computed, signal } from '../signals/api.js';
2
- import { FormHeaderFooterElement } from './form-header-footer-element.js';
3
- import { bindReactiveOption } from './utils.js';
4
- export class FormButton extends FormHeaderFooterElement {
5
- #label = signal(null);
6
- #type = signal('button');
7
- #disabled = signal(false);
8
- #design = signal('flat');
9
- #color = signal('accent');
10
- #icon = signal(null);
11
- #iconLocation = signal('before');
12
- #iconSize = signal('normal');
13
- handler;
14
- label = this.#label.asReadonly();
15
- type = this.#type.asReadonly();
16
- disabled = this.#disabled.asReadonly();
17
- style = this.#design.asReadonly();
18
- color = this.#color.asReadonly();
19
- icon = this.#icon.asReadonly();
20
- iconLocation = this.#iconLocation.asReadonly();
21
- iconSize = this.#iconSize.asReadonly();
22
- constructor(options) {
23
- super(options);
24
- this.handler = options.handler;
25
- bindReactiveOption(options.label, this.#label, { defaultValue: null });
26
- bindReactiveOption(options.type, this.#type, { defaultValue: 'button' });
27
- bindReactiveOption(options.disabled, this.#disabled, { defaultValue: false });
28
- bindReactiveOption(options.design, this.#design, { defaultValue: 'flat' });
29
- bindReactiveOption(options.color, this.#color, { defaultValue: 'accent' });
30
- bindReactiveOption(options.icon, this.#icon, { defaultValue: null });
31
- bindReactiveOption(options.iconLocation, this.#iconLocation, { defaultValue: 'before' });
32
- bindReactiveOption(options.iconSize, this.#iconSize, { defaultValue: 'normal' });
33
- }
34
- }
35
- export function formButton(options) {
36
- return new FormButton(options);
37
- }
38
- export function dialogFormButton(options) {
39
- const showError = computed(() => ((options.showErrors ?? true) ? options.dialog.touched() ? options.dialog.invalid() : false : false));
40
- return formButton({
41
- handler: () => options.dialog.openDialog(),
42
- ...options,
43
- icon: computed(() => (showError() ? 'warning' : null)),
44
- color: computed(() => (showError() ? 'red' : null))
45
- });
46
- }
47
- export function isFormButton(value) {
48
- return (value instanceof FormButton);
49
- }
@@ -1,24 +0,0 @@
1
- import type { OneOrMany, ReactiveValue } from '../types.js';
2
- import { AbstractControl, type AbstractControlOptions } from './abstract-control.js';
3
- import type { FormHeaderFooterElement } from './form-header-footer-element.js';
4
- import type { ClassesOption, ClassesOptions } from './types.js';
5
- export type FormContainerOptions<T> = AbstractControlOptions<T> & ClassesOptions & {
6
- displayLabel?: ReactiveValue<boolean>;
7
- displayLine?: ReactiveValue<boolean>;
8
- headerContainerClasses?: ReactiveValue<ClassesOption>;
9
- footerContainerClasses?: ReactiveValue<ClassesOption>;
10
- headerElements?: ReactiveValue<OneOrMany<FormHeaderFooterElement>>;
11
- footerElements?: ReactiveValue<OneOrMany<FormHeaderFooterElement>>;
12
- };
13
- export declare abstract class FormContainer<T, TRaw> extends AbstractControl<T, TRaw> {
14
- #private;
15
- readonly displayLabel: import("../signals/api.js").Signal<boolean>;
16
- readonly displayLine: import("../signals/api.js").Signal<boolean>;
17
- readonly headerElements: import("../signals/api.js").Signal<readonly FormHeaderFooterElement[]>;
18
- readonly footerElements: import("../signals/api.js").Signal<readonly FormHeaderFooterElement[]>;
19
- readonly headerContainerClasses: import("../signals/api.js").Signal<readonly string[]>;
20
- readonly footerContainerClasses: import("../signals/api.js").Signal<readonly string[]>;
21
- readonly classes: import("../signals/api.js").Signal<readonly string[]>;
22
- constructor(options: FormContainerOptions<T>);
23
- }
24
- export declare function isFormContainer(value: any): value is FormContainer<any, any>;
@@ -1,33 +0,0 @@
1
- import { signal } from '../signals/api.js';
2
- import { toArray } from '../utils/array/array.js';
3
- import { AbstractControl } from './abstract-control.js';
4
- import { bindReactiveOption, normalizeClassesOption } from './utils.js';
5
- export class FormContainer extends AbstractControl {
6
- #displayLabel = signal(true);
7
- #displayLine = signal(false);
8
- #headerElements = signal([]);
9
- #footerElements = signal([]);
10
- #headerContainerClasses = signal([]);
11
- #footerContainerClasses = signal([]);
12
- #classes = signal([]);
13
- displayLabel = this.#displayLabel.asReadonly();
14
- displayLine = this.#displayLine.asReadonly();
15
- headerElements = this.#headerElements.asReadonly();
16
- footerElements = this.#footerElements.asReadonly();
17
- headerContainerClasses = this.#headerContainerClasses.asReadonly();
18
- footerContainerClasses = this.#footerContainerClasses.asReadonly();
19
- classes = this.#classes.asReadonly();
20
- constructor(options) {
21
- super(options);
22
- bindReactiveOption(options.displayLabel, this.#displayLabel, { defaultValue: true });
23
- bindReactiveOption(options.displayLine, this.#displayLine, { defaultValue: false });
24
- bindReactiveOption(options.headerElements, (elements) => this.#headerElements.set(toArray(elements)), { defaultValue: [] });
25
- bindReactiveOption(options.footerElements, (elements) => this.#footerElements.set(toArray(elements)), { defaultValue: [] });
26
- bindReactiveOption(options.headerContainerClasses, (classes) => this.#headerContainerClasses.set(normalizeClassesOption(classes)));
27
- bindReactiveOption(options.footerContainerClasses, (classes) => this.#footerContainerClasses.set(normalizeClassesOption(classes)));
28
- bindReactiveOption(options.classes, (classes) => this.#classes.set(normalizeClassesOption(classes)));
29
- }
30
- }
31
- export function isFormContainer(value) {
32
- return (value instanceof FormContainer);
33
- }
@@ -1,45 +0,0 @@
1
- import { type Signal } from '../signals/api.js';
2
- import type { ReactiveValue } from '../types.js';
3
- import { AbstractControl, type AbstractControlOptions } from './abstract-control.js';
4
- import type { ClassesOptions, DynamicTextOption } from './types.js';
5
- import { type FormValidatorError } from './validators/index.js';
6
- export type InitialValue<T> = T | null;
7
- export type InitialValueOption<T> = {
8
- initialValue: T;
9
- };
10
- export type FormControlOptions<T = any> = AbstractControlOptions<T> & ClassesOptions & {
11
- initialValue?: ReactiveValue<T>;
12
- required?: ReactiveValue<boolean | null>;
13
- suffix?: ReactiveValue<DynamicTextOption>;
14
- hint?: ReactiveValue<DynamicTextOption>;
15
- };
16
- export type FormControlValueType<T extends FormControl<any>> = T extends FormControl<infer U> ? U : never;
17
- export declare abstract class FormControl<T, U = any> extends AbstractControl<T, T> {
18
- #private;
19
- readonly initialValue: Signal<T>;
20
- readonly rawValue: Signal<T>;
21
- /** Value for rendering including formatting etc. */
22
- readonly inputValue: Signal<U | null>;
23
- /** Same as {@link rawValue} for simple controls */
24
- readonly value: Signal<T>;
25
- readonly dirty: Signal<boolean>;
26
- readonly touched: Signal<boolean>;
27
- readonly required: Signal<boolean>;
28
- readonly suffix: Signal<DynamicTextOption>;
29
- readonly hint: Signal<DynamicTextOption>;
30
- readonly classes: Signal<string[]>;
31
- readonly errors: Signal<FormValidatorError[]>;
32
- readonly errorDebug: Signal<FormValidatorError[] | null>;
33
- constructor(initialValue: T, options: FormControlOptions<T>);
34
- setInitialValue(value: T): void;
35
- setInputValue(value: U | null): void;
36
- setValue(value: T | null): void;
37
- reset(): void;
38
- markAsDirty(): void;
39
- markAsTouched(): void;
40
- formatInputValue(): void;
41
- parseRawValue?(value: T | null): T | null;
42
- abstract parseInputValue(value: U | null): T | null;
43
- abstract formatRawValue(value: T | null): U;
44
- }
45
- export declare function isFormControl(value: any): value is FormControl<any>;
@@ -1,92 +0,0 @@
1
- import { computed, signal, untracked } from '../signals/api.js';
2
- import { switchAll } from '../signals/index.js';
3
- import { isDefined, isNotNull } from '../utils/type-guards.js';
4
- import { AbstractControl, computedInternalValidators, ignoreFormValue } from './abstract-control.js';
5
- import { bindReactiveOption, normalizeClassesOption } from './utils.js';
6
- import { requiredValidator } from './validators/index.js';
7
- export class FormControl extends AbstractControl {
8
- #initialValue = signal(null);
9
- #rawValue = signal(null);
10
- #inputValue = signal(null);
11
- #dirty = signal(false);
12
- #touched = signal(false);
13
- #required = signal(false);
14
- #suffix = signal(null);
15
- #hint = signal(null);
16
- #classes = signal([]);
17
- initialValue = this.#initialValue.asReadonly();
18
- rawValue = computed(() => this.#rawValue() ?? this.initialValue());
19
- /** Value for rendering including formatting etc. */
20
- inputValue = this.#inputValue.asReadonly();
21
- /** Same as {@link rawValue} for simple controls */
22
- value = this.rawValue;
23
- dirty = this.#dirty.asReadonly();
24
- touched = this.#touched.asReadonly();
25
- required = this.#required.asReadonly();
26
- suffix = this.#suffix.asReadonly();
27
- hint = this.#hint.asReadonly();
28
- classes = this.#classes.asReadonly();
29
- errors = switchAll(() => {
30
- const validations = this.validators().map((validator) => validator(this));
31
- return computed(() => validations.map((validation) => validation()).filter(isNotNull));
32
- });
33
- errorDebug = computed(() => this.valid() ? null : this.errors());
34
- constructor(initialValue, options) {
35
- super(options);
36
- this.#initialValue.set(initialValue);
37
- this.setValue(initialValue);
38
- bindReactiveOption(options.initialValue ?? initialValue, (value) => this.setInitialValue(value));
39
- bindReactiveOption(options.required, this.#required, { defaultValue: false });
40
- bindReactiveOption(options.suffix, this.#suffix, { defaultValue: null });
41
- bindReactiveOption(options.hint, this.#hint, { defaultValue: null });
42
- bindReactiveOption(options.classes, (value) => this.#classes.set(normalizeClassesOption(value)));
43
- this.registerValidators(computedInternalValidators(() => [
44
- this.required() ? requiredValidator() : null
45
- ]));
46
- }
47
- setInitialValue(value) {
48
- const updateInputValue = untracked(this.value) == untracked(this.initialValue);
49
- this.#initialValue.set(value);
50
- if (updateInputValue) {
51
- this.#inputValue.set(this.formatRawValue(value));
52
- }
53
- }
54
- setInputValue(value) {
55
- if (value == untracked(this.#inputValue)) {
56
- return;
57
- }
58
- const parsed = this.parseInputValue(value);
59
- this.#inputValue.set(value);
60
- this.#rawValue.set(parsed);
61
- }
62
- setValue(value) {
63
- if (value == ignoreFormValue) {
64
- return;
65
- }
66
- const newRawValue = (value == this.initialValue()) ? null : value;
67
- if (newRawValue === untracked(this.#rawValue)) {
68
- return;
69
- }
70
- const parsed = isDefined(this.parseRawValue) ? this.parseRawValue(newRawValue) : newRawValue; // eslint-disable-line @typescript-eslint/unbound-method
71
- this.#rawValue.set(parsed);
72
- this.formatInputValue();
73
- }
74
- reset() {
75
- this.setValue(null);
76
- this.#dirty.set(false);
77
- this.#touched.set(false);
78
- }
79
- markAsDirty() {
80
- this.#dirty.set(true);
81
- }
82
- markAsTouched() {
83
- this.#touched.set(true);
84
- }
85
- formatInputValue() {
86
- const formatted = this.formatRawValue(untracked(this.value));
87
- this.#inputValue.set(formatted);
88
- }
89
- }
90
- export function isFormControl(value) {
91
- return (value instanceof FormControl);
92
- }
@@ -1,22 +0,0 @@
1
- import type { Signal } from '../signals/api.js';
2
- import type { ReactiveValue } from '../types.js';
3
- import type { AbstractControl, AbstractControlRawValueType, AbstractControlValueType } from './abstract-control.js';
4
- import { FormWrapper, type FormWrapperOptions } from './form-wrapper.js';
5
- import type { DynamicTextOption } from './types.js';
6
- export type FormDialogOptions<T, C extends AbstractControl<T>> = FormWrapperOptions<T, C> & {
7
- header?: ReactiveValue<DynamicTextOption>;
8
- displayType?: ReactiveValue<FormDialogDisplayType>;
9
- };
10
- export type FormDialogDisplayType = 'none' | 'button';
11
- export type FormDialogByControl<C extends AbstractControl> = FormDialog<AbstractControlValueType<C>, AbstractControlRawValueType<C>, C>;
12
- export declare class FormDialog<T = any, TRaw = any, C extends AbstractControl<T, TRaw> = AbstractControl<T, TRaw>, DialogHandle = any> extends FormWrapper<T, TRaw, C> {
13
- #private;
14
- readonly displayType: Signal<FormDialogDisplayType>;
15
- readonly header: Signal<DynamicTextOption>;
16
- readonly openDialog$: import("rxjs").Observable<void>;
17
- dialogHandle: DialogHandle | null;
18
- constructor(options: FormDialogOptions<T, C>);
19
- openDialog(): void;
20
- }
21
- export declare function formDialog<C extends AbstractControl>(options: FormDialogOptions<AbstractControlRawValueType<C>, C>): FormDialog<AbstractControlValueType<C>, AbstractControlRawValueType<C>, C>;
22
- export declare function isFormDialog(value: any): value is FormDialog;
@@ -1,24 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import { FormWrapper } from './form-wrapper.js';
3
- import { reactiveOptionToSignal } from './utils.js';
4
- export class FormDialog extends FormWrapper {
5
- #openDialogSubject = new Subject();
6
- displayType;
7
- header;
8
- openDialog$ = this.#openDialogSubject.asObservable();
9
- dialogHandle = null;
10
- constructor(options) {
11
- super(options);
12
- this.displayType = reactiveOptionToSignal(options.displayType ?? 'none', { initialValue: 'none' });
13
- this.header = reactiveOptionToSignal(options.header ?? null, { initialValue: null });
14
- }
15
- openDialog() {
16
- this.#openDialogSubject.next();
17
- }
18
- }
19
- export function formDialog(options) {
20
- return new FormDialog(options);
21
- }
22
- export function isFormDialog(value) {
23
- return (value instanceof FormDialog);
24
- }
@@ -1,7 +0,0 @@
1
- export type FormElementOptions = {
2
- id?: string;
3
- };
4
- export declare abstract class FormElement {
5
- readonly id: string;
6
- constructor(options?: FormElementOptions);
7
- }
@@ -1,6 +0,0 @@
1
- export class FormElement {
2
- id;
3
- constructor(options) {
4
- this.id = options?.id ?? crypto.randomUUID();
5
- }
6
- }
@@ -1,70 +0,0 @@
1
- import type { JsonPath } from '../json-path/json-path.js';
2
- import { type Signal } from '../signals/index.js';
3
- import type { ReactiveValue, Record } from '../types.js';
4
- import { type AbstractControl, type AbstractControlParent, type AbstractControlRawValueType, type AbstractControlValueType, type MarkOptions } from './abstract-control.js';
5
- import { FormContainer, type FormContainerOptions } from './form-container.js';
6
- import type { FormValue, RawFormValue } from './types.js';
7
- import type { FormValidatorError } from './validators/form.validator.js';
8
- type FormGroupDisplayType = 'simple' | 'block' | 'stepper' | 'tabs';
9
- type FormGroupStepperOrientiation = 'horizontal' | 'vertical';
10
- export type FromGroupControls<T extends Record> = {
11
- [P in keyof T]: AbstractControl<T[P]>;
12
- };
13
- export type FormGroupOptions<T extends Record = Record, C extends FromGroupControls<T> = FromGroupControls<T>> = FormContainerOptions<Partial<T>> & {
14
- displayType?: ReactiveValue<FormGroupDisplayType>;
15
- stepperOrientation?: ReactiveValue<FormGroupStepperOrientiation>;
16
- children: C;
17
- };
18
- export type FormGroupChildren<T extends FormGroup> = T extends FormGroup<any, infer C> ? C : never;
19
- export type FormGroupChild<T extends FormGroup, K extends keyof FormGroupChildren<T>> = FormGroupChildren<T>[K];
20
- export type FormGroupChildValue<T extends FormGroup, K extends keyof AbstractControlRawValueType<T>> = AbstractControlValueType<T>[K];
21
- export type FormGroupChildRawValue<T extends FormGroup, K extends keyof AbstractControlRawValueType<T>> = AbstractControlRawValueType<T>[K];
22
- export type FormGroupRawValueType<C extends FromGroupControls<Record>> = {
23
- [P in keyof C]: AbstractControlRawValueType<C[P]>;
24
- };
25
- export type FormGroupByControls<C extends FromGroupControls<Record> = FromGroupControls<Record>> = FormGroup<FormGroupRawValueType<C>, C>;
26
- export declare class FormGroup<T extends Record = Record, C extends FromGroupControls<T> = FromGroupControls<T>> extends FormContainer<Partial<T>, T> implements Iterable<[keyof C, C[keyof C]]> {
27
- #private;
28
- protected readonly internalValidators: null;
29
- readonly displayType: Signal<FormGroupDisplayType>;
30
- readonly stepperOrientation: Signal<FormGroupStepperOrientiation>;
31
- readonly children: Signal<Readonly<C>>;
32
- readonly childrenEntries: Signal<[keyof C, Readonly<C>[keyof C]][]>;
33
- readonly childrenValues: Signal<Readonly<C>[keyof C][]>;
34
- readonly enabledChildrenEntries: Signal<[keyof C, Readonly<C>[keyof C]][]>;
35
- readonly enabledChildrenValues: Signal<Readonly<C>[keyof C][]>;
36
- /**
37
- * Raw values of all children whether disabled or not
38
- */
39
- readonly rawValue: Signal<T>;
40
- /**
41
- * If enabled: values of all enabled children
42
- * if disabled: values of all children whether disabled or not (same as {@link rawValue})
43
- */
44
- readonly value: Signal<Partial<T>>;
45
- readonly dirty: Signal<boolean>;
46
- readonly touched: Signal<boolean>;
47
- readonly localErrors: Signal<readonly FormValidatorError[]>;
48
- readonly childrenErrors: Signal<FormValidatorError[]>;
49
- readonly errors: Signal<FormValidatorError[]>;
50
- readonly errorDebug: Signal<({
51
- _self: readonly FormValidatorError[];
52
- } & { [K in import("../types.js").Cast<keyof C, PropertyKey>]: import("../types.js").Fallback<Extract<readonly [keyof C, any], readonly [K, any]>[1], any>; }) | null>;
53
- constructor(options: FormGroupOptions<T, C>);
54
- setParent(parent: AbstractControlParent, force?: boolean): void;
55
- setParent(parent: null): void;
56
- getChildPath(child: AbstractControl): Signal<JsonPath>;
57
- reset(): void;
58
- get<K extends keyof C>(key: K): C[K];
59
- getValue<K extends keyof C>(key: K): FormValue<C[K]>;
60
- getRawValue<K extends keyof C>(key: K): RawFormValue<C[K]>;
61
- patchValue(values: Partial<T>): void;
62
- setValue(values: Partial<T>): void;
63
- markAsDirty({ onlySelf }?: MarkOptions): void;
64
- markAsTouched({ onlySelf }?: MarkOptions): void;
65
- [Symbol.iterator](): Iterator<[keyof C, C[keyof C]]>;
66
- private updateParents;
67
- }
68
- export declare function formGroup<C extends FromGroupControls<Record> = FromGroupControls<Record>>(options: FormGroupOptions<FormGroupRawValueType<C>, C>): FormGroup<FormGroupRawValueType<C>, C>;
69
- export declare function isFormGroup(value: any): value is FormGroup;
70
- export {};
@@ -1,134 +0,0 @@
1
- import { computed, signal, switchAll } from '../signals/index.js';
2
- import { fromEntries, hasOwnProperty, objectEntries } from '../utils/object/object.js';
3
- import { isDefined, isNotNull } from '../utils/type-guards.js';
4
- import { ignoreFormValue } from './abstract-control.js';
5
- import { FormContainer } from './form-container.js';
6
- import { reactiveOptionToSignal } from './utils.js';
7
- export class FormGroup extends FormContainer {
8
- #children = signal({});
9
- #selfTouched = signal(false);
10
- #selfDirty = signal(false);
11
- internalValidators = null;
12
- displayType;
13
- stepperOrientation;
14
- children = this.#children.asReadonly();
15
- childrenEntries = computed(() => objectEntries(this.children()));
16
- childrenValues = computed(() => this.childrenEntries().map(([_, child]) => child));
17
- enabledChildrenEntries = computed(() => this.childrenEntries().filter(([_, child]) => child.enabled()));
18
- enabledChildrenValues = computed(() => this.enabledChildrenEntries().map(([_, child]) => child));
19
- /**
20
- * Raw values of all children whether disabled or not
21
- */
22
- rawValue = computed(() => fromEntries(this.childrenEntries().map(([key, child]) => [key, child.rawValue()]))); // eslint-disable-line @typescript-eslint/no-unsafe-return
23
- /**
24
- * If enabled: values of all enabled children
25
- * if disabled: values of all children whether disabled or not (same as {@link rawValue})
26
- */
27
- value = computed(() => (this.disabled()
28
- ? this.rawValue()
29
- : fromEntries(this.childrenEntries()
30
- .filter(([_, child]) => child.enabled())
31
- .map(([key, child]) => [key, child.value()]))));
32
- dirty = computed(() => this.#selfDirty() || this.enabledChildrenValues().some((child) => child.dirty()));
33
- touched = computed(() => this.#selfTouched() || this.enabledChildrenValues().some((child) => child.touched()));
34
- localErrors = switchAll(() => {
35
- const validations = this.validators().map((validator) => validator(this));
36
- return computed(() => validations.map((validation) => validation()).filter(isNotNull));
37
- });
38
- childrenErrors = computed(() => this.enabledChildrenValues().flatMap((child) => child.errors()));
39
- errors = computed(() => [
40
- ...this.localErrors(),
41
- ...this.childrenErrors()
42
- ]);
43
- errorDebug = computed(() => this.valid()
44
- ? null
45
- : ({
46
- _self: this.localErrors(),
47
- ...fromEntries(this.childrenEntries().map(([key, child]) => [key, child.errorDebug()]).filter(([, errorDebug]) => isNotNull(errorDebug)))
48
- }));
49
- constructor(options) {
50
- super(options);
51
- this.displayType = reactiveOptionToSignal(options.displayType ?? 'simple', { initialValue: 'simple' });
52
- this.stepperOrientation = reactiveOptionToSignal(options.stepperOrientation ?? 'vertical', { initialValue: 'vertical' });
53
- this.#children.set(options.children);
54
- this.updateParents();
55
- }
56
- setParent(parent, force) {
57
- super.setParent(parent, force);
58
- this.updateParents(true);
59
- }
60
- getChildPath(child) {
61
- return computed(() => {
62
- const key = this.childrenEntries().find(([_, _child]) => child == _child)?.[0] ?? '_CHILD_NOT_FOUND_';
63
- return this.path().add(key);
64
- });
65
- }
66
- reset() {
67
- for (const child of this.childrenValues()) {
68
- child.reset();
69
- }
70
- }
71
- get(key) {
72
- return this.children()[key];
73
- }
74
- getValue(key) {
75
- return this.get(key).value(); // eslint-disable-line @typescript-eslint/no-unsafe-return
76
- }
77
- getRawValue(key) {
78
- return this.get(key).rawValue(); // eslint-disable-line @typescript-eslint/no-unsafe-return
79
- }
80
- patchValue(values) {
81
- const children = this.children();
82
- for (const [key, value] of objectEntries(values)) {
83
- if (isDefined(value) && hasOwnProperty(children, key)) {
84
- children[key].setValue(value);
85
- }
86
- }
87
- }
88
- setValue(values) {
89
- if (values == ignoreFormValue) {
90
- return;
91
- }
92
- for (const [key, child] of this.childrenEntries()) {
93
- const value = values[key];
94
- if (isDefined(value)) {
95
- child.setValue(value);
96
- }
97
- else {
98
- child.reset();
99
- }
100
- }
101
- }
102
- markAsDirty({ onlySelf = false } = {}) {
103
- this.#selfDirty.set(true);
104
- if (onlySelf) {
105
- return;
106
- }
107
- for (const child of this.childrenValues()) {
108
- child.markAsDirty();
109
- }
110
- }
111
- markAsTouched({ onlySelf = false } = {}) {
112
- this.#selfTouched.set(true);
113
- if (onlySelf) {
114
- return;
115
- }
116
- for (const child of this.childrenValues()) {
117
- child.markAsTouched();
118
- }
119
- }
120
- *[Symbol.iterator]() {
121
- yield* this.childrenEntries();
122
- }
123
- updateParents(force) {
124
- for (const child of this.childrenValues()) {
125
- child.setParent(this, force);
126
- }
127
- }
128
- }
129
- export function formGroup(options) {
130
- return new FormGroup(options);
131
- }
132
- export function isFormGroup(value) {
133
- return (value instanceof FormGroup);
134
- }
@@ -1,14 +0,0 @@
1
- import type { ReactiveValue } from '../types.js';
2
- import { FormElement, type FormElementOptions } from './form-element.js';
3
- import type { ClassesOptions } from './types.js';
4
- export type FormHeaderFooterElementOptions = FormElementOptions & ClassesOptions & {
5
- hide?: ReactiveValue<boolean | null>;
6
- show?: ReactiveValue<boolean | null>;
7
- };
8
- export declare abstract class FormHeaderFooterElement extends FormElement {
9
- #private;
10
- readonly hide: import("../signals/api.js").Signal<boolean>;
11
- readonly show: import("../signals/api.js").Signal<boolean>;
12
- readonly classes: import("../signals/api.js").Signal<string[]>;
13
- constructor(options: FormHeaderFooterElementOptions);
14
- }
@@ -1,20 +0,0 @@
1
- import { computed, signal } from '../signals/api.js';
2
- import { isDefined } from '../utils/type-guards.js';
3
- import { FormElement } from './form-element.js';
4
- import { bindReactiveOption, normalizeClassesOption } from './utils.js';
5
- export class FormHeaderFooterElement extends FormElement {
6
- #hide = signal(false);
7
- #classes = signal([]);
8
- hide = this.#hide.asReadonly();
9
- show = computed(() => !this.hide());
10
- classes = this.#classes.asReadonly();
11
- constructor(options) {
12
- super(options);
13
- if (isDefined(options.show) && isDefined(options.hide)) {
14
- throw new Error('Either enabled or disabled can be set but not both.');
15
- }
16
- bindReactiveOption(options.hide, (hide) => this.#hide.set(hide ?? false));
17
- bindReactiveOption(options.show, (show) => this.#hide.set(!(show ?? true)));
18
- bindReactiveOption(options.classes, (value) => this.#classes.set(normalizeClassesOption(value)));
19
- }
20
- }
@@ -1,10 +0,0 @@
1
- import type { TypedOmit } from '../types.js';
2
- import { type AbstractControl, type AbstractControlRawValueType, type AbstractControlValueType } from './abstract-control.js';
3
- import { FormWrapper, type FormWrapperOptions } from './form-wrapper.js';
4
- export type FormPortalOptions<T, C extends AbstractControl<T>> = FormWrapperOptions<T, C>;
5
- export type FormPortalByControl<C extends AbstractControl> = FormPortal<AbstractControlValueType<C>, AbstractControlRawValueType<C>, C>;
6
- export declare class FormPortal<T = any, TRaw = any, C extends AbstractControl<T, TRaw> = AbstractControl<T, TRaw>> extends FormWrapper<T, TRaw, C> {
7
- }
8
- export declare function formPortal<C extends AbstractControl>(control: C, options?: TypedOmit<FormPortalOptions<AbstractControlRawValueType<C>, C>, 'element'>): FormPortal<AbstractControlValueType<C>, AbstractControlRawValueType<C>, C>;
9
- export declare function formPortal<C extends AbstractControl>(options: FormPortalOptions<AbstractControlRawValueType<C>, C>): FormPortal<AbstractControlValueType<C>, AbstractControlRawValueType<C>, C>;
10
- export declare function isFormPortal(value: any): value is FormPortal;
@@ -1,13 +0,0 @@
1
- import { isAbstractControl } from './abstract-control.js';
2
- import { FormWrapper } from './form-wrapper.js';
3
- export class FormPortal extends FormWrapper {
4
- }
5
- export function formPortal(controlOrOptions, optionsOrNothing) {
6
- if (isAbstractControl(controlOrOptions)) {
7
- return new FormPortal({ ...optionsOrNothing, element: controlOrOptions });
8
- }
9
- return new FormPortal({ ...controlOrOptions });
10
- }
11
- export function isFormPortal(value) {
12
- return (value instanceof FormPortal);
13
- }
@@ -1,13 +0,0 @@
1
- import type { Signal } from '../signals/api.js';
2
- import type { ReactiveValue } from '../types.js';
3
- import { FormHeaderFooterElement, type FormHeaderFooterElementOptions } from './form-header-footer-element.js';
4
- import type { DynamicTextOption } from './types.js';
5
- export type FormTextOptions = FormHeaderFooterElementOptions & {
6
- text: ReactiveValue<DynamicTextOption>;
7
- };
8
- export declare class FormText extends FormHeaderFooterElement {
9
- readonly text: Signal<DynamicTextOption>;
10
- constructor(options: FormTextOptions);
11
- }
12
- export declare function formText(options: FormTextOptions): FormText;
13
- export declare function isFormText(value: any): value is FormText;
package/form/form-text.js DELETED
@@ -1,15 +0,0 @@
1
- import { FormHeaderFooterElement } from './form-header-footer-element.js';
2
- import { reactiveOptionToSignal } from './utils.js';
3
- export class FormText extends FormHeaderFooterElement {
4
- text;
5
- constructor(options) {
6
- super(options);
7
- this.text = reactiveOptionToSignal(options.text, { initialValue: '[MISSING TEXT]' });
8
- }
9
- }
10
- export function formText(options) {
11
- return new FormText(options);
12
- }
13
- export function isFormText(value) {
14
- return (value instanceof FormText);
15
- }