iss-ctrl 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs +110 -0
- package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs.map +1 -0
- package/fesm2022/iss-ctrl-base.mjs +663 -0
- package/fesm2022/iss-ctrl-base.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.field-Dj5EGLUr.mjs +92 -0
- package/fesm2022/iss-ctrl-checkbox.field-Dj5EGLUr.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.mjs +143 -0
- package/fesm2022/iss-ctrl-checkbox.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs +31 -0
- package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs.map +1 -0
- package/fesm2022/iss-ctrl-chips.field-BLLAjBbP.mjs +76 -0
- package/fesm2022/iss-ctrl-chips.field-BLLAjBbP.mjs.map +1 -0
- package/fesm2022/iss-ctrl-chips.mjs +168 -0
- package/fesm2022/iss-ctrl-chips.mjs.map +1 -0
- package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs +38 -0
- package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-picker.field-BSpXukpO.mjs +98 -0
- package/fesm2022/iss-ctrl-date-picker.field-BSpXukpO.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-picker.mjs +200 -0
- package/fesm2022/iss-ctrl-date-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs +40 -0
- package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-range-picker.field-CjNHU1RW.mjs +97 -0
- package/fesm2022/iss-ctrl-date-range-picker.field-CjNHU1RW.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-range-picker.mjs +307 -0
- package/fesm2022/iss-ctrl-date-range-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs +41 -0
- package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs.map +1 -0
- package/fesm2022/iss-ctrl-datetime-picker.field-DGMY9PaU.mjs +98 -0
- package/fesm2022/iss-ctrl-datetime-picker.field-DGMY9PaU.mjs.map +1 -0
- package/fesm2022/iss-ctrl-datetime-picker.mjs +226 -0
- package/fesm2022/iss-ctrl-datetime-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs +42 -0
- package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs.map +1 -0
- package/fesm2022/iss-ctrl-file-picker.field-CbepZaX6.mjs +210 -0
- package/fesm2022/iss-ctrl-file-picker.field-CbepZaX6.mjs.map +1 -0
- package/fesm2022/iss-ctrl-file-picker.mjs +272 -0
- package/fesm2022/iss-ctrl-file-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-input.field-Ctlf3OCN.mjs +104 -0
- package/fesm2022/iss-ctrl-input.field-Ctlf3OCN.mjs.map +1 -0
- package/fesm2022/iss-ctrl-input.mjs +204 -0
- package/fesm2022/iss-ctrl-input.mjs.map +1 -0
- package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs +22 -0
- package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs.map +1 -0
- package/fesm2022/iss-ctrl-iss-ctrl-DvnkwSMG.mjs +1789 -0
- package/fesm2022/iss-ctrl-iss-ctrl-DvnkwSMG.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-load-event-bOt6IlIo.mjs → iss-ctrl-load-event-CuZ7pMjk.mjs} +4 -3
- package/fesm2022/iss-ctrl-load-event-CuZ7pMjk.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs → iss-ctrl-load-options-event-B10rhdqh.mjs} +3 -3
- package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs.map → iss-ctrl-load-options-event-B10rhdqh.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs → iss-ctrl-load-value-event-C-aRgKLx.mjs} +3 -3
- package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs.map → iss-ctrl-load-value-event-C-aRgKLx.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-mobile.field-DXVYT3q-.mjs +77 -0
- package/fesm2022/iss-ctrl-mobile.field-DXVYT3q-.mjs.map +1 -0
- package/fesm2022/iss-ctrl-mobile.mjs +2465 -0
- package/fesm2022/iss-ctrl-mobile.mjs.map +1 -0
- package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs +22 -0
- package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs → iss-ctrl-note.field-C8X9-mgD.mjs} +2 -2
- package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs.map → iss-ctrl-note.field-C8X9-mgD.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-plate.field-aI81tAOV.mjs +92 -0
- package/fesm2022/iss-ctrl-plate.field-aI81tAOV.mjs.map +1 -0
- package/fesm2022/iss-ctrl-plate.mjs +491 -0
- package/fesm2022/iss-ctrl-plate.mjs.map +1 -0
- package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs +179 -0
- package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs.map +1 -0
- package/fesm2022/iss-ctrl-radio.field-B_JjPIlb.mjs +96 -0
- package/fesm2022/iss-ctrl-radio.field-B_JjPIlb.mjs.map +1 -0
- package/fesm2022/iss-ctrl-radio.mjs +101 -0
- package/fesm2022/iss-ctrl-radio.mjs.map +1 -0
- package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs +30 -0
- package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs → iss-ctrl-replace-api-keys-DLnagkOr.mjs} +2 -2
- package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs.map → iss-ctrl-replace-api-keys-DLnagkOr.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-select.field-DoU4G_8t.mjs +87 -0
- package/fesm2022/iss-ctrl-select.field-DoU4G_8t.mjs.map +1 -0
- package/fesm2022/iss-ctrl-select.mjs +387 -0
- package/fesm2022/iss-ctrl-select.mjs.map +1 -0
- package/fesm2022/iss-ctrl-select.viewer-Dv9M-lG-.mjs +30 -0
- package/fesm2022/iss-ctrl-select.viewer-Dv9M-lG-.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs → iss-ctrl-set-value-event-Dhw0Vj5J.mjs} +2 -2
- package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs.map → iss-ctrl-set-value-event-Dhw0Vj5J.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-slide-toggle.field-TVVbAr6p.mjs +85 -0
- package/fesm2022/iss-ctrl-slide-toggle.field-TVVbAr6p.mjs.map +1 -0
- package/fesm2022/iss-ctrl-slide-toggle.mjs +72 -0
- package/fesm2022/iss-ctrl-slide-toggle.mjs.map +1 -0
- package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs +34 -0
- package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-table.field-B5FxF6hn.mjs → iss-ctrl-table.field-E0r9w0os.mjs} +142 -140
- package/fesm2022/iss-ctrl-table.field-E0r9w0os.mjs.map +1 -0
- package/fesm2022/iss-ctrl-textarea.field-CmHPDpk-.mjs +82 -0
- package/fesm2022/iss-ctrl-textarea.field-CmHPDpk-.mjs.map +1 -0
- package/fesm2022/iss-ctrl-textarea.mjs +115 -0
- package/fesm2022/iss-ctrl-textarea.mjs.map +1 -0
- package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs +22 -0
- package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs.map +1 -0
- package/fesm2022/iss-ctrl-time-picker.field-Cb0I5Ut1.mjs +77 -0
- package/fesm2022/iss-ctrl-time-picker.field-Cb0I5Ut1.mjs.map +1 -0
- package/fesm2022/iss-ctrl-time-picker.mjs +170 -0
- package/fesm2022/iss-ctrl-time-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs +22 -0
- package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs.map +1 -0
- package/fesm2022/iss-ctrl-toggle-button.field-Bj8WrkB-.mjs +105 -0
- package/fesm2022/iss-ctrl-toggle-button.field-Bj8WrkB-.mjs.map +1 -0
- package/fesm2022/iss-ctrl-toggle-button.mjs +156 -0
- package/fesm2022/iss-ctrl-toggle-button.mjs.map +1 -0
- package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs +30 -0
- package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs.map +1 -0
- package/fesm2022/iss-ctrl-tokens.mjs +25 -0
- package/fesm2022/iss-ctrl-tokens.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs → iss-ctrl-trigger-based-on-json-value-D9rTXVD1.mjs} +2 -2
- package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map → iss-ctrl-trigger-based-on-json-value-D9rTXVD1.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-user-picker.field-BH63sZ-X.mjs → iss-ctrl-user-picker.field-BIzB5ZX6.mjs} +151 -150
- package/fesm2022/iss-ctrl-user-picker.field-BIzB5ZX6.mjs.map +1 -0
- package/fesm2022/iss-ctrl.mjs +3 -1
- package/fesm2022/iss-ctrl.mjs.map +1 -1
- package/package.json +69 -1
- package/types/iss-ctrl-base.d.ts +306 -0
- package/types/iss-ctrl-checkbox.d.ts +45 -0
- package/types/iss-ctrl-chips.d.ts +41 -0
- package/types/iss-ctrl-date-picker.d.ts +75 -0
- package/types/iss-ctrl-date-range-picker.d.ts +95 -0
- package/types/iss-ctrl-datetime-picker.d.ts +77 -0
- package/types/iss-ctrl-file-picker.d.ts +95 -0
- package/types/iss-ctrl-input.d.ts +76 -0
- package/types/iss-ctrl-mobile.d.ts +91 -0
- package/types/iss-ctrl-plate.d.ts +54 -0
- package/types/iss-ctrl-radio.d.ts +34 -0
- package/types/iss-ctrl-select.d.ts +75 -0
- package/types/iss-ctrl-slide-toggle.d.ts +26 -0
- package/types/iss-ctrl-textarea.d.ts +30 -0
- package/types/iss-ctrl-time-picker.d.ts +48 -0
- package/types/iss-ctrl-toggle-button.d.ts +41 -0
- package/types/iss-ctrl-tokens.d.ts +21 -0
- package/types/iss-ctrl.d.ts +120 -1810
- package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs +0 -9683
- package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs.map +0 -1
- package/fesm2022/iss-ctrl-load-event-bOt6IlIo.mjs.map +0 -1
- package/fesm2022/iss-ctrl-table.field-B5FxF6hn.mjs.map +0 -1
- package/fesm2022/iss-ctrl-user-picker.field-BH63sZ-X.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-base.mjs","sources":["../../../projects/iss/base/src/control-base.ts","../../../projects/iss/base/src/date-format.const.ts","../../../projects/iss/base/src/hijri.util.ts","../../../projects/iss/base/src/hints.ts","../../../projects/iss/base/src/iss-date-adapter.ts","../../../projects/iss/base/src/select-status.pipe.ts","../../../projects/iss/base/src/viewer-base.ts","../../../projects/iss/base/src/public-api.ts","../../../projects/iss/base/src/iss-ctrl-base.ts"],"sourcesContent":["import { Component, inject, Injector, input, InputSignal, output, OutputEmitterRef, signal, WritableSignal } from \"@angular/core\";\nimport { AbstractControl, ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ValidationErrors, Validator } from \"@angular/forms\";\nimport { ErrorStateMatcher } from \"@angular/material/core\";\nimport { Hint } from \"./hint\";\n\n/**\n * Base class for every `iss-ctrl-*` control.\n *\n * Controls are the presentational layer: they know nothing about {@link IssField} and are\n * driven purely by bindings, so they can be used standalone inside any reactive form.\n * Every control below inherits the properties declared here and adds its own on top.\n *\n * ### Inherited inputs\n * | Property | Type | Default | Description |\n * | --- | --- | --- | --- |\n * | `formControlName` | `string` | `\"\"` | Name of the control in the surrounding `FormGroup`. |\n * | `placeholder` | `string` | `\"\"` | Placeholder text shown while the field is empty. |\n * | `readonly` | `boolean` | `false` | Renders the value but blocks every interaction. |\n * | `multiple` | `boolean \\| undefined` | `false` | Allows more than one value, where the control supports it. |\n * | `min` | `number \\| string \\| null` | `null` | Lower bound (number or date/time string). |\n * | `max` | `number \\| string \\| null` | `null` | Upper bound (number or date/time string). |\n * | `minLength` | `number \\| null` | `null` | Minimum number of characters. |\n * | `maxLength` | `number \\| null` | `null` | Maximum number of characters. |\n * | `hints` | `Hint[]` | `[]` | Helper messages rendered under the field. |\n * | `className` | `string \\| null` | `null` | Extra CSS classes for the host. |\n *\n * ### Inherited outputs\n * | Event | Payload | Description |\n * | --- | --- | --- |\n * | `(onChange)` | `any` | Fires after every committed value change. |\n *\n * ### Not inputs\n * `disabled` and `touched` are signals owned by the control. Disable a control through the\n * forms API (`ctrl.disable()` or a `disabled` field config), never with a template binding.\n *\n * ### Content projection\n * Controls that render a `mat-form-field` project `<label>` into the floating label.\n * `upgrade.scss` reveals that space only while the projected `<label>` carries text, so an\n * omitted label — or one that interpolates to an empty string — collapses it. No label markup\n * is removed at runtime, so a label that arrives later simply shows up.\n *\n * @example\n * ```html\n * <iss-ctrl-input formControlName=\"email\" [readonly]=\"false\" (onChange)=\"save($event)\">\n * <label>Email</label>\n * </iss-ctrl-input>\n * ```\n */\n@Component({\n template: ``,\n host: { \"class\": \"iss-ctrl\", \"[class.iss-ctrl-empty]\": \"isEmpty()\" }\n})\nexport class ControlBase implements ControlValueAccessor, Validator {\n /**\n * Name of this control inside the surrounding `FormGroup`.\n */\n formControlName: InputSignal<string> = input<string>(\"\");\n /**\n * Lower bound forwarded to the underlying input — a number, or a date/time string.\n */\n min: InputSignal<number | string | null> = input<number | string | null>(null);\n /**\n * Upper bound forwarded to the underlying input — a number, or a date/time string.\n */\n max: InputSignal<number | string | null> = input<number | string | null>(null);\n /**\n * Minimum number of characters accepted by the underlying input.\n */\n minLength: InputSignal<number | null> = input<number | null>(null);\n /**\n * Maximum number of characters accepted by the underlying input.\n */\n maxLength: InputSignal<number | null> = input<number | null>(null);\n /**\n * Disabled state. **Not an input** — it is set by the forms API through\n * {@link ControlBase.setDisabledState}. Disable via `ctrl.disable()` or the field config.\n */\n disabled: WritableSignal<boolean> = signal(false);\n /**\n * Renders the current value but blocks every user interaction.\n */\n readonly: InputSignal<boolean> = input(false);\n /**\n * Allows selecting/entering more than one value, on controls that support it.\n */\n multiple: InputSignal<boolean | undefined> = input<boolean | undefined>(false);\n /**\n * Placeholder text shown while the control has no value.\n */\n placeholder: InputSignal<string> = input<string>(\"\");\n /**\n * Helper messages rendered beneath the field. See {@link Hint}.\n */\n hints: InputSignal<Hint[]> = input<Hint[]>([]);\n /**\n * Extra CSS class names applied to the control host.\n */\n className: InputSignal<string | null> = input<string | null>(null);\n /**\n * Whether the user has interacted with the control. Owned by the control, not an input.\n */\n touched: WritableSignal<boolean> = signal(false);\n /**\n * Emits the committed value after every change.\n */\n onChange: OutputEmitterRef<any> = output<any>();\n protected ctrl: FormControl = new FormControl(null);\n /**\n * Error state for the inner `mat-form-field`, derived from the **host** control.\n *\n * Material reads `errorState` off the `NgControl` bound to its own `matInput` — here that is\n * {@link ControlBase.ctrl}, which carries no validators and is therefore always valid. Every\n * error a consumer cares about (the field config's validators plus the control's own\n * {@link ControlBase.validate}) lives on the host control instead, so without this matcher an\n * invalid `iss-ctrl-*` would keep rendering the valid outline. Bind it on the `matInput` as\n * `[errorStateMatcher]=\"errorStateMatcher\"`.\n */\n protected errorStateMatcher: ErrorStateMatcher = {\n isErrorState: (_control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean => {\n const host: NgControl | null = this.hostControl();\n if (!host) {\n return false;\n }\n return !!host.invalid && (!!host.touched || this.touched() || !!form?.submitted);\n }\n };\n #injector: Injector = inject(Injector);\n // Resolved lazily: injecting NgControl in the constructor would close the DI cycle through\n // NG_VALUE_ACCESSOR, which every control provides with `useExisting`.\n #hostControl: NgControl | null | undefined = undefined;\n\n registerOnChange(fn: () => void): void {\n this.onPropagateValue = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n if (isDisabled) {\n this.ctrl.disable();\n } else {\n this.ctrl.enable();\n }\n }\n\n writeValue(value: string | FormData | Date | null): void {\n this.ctrl.setValue(value, { emitEvent: false });\n }\n\n markAsTouched() {\n this.touched.set(true);\n this.onTouch();\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n return this.ctrl.errors;\n }\n\n /**\n * The `NgControl` this component is bound to from the outside (`formControlName`,\n * `[formControl]` or `[ngModel]`), or `null` when it is used without one.\n */\n protected hostControl(): NgControl | null {\n if (this.#hostControl === undefined) {\n this.#hostControl = this.#injector.get(NgControl, null, { self: true });\n }\n return this.#hostControl;\n }\n\n /**\n * Whether the control currently holds no value.\n *\n * Reflected on the host as `iss-ctrl-empty`, which is what `upgrade.scss` uses to keep the\n * resting outline of an empty field: Material's own `mat-form-field-hide-placeholder` drops\n * off the moment the field is focused, so the border would change colour on focus alone.\n * Override it in a control whose value does not live on {@link ControlBase.ctrl}.\n */\n protected isEmpty(): boolean {\n const value: any = this.ctrl.getRawValue();\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n return value === null || value === undefined || value === \"\";\n }\n\n protected onTouch: () => void = () => { };\n\n protected onPropagateValue: (_: any) => void = (_: any) => { };\n\n protected emitValue(value?: any) {\n let emissionValue = this.ctrl.getRawValue();\n if (value !== undefined) {\n emissionValue = value;\n }\n this.onPropagateValue(emissionValue);\n this.emitOnChangeEvent(emissionValue);\n }\n\n protected propagateValue(value?: any) {\n let emissionValue = this.ctrl.getRawValue();\n if (value !== undefined) {\n emissionValue = value;\n }\n this.onPropagateValue(emissionValue);\n }\n\n protected emitOnChangeEvent($event?: any) {\n let emissionValue = this.ctrl.getRawValue();\n if ($event !== undefined) {\n emissionValue = $event;\n }\n this.onChange.emit(emissionValue);\n }\n}\n","import { MatDateFormats } from \"@angular/material/core\";\n\nexport const DATE_FORMAT_ADAPTER: MatDateFormats = {\n parse: {\n dateInput: \"dd/MM/yyyy\",\n timeInput: \"hh:mm:ss aa\",\n },\n display: {\n dateInput: \"dd/MM/yyyy\",\n monthYearLabel: \"MMMM yyyy\",\n dateA11yLabel: \"dd/MM/yyyy\",\n monthYearA11yLabel: \"MMMM yyyy\",\n timeInput: \"hh:mm aa\",\n timeOptionLabel: \"hh:mm aa\",\n },\n};\n\nexport const DATETIME_FORMAT = \"dd/MM/yyyy hh:mm a\";\n","/**\n * Umm al-Qura Hijri calendar helpers.\n *\n * Every function here works on a plain `Date`: a `Date` is an instant, and the Hijri\n * calendar is only another way of naming that instant. Nothing stores Hijri numbers on the\n * date itself, so a value converted to Hijri for display or emission is still the same day.\n *\n * The conversion is done by `Intl` with the `islamic-umalqura` calendar, which is the\n * calendar used officially in Saudi Arabia.\n */\n\n/** Locale used by the calendar UI when the Hijri calendar is on. */\nexport const HIJRI_LOCALE = \"ar-SA-u-ca-islamic-umalqura\";\n\n/** Latin-digit locale used internally to read the Hijri parts of a date. */\nconst HIJRI_PARTS_LOCALE = \"en-US-u-ca-islamic-umalqura\";\n\nconst MS_PER_DAY = 86_400_000;\n\n/** 1 Muharram 1445 AH, the anchor the month estimate starts from. */\nconst ANCHOR_GREGORIAN = { year: 2023, month: 6, day: 19 };\nconst ANCHOR_HIJRI_YEAR = 1445;\n\n/** Mean length of a Hijri month, used only to get close before the exact walk. */\nconst MEAN_HIJRI_MONTH = 29.530588;\n\nexport const HIJRI_MONTH_NAMES: { ar: string[]; en: string[]; enShort: string[] } = {\n ar: [\"محرم\", \"صفر\", \"ربيع الأول\", \"ربيع الآخر\", \"جمادى الأولى\", \"جمادى الآخرة\", \"رجب\", \"شعبان\", \"رمضان\", \"شوال\", \"ذو القعدة\", \"ذو الحجة\"],\n en: [\"Muharram\", \"Safar\", \"Rabi' al-Awwal\", \"Rabi' al-Thani\", \"Jumada al-Ula\", \"Jumada al-Akhirah\", \"Rajab\", \"Sha'ban\", \"Ramadan\", \"Shawwal\", \"Dhu al-Qi'dah\", \"Dhu al-Hijjah\"],\n enShort: [\"Muh\", \"Saf\", \"Rab I\", \"Rab II\", \"Jum I\", \"Jum II\", \"Raj\", \"Sha\", \"Ram\", \"Shaw\", \"Dhul-Q\", \"Dhul-H\"],\n};\n\nexport interface HijriParts {\n /** Hijri year, for example `1447`. */\n year: number;\n /** Hijri month, **zero based** like `Date.getMonth()` — `0` is Muharram. */\n month: number;\n /** Hijri day of month, starting at `1`. */\n day: number;\n}\n\nconst partsFormatter: Intl.DateTimeFormat = new Intl.DateTimeFormat(HIJRI_PARTS_LOCALE, {\n day: \"numeric\",\n month: \"numeric\",\n year: \"numeric\",\n});\n\n/**\n * Reads the Hijri year, month and day a `Date` falls on.\n */\nexport function getHijriParts(date: Date): HijriParts {\n const parts: Intl.DateTimeFormatPart[] = partsFormatter.formatToParts(date);\n const read = (type: string): number => parseInt(parts.find((part) => part.type === type)?.value ?? \"0\", 10);\n return { year: read(\"year\"), month: read(\"month\") - 1, day: read(\"day\") };\n}\n\n/**\n * The Gregorian `Date` of the first day of the Hijri month `date` falls in, at midday.\n *\n * Midday, not midnight, so a daylight-saving shift can never push the result into the\n * previous day while the month is being walked.\n */\nexport function startOfHijriMonth(date: Date): Date {\n const start: Date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12);\n start.setDate(start.getDate() - (getHijriParts(start).day - 1));\n return start;\n}\n\n/**\n * Number of days in the Hijri month `date` falls in — 29 or 30, decided by Umm al-Qura.\n */\nexport function getHijriDaysInMonth(date: Date): number {\n const start: Date = startOfHijriMonth(date);\n // +30 days from the first of a 29 or 30 day month always lands inside the next one\n const insideNextMonth: Date = new Date(start.getTime());\n insideNextMonth.setDate(insideNextMonth.getDate() + 30);\n return Math.round((startOfHijriMonth(insideNextMonth).getTime() - start.getTime()) / MS_PER_DAY);\n}\n\n/**\n * Builds the `Date` for a Hijri year/month/day. The month is zero based, and a day past the\n * end of the month is clamped to the last day of that month.\n */\nexport function createHijriDate(year: number, month: number, day: number): Date {\n const targetYear: number = year + Math.floor(month / 12);\n const targetMonth: number = ((month % 12) + 12) % 12;\n\n const monthsFromAnchor: number = (targetYear - ANCHOR_HIJRI_YEAR) * 12 + targetMonth;\n const cursor: Date = new Date(ANCHOR_GREGORIAN.year, ANCHOR_GREGORIAN.month, ANCHOR_GREGORIAN.day, 12);\n cursor.setDate(cursor.getDate() + Math.round(monthsFromAnchor * MEAN_HIJRI_MONTH));\n let start: Date = startOfHijriMonth(cursor);\n\n // the mean-month estimate drifts by a month or so over long spans; step whole months until it matches\n for (let attempt = 0; attempt < 8; attempt++) {\n const parts: HijriParts = getHijriParts(start);\n const monthsOff: number = (targetYear - parts.year) * 12 + (targetMonth - parts.month);\n if (monthsOff === 0) {\n break;\n }\n // 29 days plus a nudge in the direction of travel always lands inside the neighbouring month\n start.setDate(start.getDate() + monthsOff * 29 + Math.sign(monthsOff));\n start = startOfHijriMonth(start);\n }\n\n const clampedDay: number = Math.min(Math.max(day, 1), getHijriDaysInMonth(start));\n start.setDate(start.getDate() + clampedDay - 1);\n start.setHours(0, 0, 0, 0);\n return start;\n}\n\n/**\n * Formats a date as a Hijri `yyyy-MM-dd` string — the shape the form emits when\n * `emitHijri` is on.\n */\nexport function formatHijriDate(date: Date): string {\n const parts: HijriParts = getHijriParts(date);\n return `${pad(parts.year, 4)}-${pad(parts.month + 1, 2)}-${pad(parts.day, 2)}`;\n}\n\n/**\n * Reads a Hijri date back into a `Date`, accepting both the emitted `yyyy-MM-dd` shape and\n * the `dd/MM/yyyy` shape shown in the input. Returns `null` for anything else.\n */\nexport function parseHijriDate(value: string | null | undefined): Date | null {\n if (!value) {\n return null;\n }\n // strip the bidi marks Intl adds around Arabic-locale dates\n const clean: string = value.replace(/[]/g, \"\").trim();\n\n const iso: RegExpMatchArray | null = clean.match(/^(\\d{3,4})-(\\d{1,2})-(\\d{1,2})/);\n if (iso) {\n return createHijriDate(+iso[1], +iso[2] - 1, +iso[3]);\n }\n\n const slashed: RegExpMatchArray | null = clean.match(/^(\\d{1,2})[/-](\\d{1,2})[/-](\\d{3,4})$/);\n if (slashed) {\n return createHijriDate(+slashed[3], +slashed[2] - 1, +slashed[1]);\n }\n\n return null;\n}\n\nfunction pad(value: number, length: number): string {\n return String(value).padStart(length, \"0\");\n}\n\n/**\n * Renders a stored form value as a Hijri `dd/MM/yyyy` string for the read-only viewers, or\n * returns `null` when the field is not on the Hijri calendar and the value should be shown\n * as an ordinary Gregorian date.\n *\n * The two Hijri modes store different things, so they are read differently: with `emitHijri`\n * the value already carries Hijri numbers and only its notation changes, while with\n * `hijriCalendar` alone the value is Gregorian and has to be converted.\n */\nexport function toHijriDisplay(\n value: string | null | undefined,\n options: { hijriCalendar?: boolean; emitHijri?: boolean; withTime?: boolean }\n): string | null {\n if (!value || (!options.hijriCalendar && !options.emitHijri)) {\n return null;\n }\n\n let datePart: string;\n let hours: number;\n let minutes: number;\n\n if (options.emitHijri) {\n const matched: RegExpMatchArray | null = value.match(/^(\\d{3,4})-(\\d{1,2})-(\\d{1,2})(?:[T ](\\d{1,2}):(\\d{2}))?/);\n if (!matched) {\n return null;\n }\n datePart = `${pad(+matched[3], 2)}/${pad(+matched[2], 2)}/${pad(+matched[1], 4)}`;\n hours = +(matched[4] ?? 0);\n minutes = +(matched[5] ?? 0);\n } else {\n const date: Date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n const parts: HijriParts = getHijriParts(date);\n datePart = `${pad(parts.day, 2)}/${pad(parts.month + 1, 2)}/${pad(parts.year, 4)}`;\n hours = date.getHours();\n minutes = date.getMinutes();\n }\n\n if (!options.withTime) {\n return datePart;\n }\n return `${datePart} ${pad(hours % 12 || 12, 2)}:${pad(minutes, 2)} ${hours < 12 ? \"AM\" : \"PM\"}`;\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, input, InputSignal } from \"@angular/core\";\nimport { MatHint } from \"@angular/material/form-field\";\nimport { Hint } from \"./hint\";\n\n@Component({\n selector: \"iss-ctrl-hints\",\n imports: [MatHint,],\n template: `\n @if (hints().length) {\n <div class=\"d-flex align-items-center flex-wrap gap-2 mb-3\">\n @for (hint of hints(); track $index) {\n @if (hint) {\n <mat-hint [align]=\"hint.align\" class=\"d-flex align-items-center gap-1 fs-12\">\n @if (hint.valid === undefined) {\n <ds-icon icon=\"info\" class=\"fs-24 fc-dark-gray\"></ds-icon>\n <span class=\"fc-dark-gray text-break\">{{ hint.label }}</span>\n } @else {\n <ds-icon\n icon=\"{{ touched() ? (hint.valid ? 'check-circle-f' : 'close-circle') : 'check-circle-o' }}\"\n class=\"fs-24 {{ touched() ? (hint.valid ? 'fc-green' : 'fc-red') : 'fc-dark-gray' }}\"\n >\n </ds-icon>\n <span\n class=\"{{ touched() ? (hint.valid ? 'fc-green' : 'fc-red') : 'fc-dark-gray' }} text-break\"\n >{{ hint.label }}</span>\n }\n </mat-hint>\n }\n }\n </div>\n }\n `,\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class Hints {\n hints: InputSignal<Hint[]> = input<Hint[]>([]);\n touched: InputSignal<boolean> = input(false);\n}\n","import { inject, Injectable, Provider } from \"@angular/core\";\nimport { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, NativeDateAdapter } from \"@angular/material/core\";\nimport { DATE_FORMAT_ADAPTER } from \"./date-format.const\";\nimport { UI_LANGUAGE } from \"iss-ctrl/tokens\";\nimport { createHijriDate, getHijriDaysInMonth, getHijriParts, HIJRI_LOCALE, HIJRI_MONTH_NAMES, HijriParts, parseHijriDate } from \"./hijri.util\";\n\n/**\n * The single date adapter behind every `iss-ctrl-*` picker.\n *\n * It behaves as a plain Gregorian adapter — `dd/MM/yyyy` in and out — until its locale is\n * switched to {@link HIJRI_LOCALE}, at which point the whole calendar grid becomes Umm\n * al-Qura Hijri: the month lengths, the year and month labels and the day numbers all come\n * from the Hijri calendar.\n *\n * The value never changes shape. The adapter always works on a `Date`, so a Hijri calendar\n * still hands the control an ordinary `Date`, and it stays the control's decision whether to\n * emit that as a Gregorian or a Hijri string.\n *\n * Switch modes through {@link setHijri}, never by assigning `locale` — `setLocale` is what\n * tells an open calendar to re-render.\n */\n@Injectable()\nexport class IssDateAdapter extends NativeDateAdapter {\n /** The Gregorian locale to fall back to when the Hijri calendar is turned off. */\n gregorianLocale = \"en-GB\";\n #language: string | null = inject(UI_LANGUAGE, { optional: true });\n\n /** Whether the adapter is currently presenting the Hijri calendar. */\n get isHijri(): boolean {\n return typeof this.locale === \"string\" && this.locale.includes(\"islamic\");\n }\n\n /**\n * Turns the Hijri calendar on or off. Goes through `setLocale` so that a calendar that is\n * already open redraws itself.\n */\n setHijri(hijri: boolean): void {\n const locale: string = hijri ? HIJRI_LOCALE : this.gregorianLocale;\n if (this.locale !== locale) {\n this.setLocale(locale);\n }\n }\n\n override getYear(date: Date): number {\n return this.isHijri ? getHijriParts(date).year : date.getFullYear();\n }\n\n override getMonth(date: Date): number {\n return this.isHijri ? getHijriParts(date).month : date.getMonth();\n }\n\n override getDate(date: Date): number {\n return this.isHijri ? getHijriParts(date).day : date.getDate();\n }\n\n override getMonthNames(style: \"long\" | \"short\" | \"narrow\"): string[] {\n if (!this.isHijri) {\n return super.getMonthNames(style);\n }\n if (this.#language === \"en\") {\n return style === \"long\" ? HIJRI_MONTH_NAMES.en : HIJRI_MONTH_NAMES.enShort;\n }\n return HIJRI_MONTH_NAMES.ar;\n }\n\n override getDateNames(): string[] {\n // a Hijri month never runs past 30 days, but the calendar body indexes this array by\n // day number, so it must stay as long as the Gregorian one\n return this.isHijri ? Array.from({ length: 31 }, (_, index) => String(index + 1)) : super.getDateNames();\n }\n\n override getDayOfWeekNames(style: \"long\" | \"short\" | \"narrow\"): string[] {\n if (!this.isHijri) {\n return super.getDayOfWeekNames(style);\n }\n // the week is the same week in both calendars, so only the language of the names changes\n const names: Intl.DateTimeFormat = new Intl.DateTimeFormat(this.#language === \"en\" ? \"en-GB\" : \"ar\", { weekday: style, timeZone: \"utc\" });\n return Array.from({ length: 7 }, (_, index) => names.format(new Date(Date.UTC(2017, 0, index + 1))));\n }\n\n override getYearName(date: Date): string {\n return this.isHijri ? String(getHijriParts(date).year) : String(date.getFullYear());\n }\n\n override getFirstDayOfWeek(): number {\n return this.isHijri ? 0 : super.getFirstDayOfWeek();\n }\n\n override getNumDaysInMonth(date: Date): number {\n return this.isHijri ? getHijriDaysInMonth(date) : super.getNumDaysInMonth(date);\n }\n\n override createDate(year: number, month: number, date: number): Date {\n return this.isHijri ? createHijriDate(year, month, date) : super.createDate(year, month, date);\n }\n\n override addCalendarYears(date: Date, years: number): Date {\n return this.addCalendarMonths(date, years * 12);\n }\n\n override addCalendarMonths(date: Date, months: number): Date {\n if (!this.isHijri) {\n return super.addCalendarMonths(date, months);\n }\n const parts: HijriParts = getHijriParts(date);\n return this.#withTimeOf(createHijriDate(parts.year, parts.month + months, parts.day), date);\n }\n\n override addCalendarDays(date: Date, days: number): Date {\n if (!this.isHijri) {\n return super.addCalendarDays(date, days);\n }\n // a Hijri day is the same day, so this is plain Gregorian day arithmetic\n const shifted: Date = new Date(date.getTime());\n shifted.setDate(shifted.getDate() + days);\n return shifted;\n }\n\n override parse(value: any, parseFormat?: any): Date | null {\n if (typeof value !== \"string\") {\n return super.parse(value, parseFormat);\n }\n const clean: string = value.replace(/[]/g, \"\").trim();\n if (!clean) {\n return null;\n }\n\n if (this.isHijri) {\n return parseHijriDate(clean) ?? this.invalid();\n }\n\n const slashed: RegExpMatchArray | null = clean.match(/^(\\d{1,2})[/-](\\d{1,2})[/-](\\d{4})$/);\n if (slashed) {\n return new Date(+slashed[3], +slashed[2] - 1, +slashed[1]);\n }\n return super.parse(clean, parseFormat);\n }\n\n override format(date: Date, displayFormat: string): string {\n if (!this.isValid(date)) {\n throw Error(\"IssDateAdapter: Cannot format invalid date.\");\n }\n const year: number = this.getYear(date);\n const month: number = this.getMonth(date);\n const day: number = this.getDate(date);\n\n // NativeDateAdapter formats through Intl in UTC, which shifts the day for anyone west of\n // Greenwich; formatting the parts we already read keeps the rendered day the picked one.\n // One pass, so a substituted month name can never be re-read as a token.\n return (displayFormat ?? \"dd/MM/yyyy\").replace(/yyyy|MMMM|MMM|MM|dd/g, (token: string) => {\n switch (token) {\n case \"yyyy\":\n return String(year).padStart(4, \"0\");\n case \"MMMM\":\n return this.getMonthNames(\"long\")[month];\n case \"MMM\":\n return this.getMonthNames(\"short\")[month];\n case \"MM\":\n return String(month + 1).padStart(2, \"0\");\n default:\n return String(day).padStart(2, \"0\");\n }\n });\n }\n\n override deserialize(value: any): Date | null {\n // `yyyy-MM-dd` is a calendar day, not an instant: NativeDateAdapter reads it as UTC\n // midnight, which renders as the previous day in any negative-offset zone\n if (typeof value === \"string\") {\n const iso: RegExpMatchArray | null = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (iso) {\n return new Date(+iso[1], +iso[2] - 1, +iso[3]);\n }\n }\n return super.deserialize(value);\n }\n\n override toIso8601(date: Date): string {\n return [String(date.getFullYear()).padStart(4, \"0\"), String(date.getMonth() + 1).padStart(2, \"0\"), String(date.getDate()).padStart(2, \"0\")].join(\"-\");\n }\n\n #withTimeOf(date: Date, source: Date): Date {\n const result: Date = new Date(date.getTime());\n result.setHours(source.getHours(), source.getMinutes(), source.getSeconds(), source.getMilliseconds());\n return result;\n }\n}\n\n/**\n * Providers every date-based control needs: the {@link IssDateAdapter} itself, the Gregorian\n * locale it falls back to, and the `dd/MM/yyyy` formats both of its calendars are rendered in.\n *\n * Declared per component, so each picker owns its adapter instance and one field switching to\n * the Hijri calendar leaves every other field on the form alone.\n */\nexport function provideIssDateAdapter(): Provider[] {\n return [\n { provide: MAT_DATE_LOCALE, useValue: \"en-GB\" },\n { provide: DateAdapter, useClass: IssDateAdapter },\n { provide: MAT_DATE_FORMATS, useValue: DATE_FORMAT_ADAPTER },\n ];\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\nimport { Option } from \"./option\";\n\n@Pipe({name: \"selectStatus\"})\nexport class SelectStatusPipe implements PipeTransform {\n transform(option: Option, ...args: unknown[]): boolean {\n const selectedOptions = args[0] as Map<string, Option>;\n return selectedOptions.has(option.value);\n }\n}\n","import { Component, input, InputSignal } from \"@angular/core\";\r\n\r\n@Component({template: ``})\r\nexport class ViewerBase {\r\n field: InputSignal<any> = input.required();\r\n}\r\n","// The pieces every control is built from.\n//\n// These live in their own entry point so each control can be published as one too without\n// depending on the primary entry point — which owns the COMPONENTS/VIEWERS indexes and\n// would therefore close a dependency cycle. Nothing here may import from `iss-ctrl`.\n\nexport * from \"./control-base\";\nexport * from \"./date-format.const\";\nexport * from \"./hijri.util\";\nexport * from \"./hint\";\nexport * from \"./hints\";\nexport * from \"./iss-date-adapter\";\nexport * from \"./option\";\nexport * from \"./select-status.pipe\";\nexport * from \"./viewer-base\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Component } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/forms';
|
|
4
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
5
|
+
import { F as FieldBase, V as VIEW_PROVIDER, a as ValidationMessage, b as FieldViewer } from './iss-ctrl-iss-ctrl-DvnkwSMG.mjs';
|
|
6
|
+
import { CheckboxControl } from 'iss-ctrl/checkbox';
|
|
7
|
+
import { CheckboxViewer } from './iss-ctrl-checkbox.viewer-C3SEUszR.mjs';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* `<iss-field-checkbox>` — a list of checkboxes over a fixed set of options.
|
|
11
|
+
*
|
|
12
|
+
* Rendered by the outlet for fields of type `checkbox`. In `edit` mode it renders
|
|
13
|
+
* {@link CheckboxControl} plus the validation message; in `view` mode the matching viewer.
|
|
14
|
+
*
|
|
15
|
+
* ### Supported `config` keys
|
|
16
|
+
* | Key | Type | Description |
|
|
17
|
+
* | --- | --- | --- |
|
|
18
|
+
* | `hideLabel` | `boolean` | Hides the field label. |
|
|
19
|
+
* | `readonly` | `boolean` | Shows the value but blocks interaction. |
|
|
20
|
+
*
|
|
21
|
+
* ### Other field members used
|
|
22
|
+
* `label()` · `options()`
|
|
23
|
+
*
|
|
24
|
+
* Every field also honours `visible`, `mode`, `validation`, `asyncValidation` and
|
|
25
|
+
* `events` — see {@link IssField} for the full model and {@link FieldConfig} for all keys.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```json
|
|
29
|
+
* { "name": "days", "type": "checkbox", "label": "Days", "options": [{ "value": "sun", "label": "Sunday" }] }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
class CheckboxField extends FieldBase {
|
|
33
|
+
updateField($event) {
|
|
34
|
+
this.field.ctrlJsonValue.set($event);
|
|
35
|
+
}
|
|
36
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckboxField, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
37
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CheckboxField, isStandalone: true, selector: "iss-field-checkbox", usesInheritance: true, ngImport: i0, template: `
|
|
38
|
+
@if (field.visible()) {
|
|
39
|
+
@if (field.mode() === "edit") {
|
|
40
|
+
<iss-ctrl-checkbox [formControlName]="field.name" [options]="field.options()" [readonly]="field.config.readonly() ?? false" (onChange)="updateField($event)">
|
|
41
|
+
@if (!field.config.hideLabel()) {
|
|
42
|
+
<label>{{ field.label() }}</label>
|
|
43
|
+
}
|
|
44
|
+
</iss-ctrl-checkbox>
|
|
45
|
+
<iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
|
|
46
|
+
} @else {
|
|
47
|
+
<iss-field-viewer>
|
|
48
|
+
@if (!field.config.hideLabel()) {
|
|
49
|
+
<label>{{ field.label() }}</label>
|
|
50
|
+
}
|
|
51
|
+
<iss-viewer-checkbox [field]="field"/>
|
|
52
|
+
</iss-field-viewer>
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CheckboxControl, selector: "iss-ctrl-checkbox", inputs: ["options"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: CheckboxViewer, selector: "iss-viewer-checkbox" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckboxField, decorators: [{
|
|
58
|
+
type: Component,
|
|
59
|
+
args: [{
|
|
60
|
+
selector: "iss-field-checkbox",
|
|
61
|
+
viewProviders: [VIEW_PROVIDER],
|
|
62
|
+
imports: [
|
|
63
|
+
ReactiveFormsModule,
|
|
64
|
+
CheckboxControl,
|
|
65
|
+
ValidationMessage,
|
|
66
|
+
CheckboxViewer,
|
|
67
|
+
FieldViewer
|
|
68
|
+
],
|
|
69
|
+
template: `
|
|
70
|
+
@if (field.visible()) {
|
|
71
|
+
@if (field.mode() === "edit") {
|
|
72
|
+
<iss-ctrl-checkbox [formControlName]="field.name" [options]="field.options()" [readonly]="field.config.readonly() ?? false" (onChange)="updateField($event)">
|
|
73
|
+
@if (!field.config.hideLabel()) {
|
|
74
|
+
<label>{{ field.label() }}</label>
|
|
75
|
+
}
|
|
76
|
+
</iss-ctrl-checkbox>
|
|
77
|
+
<iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
|
|
78
|
+
} @else {
|
|
79
|
+
<iss-field-viewer>
|
|
80
|
+
@if (!field.config.hideLabel()) {
|
|
81
|
+
<label>{{ field.label() }}</label>
|
|
82
|
+
}
|
|
83
|
+
<iss-viewer-checkbox [field]="field"/>
|
|
84
|
+
</iss-field-viewer>
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
`
|
|
88
|
+
}]
|
|
89
|
+
}] });
|
|
90
|
+
|
|
91
|
+
export { CheckboxField };
|
|
92
|
+
//# sourceMappingURL=iss-ctrl-checkbox.field-Dj5EGLUr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-checkbox.field-Dj5EGLUr.mjs","sources":["../../../projects/iss/src/components/controls/checkbox/checkbox.field.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\nimport { VIEW_PROVIDER } from \"../../../shared/constants/view-provider.const\";\nimport { FieldViewer } from \"../../shared/field-viewer\";\nimport { ValidationMessage } from \"../../shared/validation-message\";\nimport { FieldBase } from \"../base/field-base\";\nimport { CheckboxControl } from \"iss-ctrl/checkbox\";\nimport { CheckboxViewer } from \"./checkbox.viewer\";\n\n/**\n * `<iss-field-checkbox>` — a list of checkboxes over a fixed set of options.\n *\n * Rendered by the outlet for fields of type `checkbox`. In `edit` mode it renders\n * {@link CheckboxControl} plus the validation message; in `view` mode the matching viewer.\n *\n * ### Supported `config` keys\n * | Key | Type | Description |\n * | --- | --- | --- |\n * | `hideLabel` | `boolean` | Hides the field label. |\n * | `readonly` | `boolean` | Shows the value but blocks interaction. |\n *\n * ### Other field members used\n * `label()` · `options()`\n *\n * Every field also honours `visible`, `mode`, `validation`, `asyncValidation` and\n * `events` — see {@link IssField} for the full model and {@link FieldConfig} for all keys.\n *\n * @example\n * ```json\n * { \"name\": \"days\", \"type\": \"checkbox\", \"label\": \"Days\", \"options\": [{ \"value\": \"sun\", \"label\": \"Sunday\" }] }\n * ```\n */\n@Component({\n selector: \"iss-field-checkbox\",\n viewProviders: [VIEW_PROVIDER],\n imports: [\n ReactiveFormsModule,\n CheckboxControl,\n ValidationMessage,\n CheckboxViewer,\n FieldViewer\n ],\n template: `\n @if (field.visible()) {\n @if (field.mode() === \"edit\") {\n <iss-ctrl-checkbox [formControlName]=\"field.name\" [options]=\"field.options()\" [readonly]=\"field.config.readonly() ?? false\" (onChange)=\"updateField($event)\">\n @if (!field.config.hideLabel()) {\n <label>{{ field.label() }}</label>\n }\n </iss-ctrl-checkbox>\n <iss-validation-message-viewer [errors]=\"ctrl.errors\" [showMessage]=\"!ctrl.untouched\"/>\n } @else {\n <iss-field-viewer>\n @if (!field.config.hideLabel()) {\n <label>{{ field.label() }}</label>\n }\n <iss-viewer-checkbox [field]=\"field\"/>\n </iss-field-viewer>\n }\n }\n `\n})\nexport class CheckboxField extends FieldBase {\n updateField($event: any) {\n this.field.ctrlJsonValue.set($event);\n }\n}\n"],"names":[],"mappings":";;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AA+BG,MAAO,aAAc,SAAQ,SAAS,CAAA;AAC1C,IAAA,WAAW,CAAC,MAAW,EAAA;QACrB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IACtC;uGAHW,aAAa,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApBd;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAxBC,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,cAAc,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,aAAA,EANE,CAAC,aAAa,CAAC,EAAA,CAAA;;2FA4BnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBA9BzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;oBAC9B,aAAa,EAAE,CAAC,aAAa,CAAC;AAC9B,oBAAA,OAAO,EAAE;wBACP,mBAAmB;wBACnB,eAAe;wBACf,iBAAiB;wBACjB,cAAc;wBACd;AACD,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;AAkBT,EAAA;AACF,iBAAA;;;;;"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, signal, Component } from '@angular/core';
|
|
3
|
+
import { ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import * as i1 from '@angular/material/checkbox';
|
|
5
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
6
|
+
import { ControlBase, SelectStatusPipe } from 'iss-ctrl/base';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* `<iss-ctrl-checkbox>` — a list of checkboxes over a fixed set of options.
|
|
10
|
+
*
|
|
11
|
+
* The form value is the comma separated list of selected option values, while `(onChange)`
|
|
12
|
+
* emits the resolved `Option[]` (or `null` when nothing is selected).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```html
|
|
16
|
+
* <iss-ctrl-checkbox formControlName="days" [options]="days" (onChange)="pick($event)"/>
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* ### Own inputs
|
|
20
|
+
* | Property | Type | Default | Description |
|
|
21
|
+
* | --- | --- | --- | --- |
|
|
22
|
+
* | `options` | `Option[]` | **required** | The selectable choices. |
|
|
23
|
+
*
|
|
24
|
+
* ### Inherited from {@link ControlBase}
|
|
25
|
+
* `formControlName` · `readonly` · `className` · `(onChange)`
|
|
26
|
+
*
|
|
27
|
+
* Does not project a label — the field label is rendered by the wrapping `iss-field-*`.
|
|
28
|
+
*/
|
|
29
|
+
class CheckboxControl extends ControlBase {
|
|
30
|
+
/**
|
|
31
|
+
* Selectable choices, each a `{ value, label }` pair. Required.
|
|
32
|
+
*/
|
|
33
|
+
options = input.required(...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
34
|
+
/**
|
|
35
|
+
* Currently checked options, keyed by value. Internal state, not an input.
|
|
36
|
+
*/
|
|
37
|
+
selectedOptions = signal(new Map(), ...(ngDevMode ? [{ debugName: "selectedOptions" }] : /* istanbul ignore next */ []));
|
|
38
|
+
writeValue(value) {
|
|
39
|
+
this.#reset();
|
|
40
|
+
if (value === null || value === undefined) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const values = value.split(",").map((val) => val.trim());
|
|
44
|
+
const selectedOptions = this.options().filter((option) => values.includes(option.value));
|
|
45
|
+
this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOptions));
|
|
46
|
+
this.ctrl.setValue(selectedOptions);
|
|
47
|
+
}
|
|
48
|
+
addToSelectedOptionsMap(option) {
|
|
49
|
+
if (option) {
|
|
50
|
+
this.selectedOptions.set(option);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
onCheckboxChange(checked, value) {
|
|
54
|
+
if (this.readonly()) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.markAsTouched();
|
|
58
|
+
const selectedOption = this.options().find((option) => option.value === value);
|
|
59
|
+
if (!selectedOption) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const options = new Map(this.selectedOptions());
|
|
63
|
+
if (checked) {
|
|
64
|
+
options.set(selectedOption.value, selectedOption);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
options.delete(selectedOption.value);
|
|
68
|
+
}
|
|
69
|
+
this.getEmissionValue(options);
|
|
70
|
+
}
|
|
71
|
+
stringifySelectedOptions() {
|
|
72
|
+
if (!this.selectedOptions()?.size) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return Array.from(this.selectedOptions(), ([value]) => value).join();
|
|
76
|
+
}
|
|
77
|
+
getEmissionValue(options) {
|
|
78
|
+
this.addToSelectedOptionsMap(options);
|
|
79
|
+
// the form keeps the stringified values, while (onChange) consumers get the resolved options
|
|
80
|
+
this.propagateValue(this.stringifySelectedOptions());
|
|
81
|
+
this.emitOnChangeEvent(this.#convertSelectedMapToArray());
|
|
82
|
+
}
|
|
83
|
+
#convertSelectedMapToArray() {
|
|
84
|
+
const selectedOptions = Array.from(this.selectedOptions().values());
|
|
85
|
+
return selectedOptions.length ? selectedOptions : null;
|
|
86
|
+
}
|
|
87
|
+
#selectedOptionsMapFactory(selectedOptions) {
|
|
88
|
+
const selectedOptionsMap = new Map();
|
|
89
|
+
for (const option of selectedOptions) {
|
|
90
|
+
selectedOptionsMap.set(option.value, option);
|
|
91
|
+
}
|
|
92
|
+
return selectedOptionsMap;
|
|
93
|
+
}
|
|
94
|
+
#reset() {
|
|
95
|
+
this.selectedOptions.set(new Map());
|
|
96
|
+
this.ctrl.setValue(null);
|
|
97
|
+
}
|
|
98
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckboxControl, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
99
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CheckboxControl, isStandalone: true, selector: "iss-ctrl-checkbox", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
100
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: CheckboxControl, multi: true },
|
|
101
|
+
], usesInheritance: true, ngImport: i0, template: `
|
|
102
|
+
<ul class="list-unstyled">
|
|
103
|
+
@for (option of options(); track option.value) {
|
|
104
|
+
<li class="mb-2">
|
|
105
|
+
<mat-checkbox [checked]="option | selectStatus: selectedOptions()" [disabled]="disabled() || readonly()" (change)="onCheckboxChange($event.checked, option.value)">
|
|
106
|
+
{{ option.label }}
|
|
107
|
+
</mat-checkbox>
|
|
108
|
+
</li>
|
|
109
|
+
}
|
|
110
|
+
</ul>
|
|
111
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i1.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: SelectStatusPipe, name: "selectStatus" }] });
|
|
112
|
+
}
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckboxControl, decorators: [{
|
|
114
|
+
type: Component,
|
|
115
|
+
args: [{
|
|
116
|
+
selector: "iss-ctrl-checkbox",
|
|
117
|
+
imports: [ReactiveFormsModule, MatCheckboxModule, SelectStatusPipe],
|
|
118
|
+
providers: [
|
|
119
|
+
{ provide: NG_VALUE_ACCESSOR, useExisting: CheckboxControl, multi: true },
|
|
120
|
+
],
|
|
121
|
+
template: `
|
|
122
|
+
<ul class="list-unstyled">
|
|
123
|
+
@for (option of options(); track option.value) {
|
|
124
|
+
<li class="mb-2">
|
|
125
|
+
<mat-checkbox [checked]="option | selectStatus: selectedOptions()" [disabled]="disabled() || readonly()" (change)="onCheckboxChange($event.checked, option.value)">
|
|
126
|
+
{{ option.label }}
|
|
127
|
+
</mat-checkbox>
|
|
128
|
+
</li>
|
|
129
|
+
}
|
|
130
|
+
</ul>
|
|
131
|
+
`
|
|
132
|
+
}]
|
|
133
|
+
}], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }] } });
|
|
134
|
+
|
|
135
|
+
// The checkbox control. Its field and viewer stay in the primary entry point and reach it
|
|
136
|
+
// from there, so the control ships only to an app that renders it or imports it directly.
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Generated bundle index. Do not edit.
|
|
140
|
+
*/
|
|
141
|
+
|
|
142
|
+
export { CheckboxControl };
|
|
143
|
+
//# sourceMappingURL=iss-ctrl-checkbox.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-checkbox.mjs","sources":["../../../projects/iss/checkbox/src/checkbox.control.ts","../../../projects/iss/checkbox/src/public-api.ts","../../../projects/iss/checkbox/src/iss-ctrl-checkbox.ts"],"sourcesContent":["import { Component, input, InputSignal, signal, WritableSignal } from \"@angular/core\";\nimport { NG_VALUE_ACCESSOR, ReactiveFormsModule } from \"@angular/forms\";\nimport { MatCheckboxModule } from \"@angular/material/checkbox\";\nimport { Option } from \"iss-ctrl/base\";\nimport { SelectStatusPipe } from \"iss-ctrl/base\";\nimport { ControlBase } from \"iss-ctrl/base\";\n\n/**\n * `<iss-ctrl-checkbox>` — a list of checkboxes over a fixed set of options.\n *\n * The form value is the comma separated list of selected option values, while `(onChange)`\n * emits the resolved `Option[]` (or `null` when nothing is selected).\n *\n * @example\n * ```html\n * <iss-ctrl-checkbox formControlName=\"days\" [options]=\"days\" (onChange)=\"pick($event)\"/>\n * ```\n *\n * ### Own inputs\n * | Property | Type | Default | Description |\n * | --- | --- | --- | --- |\n * | `options` | `Option[]` | **required** | The selectable choices. |\n *\n * ### Inherited from {@link ControlBase}\n * `formControlName` · `readonly` · `className` · `(onChange)`\n *\n * Does not project a label — the field label is rendered by the wrapping `iss-field-*`.\n */\n@Component({\n selector: \"iss-ctrl-checkbox\",\n imports: [ReactiveFormsModule, MatCheckboxModule, SelectStatusPipe],\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: CheckboxControl, multi: true },\n ],\n template: `\n <ul class=\"list-unstyled\">\n @for (option of options(); track option.value) {\n <li class=\"mb-2\">\n <mat-checkbox [checked]=\"option | selectStatus: selectedOptions()\" [disabled]=\"disabled() || readonly()\" (change)=\"onCheckboxChange($event.checked, option.value)\">\n {{ option.label }}\n </mat-checkbox>\n </li>\n }\n </ul>\n `\n})\nexport class CheckboxControl extends ControlBase {\n /**\n * Selectable choices, each a `{ value, label }` pair. Required.\n */\n options: InputSignal<Option[]> = input.required();\n /**\n * Currently checked options, keyed by value. Internal state, not an input.\n */\n selectedOptions: WritableSignal<Map<string, Option>> = signal(new Map<string, Option>());\n\n override writeValue(value: string | null) {\n this.#reset();\n if (value === null || value === undefined) {\n return;\n }\n const values: string[] = value.split(\",\").map((val: string) => val.trim());\n const selectedOptions: Option[] = this.options().filter((option: Option) => values.includes(option.value));\n this.addToSelectedOptionsMap(this.#selectedOptionsMapFactory(selectedOptions));\n this.ctrl.setValue(selectedOptions);\n }\n\n addToSelectedOptionsMap(option: Map<string, Option>) {\n if (option) {\n this.selectedOptions.set(option);\n }\n }\n\n onCheckboxChange(checked: boolean, value: string) {\n if (this.readonly()) {\n return;\n }\n this.markAsTouched();\n const selectedOption = this.options().find((option: Option) => option.value === value);\n\n if (!selectedOption) {\n return;\n }\n\n const options: Map<string, Option> = new Map(this.selectedOptions());\n if (checked) {\n options.set(selectedOption.value, selectedOption);\n } else {\n options.delete(selectedOption.value);\n }\n this.getEmissionValue(options);\n }\n\n stringifySelectedOptions(): string | null {\n if (!this.selectedOptions()?.size) {\n return null;\n }\n return Array.from(this.selectedOptions(), ([value]) => value).join();\n }\n\n getEmissionValue(options: any) {\n this.addToSelectedOptionsMap(options);\n // the form keeps the stringified values, while (onChange) consumers get the resolved options\n this.propagateValue(this.stringifySelectedOptions());\n this.emitOnChangeEvent(this.#convertSelectedMapToArray());\n }\n\n #convertSelectedMapToArray(): Option[] | null {\n const selectedOptions: Option[] = Array.from(this.selectedOptions().values());\n return selectedOptions.length ? selectedOptions : null;\n }\n\n #selectedOptionsMapFactory(selectedOptions: Option[]) {\n const selectedOptionsMap: Map<string, Option> = new Map();\n for (const option of selectedOptions) {\n selectedOptionsMap.set(option.value, option);\n }\n return selectedOptionsMap;\n }\n\n #reset() {\n this.selectedOptions.set(new Map<string, Option>());\n this.ctrl.setValue(null);\n }\n}\n","// The checkbox control. Its field and viewer stay in the primary entry point and reach it\n// from there, so the control ships only to an app that renders it or imports it directly.\n\nexport * from \"./checkbox.control\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Component } from '@angular/core';
|
|
3
|
+
import { ViewerBase } from 'iss-ctrl/base';
|
|
4
|
+
|
|
5
|
+
class CheckboxViewer extends ViewerBase {
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckboxViewer, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
7
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CheckboxViewer, isStandalone: true, selector: "iss-viewer-checkbox", usesInheritance: true, ngImport: i0, template: `
|
|
8
|
+
<p>
|
|
9
|
+
@for (item of field().ctrlJsonValue(); track item?.value; let last = $last) {
|
|
10
|
+
<span>{{ item.label }} {{ last ? '' : ', ' }}</span>
|
|
11
|
+
}
|
|
12
|
+
</p>
|
|
13
|
+
`, isInline: true });
|
|
14
|
+
}
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckboxViewer, decorators: [{
|
|
16
|
+
type: Component,
|
|
17
|
+
args: [{
|
|
18
|
+
selector: "iss-viewer-checkbox",
|
|
19
|
+
standalone: true,
|
|
20
|
+
template: `
|
|
21
|
+
<p>
|
|
22
|
+
@for (item of field().ctrlJsonValue(); track item?.value; let last = $last) {
|
|
23
|
+
<span>{{ item.label }} {{ last ? '' : ', ' }}</span>
|
|
24
|
+
}
|
|
25
|
+
</p>
|
|
26
|
+
`,
|
|
27
|
+
}]
|
|
28
|
+
}] });
|
|
29
|
+
|
|
30
|
+
export { CheckboxViewer };
|
|
31
|
+
//# sourceMappingURL=iss-ctrl-checkbox.viewer-C3SEUszR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-checkbox.viewer-C3SEUszR.mjs","sources":["../../../projects/iss/src/components/controls/checkbox/checkbox.viewer.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ViewerBase } from \"iss-ctrl/base\";\n\n@Component({\n selector: \"iss-viewer-checkbox\",\n standalone: true,\n template: `\n <p>\n @for (item of field().ctrlJsonValue(); track item?.value; let last = $last) {\n <span>{{ item.label }} {{ last ? '' : ', ' }}</span>\n }\n </p>\n `,\n})\nexport class CheckboxViewer extends ViewerBase {}\n"],"names":[],"mappings":";;;;AAcM,MAAO,cAAe,SAAQ,UAAU,CAAA;uGAAjC,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EARf;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAEU,cAAc,EAAA,UAAA,EAAA,CAAA;kBAX1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE;;;;;;AAMT,EAAA,CAAA;AACF,iBAAA;;;;;"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Component } from '@angular/core';
|
|
3
|
+
import * as i1 from '@angular/forms';
|
|
4
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
5
|
+
import { F as FieldBase, V as VIEW_PROVIDER, a as ValidationMessage, b as FieldViewer } from './iss-ctrl-iss-ctrl-DvnkwSMG.mjs';
|
|
6
|
+
import { ChipsControl } from 'iss-ctrl/chips';
|
|
7
|
+
import { ChipsViewer } from './iss-ctrl-chips.viewer-BcKT2hcq.mjs';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* `<iss-field-chips>` — free text entered as removable chips.
|
|
11
|
+
*
|
|
12
|
+
* Rendered by the outlet for fields of type `chips`. In `edit` mode it renders
|
|
13
|
+
* {@link ChipsControl} plus the validation message; in `view` mode the matching viewer.
|
|
14
|
+
*
|
|
15
|
+
* ### Supported `config` keys
|
|
16
|
+
* | Key | Type | Description |
|
|
17
|
+
* | --- | --- | --- |
|
|
18
|
+
* | `readonly` | `boolean` | Shows the value but blocks interaction. |
|
|
19
|
+
*
|
|
20
|
+
* ### Other field members used
|
|
21
|
+
* `label()`
|
|
22
|
+
*
|
|
23
|
+
* Every field also honours `visible`, `mode`, `validation`, `asyncValidation` and
|
|
24
|
+
* `events` — see {@link IssField} for the full model and {@link FieldConfig} for all keys.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```json
|
|
28
|
+
* { "name": "tags", "type": "chips", "label": "Tags" }
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
class ChipsField extends FieldBase {
|
|
32
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ChipsField, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
33
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ChipsField, isStandalone: true, selector: "iss-field-chips", usesInheritance: true, ngImport: i0, template: `
|
|
34
|
+
@if (field.visible()) {
|
|
35
|
+
@if (field.mode() === "edit") {
|
|
36
|
+
<iss-ctrl-chips [formControlName]="field.name" [readonly]="field.config.readonly() ?? false"><label>{{ field.label() }}</label></iss-ctrl-chips>
|
|
37
|
+
<iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
|
|
38
|
+
} @else {
|
|
39
|
+
<iss-field-viewer>
|
|
40
|
+
<label>{{ field.label() }}</label>
|
|
41
|
+
<iss-viewer-chips [field]="field"/>
|
|
42
|
+
</iss-field-viewer>
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ChipsControl, selector: "iss-ctrl-chips" }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: ChipsViewer, selector: "iss-viewer-chips" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
|
|
46
|
+
}
|
|
47
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ChipsField, decorators: [{
|
|
48
|
+
type: Component,
|
|
49
|
+
args: [{
|
|
50
|
+
selector: "iss-field-chips",
|
|
51
|
+
viewProviders: [VIEW_PROVIDER],
|
|
52
|
+
imports: [
|
|
53
|
+
ReactiveFormsModule,
|
|
54
|
+
ChipsControl,
|
|
55
|
+
ValidationMessage,
|
|
56
|
+
ChipsViewer,
|
|
57
|
+
FieldViewer
|
|
58
|
+
],
|
|
59
|
+
template: `
|
|
60
|
+
@if (field.visible()) {
|
|
61
|
+
@if (field.mode() === "edit") {
|
|
62
|
+
<iss-ctrl-chips [formControlName]="field.name" [readonly]="field.config.readonly() ?? false"><label>{{ field.label() }}</label></iss-ctrl-chips>
|
|
63
|
+
<iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
|
|
64
|
+
} @else {
|
|
65
|
+
<iss-field-viewer>
|
|
66
|
+
<label>{{ field.label() }}</label>
|
|
67
|
+
<iss-viewer-chips [field]="field"/>
|
|
68
|
+
</iss-field-viewer>
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
`
|
|
72
|
+
}]
|
|
73
|
+
}] });
|
|
74
|
+
|
|
75
|
+
export { ChipsField };
|
|
76
|
+
//# sourceMappingURL=iss-ctrl-chips.field-BLLAjBbP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iss-ctrl-chips.field-BLLAjBbP.mjs","sources":["../../../projects/iss/src/components/controls/chips/chips.field.ts"],"sourcesContent":["import { Component } from \"@angular/core\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\nimport { VIEW_PROVIDER } from \"../../../shared/constants/view-provider.const\";\nimport { FieldViewer } from \"../../shared/field-viewer\";\nimport { ValidationMessage } from \"../../shared/validation-message\";\nimport { FieldBase } from \"../base/field-base\";\nimport { ChipsControl } from \"iss-ctrl/chips\";\nimport { ChipsViewer } from \"./chips.viewer\";\n\n/**\n * `<iss-field-chips>` — free text entered as removable chips.\n *\n * Rendered by the outlet for fields of type `chips`. In `edit` mode it renders\n * {@link ChipsControl} plus the validation message; in `view` mode the matching viewer.\n *\n * ### Supported `config` keys\n * | Key | Type | Description |\n * | --- | --- | --- |\n * | `readonly` | `boolean` | Shows the value but blocks interaction. |\n *\n * ### Other field members used\n * `label()`\n *\n * Every field also honours `visible`, `mode`, `validation`, `asyncValidation` and\n * `events` — see {@link IssField} for the full model and {@link FieldConfig} for all keys.\n *\n * @example\n * ```json\n * { \"name\": \"tags\", \"type\": \"chips\", \"label\": \"Tags\" }\n * ```\n */\n@Component({\n selector: \"iss-field-chips\",\n viewProviders: [VIEW_PROVIDER],\n imports: [\n ReactiveFormsModule,\n ChipsControl,\n ValidationMessage,\n ChipsViewer,\n FieldViewer\n ],\n template: `\n @if (field.visible()) {\n @if (field.mode() === \"edit\") {\n <iss-ctrl-chips [formControlName]=\"field.name\" [readonly]=\"field.config.readonly() ?? false\"><label>{{ field.label() }}</label></iss-ctrl-chips>\n <iss-validation-message-viewer [errors]=\"ctrl.errors\" [showMessage]=\"!ctrl.untouched\"/>\n } @else {\n <iss-field-viewer>\n <label>{{ field.label() }}</label>\n <iss-viewer-chips [field]=\"field\"/>\n </iss-field-viewer>\n }\n }\n `\n})\nexport class ChipsField extends FieldBase {}\n"],"names":[],"mappings":";;;;;;;;AASA;;;;;;;;;;;;;;;;;;;;;AAqBG;AAyBG,MAAO,UAAW,SAAQ,SAAS,CAAA;uGAA5B,UAAU,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAdX;;;;;;;;;;;;AAYT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAlBC,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,iBAAiB,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,WAAW,EAAA,QAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,aAAA,EANE,CAAC,aAAa,CAAC,EAAA,CAAA;;2FAsBnB,UAAU,EAAA,UAAA,EAAA,CAAA;kBAxBtB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;oBAC3B,aAAa,EAAE,CAAC,aAAa,CAAC;AAC9B,oBAAA,OAAO,EAAE;wBACP,mBAAmB;wBACnB,YAAY;wBACZ,iBAAiB;wBACjB,WAAW;wBACX;AACD,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;AAYT,EAAA;AACF,iBAAA;;;;;"}
|