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.
Files changed (141) hide show
  1. package/README.md +33 -0
  2. package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs +110 -0
  3. package/fesm2022/iss-ctrl-attachment.viewer-DVUL39xd.mjs.map +1 -0
  4. package/fesm2022/iss-ctrl-base.mjs +663 -0
  5. package/fesm2022/iss-ctrl-base.mjs.map +1 -0
  6. package/fesm2022/iss-ctrl-checkbox.field-Dj5EGLUr.mjs +92 -0
  7. package/fesm2022/iss-ctrl-checkbox.field-Dj5EGLUr.mjs.map +1 -0
  8. package/fesm2022/iss-ctrl-checkbox.mjs +143 -0
  9. package/fesm2022/iss-ctrl-checkbox.mjs.map +1 -0
  10. package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs +31 -0
  11. package/fesm2022/iss-ctrl-checkbox.viewer-C3SEUszR.mjs.map +1 -0
  12. package/fesm2022/iss-ctrl-chips.field-BLLAjBbP.mjs +76 -0
  13. package/fesm2022/iss-ctrl-chips.field-BLLAjBbP.mjs.map +1 -0
  14. package/fesm2022/iss-ctrl-chips.mjs +168 -0
  15. package/fesm2022/iss-ctrl-chips.mjs.map +1 -0
  16. package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs +38 -0
  17. package/fesm2022/iss-ctrl-chips.viewer-BcKT2hcq.mjs.map +1 -0
  18. package/fesm2022/iss-ctrl-date-picker.field-BSpXukpO.mjs +98 -0
  19. package/fesm2022/iss-ctrl-date-picker.field-BSpXukpO.mjs.map +1 -0
  20. package/fesm2022/iss-ctrl-date-picker.mjs +200 -0
  21. package/fesm2022/iss-ctrl-date-picker.mjs.map +1 -0
  22. package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs +40 -0
  23. package/fesm2022/iss-ctrl-date-picker.viewer-Dsmsf91t.mjs.map +1 -0
  24. package/fesm2022/iss-ctrl-date-range-picker.field-CjNHU1RW.mjs +97 -0
  25. package/fesm2022/iss-ctrl-date-range-picker.field-CjNHU1RW.mjs.map +1 -0
  26. package/fesm2022/iss-ctrl-date-range-picker.mjs +307 -0
  27. package/fesm2022/iss-ctrl-date-range-picker.mjs.map +1 -0
  28. package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs +41 -0
  29. package/fesm2022/iss-ctrl-date-range-picker.viewer-tmTQGPFh.mjs.map +1 -0
  30. package/fesm2022/iss-ctrl-datetime-picker.field-DGMY9PaU.mjs +98 -0
  31. package/fesm2022/iss-ctrl-datetime-picker.field-DGMY9PaU.mjs.map +1 -0
  32. package/fesm2022/iss-ctrl-datetime-picker.mjs +226 -0
  33. package/fesm2022/iss-ctrl-datetime-picker.mjs.map +1 -0
  34. package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs +42 -0
  35. package/fesm2022/iss-ctrl-datetime-picker.viewer-BeUyEBKo.mjs.map +1 -0
  36. package/fesm2022/iss-ctrl-file-picker.field-CbepZaX6.mjs +210 -0
  37. package/fesm2022/iss-ctrl-file-picker.field-CbepZaX6.mjs.map +1 -0
  38. package/fesm2022/iss-ctrl-file-picker.mjs +272 -0
  39. package/fesm2022/iss-ctrl-file-picker.mjs.map +1 -0
  40. package/fesm2022/iss-ctrl-input.field-Ctlf3OCN.mjs +104 -0
  41. package/fesm2022/iss-ctrl-input.field-Ctlf3OCN.mjs.map +1 -0
  42. package/fesm2022/iss-ctrl-input.mjs +204 -0
  43. package/fesm2022/iss-ctrl-input.mjs.map +1 -0
  44. package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs +22 -0
  45. package/fesm2022/iss-ctrl-input.viewer-BOZnW0_e.mjs.map +1 -0
  46. package/fesm2022/iss-ctrl-iss-ctrl-DvnkwSMG.mjs +1789 -0
  47. package/fesm2022/iss-ctrl-iss-ctrl-DvnkwSMG.mjs.map +1 -0
  48. package/fesm2022/{iss-ctrl-load-event-bOt6IlIo.mjs → iss-ctrl-load-event-CuZ7pMjk.mjs} +4 -3
  49. package/fesm2022/iss-ctrl-load-event-CuZ7pMjk.mjs.map +1 -0
  50. package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs → iss-ctrl-load-options-event-B10rhdqh.mjs} +3 -3
  51. package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs.map → iss-ctrl-load-options-event-B10rhdqh.mjs.map} +1 -1
  52. package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs → iss-ctrl-load-value-event-C-aRgKLx.mjs} +3 -3
  53. package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs.map → iss-ctrl-load-value-event-C-aRgKLx.mjs.map} +1 -1
  54. package/fesm2022/iss-ctrl-mobile.field-DXVYT3q-.mjs +77 -0
  55. package/fesm2022/iss-ctrl-mobile.field-DXVYT3q-.mjs.map +1 -0
  56. package/fesm2022/iss-ctrl-mobile.mjs +2465 -0
  57. package/fesm2022/iss-ctrl-mobile.mjs.map +1 -0
  58. package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs +22 -0
  59. package/fesm2022/iss-ctrl-mobile.viewer-DQgxAcR-.mjs.map +1 -0
  60. package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs → iss-ctrl-note.field-C8X9-mgD.mjs} +2 -2
  61. package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs.map → iss-ctrl-note.field-C8X9-mgD.mjs.map} +1 -1
  62. package/fesm2022/iss-ctrl-plate.field-aI81tAOV.mjs +92 -0
  63. package/fesm2022/iss-ctrl-plate.field-aI81tAOV.mjs.map +1 -0
  64. package/fesm2022/iss-ctrl-plate.mjs +491 -0
  65. package/fesm2022/iss-ctrl-plate.mjs.map +1 -0
  66. package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs +179 -0
  67. package/fesm2022/iss-ctrl-plate.viewer-B8PUBLH8.mjs.map +1 -0
  68. package/fesm2022/iss-ctrl-radio.field-B_JjPIlb.mjs +96 -0
  69. package/fesm2022/iss-ctrl-radio.field-B_JjPIlb.mjs.map +1 -0
  70. package/fesm2022/iss-ctrl-radio.mjs +101 -0
  71. package/fesm2022/iss-ctrl-radio.mjs.map +1 -0
  72. package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs +30 -0
  73. package/fesm2022/iss-ctrl-radio.viewer-EiDliZro.mjs.map +1 -0
  74. package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs → iss-ctrl-replace-api-keys-DLnagkOr.mjs} +2 -2
  75. package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs.map → iss-ctrl-replace-api-keys-DLnagkOr.mjs.map} +1 -1
  76. package/fesm2022/iss-ctrl-select.field-DoU4G_8t.mjs +87 -0
  77. package/fesm2022/iss-ctrl-select.field-DoU4G_8t.mjs.map +1 -0
  78. package/fesm2022/iss-ctrl-select.mjs +387 -0
  79. package/fesm2022/iss-ctrl-select.mjs.map +1 -0
  80. package/fesm2022/iss-ctrl-select.viewer-Dv9M-lG-.mjs +30 -0
  81. package/fesm2022/iss-ctrl-select.viewer-Dv9M-lG-.mjs.map +1 -0
  82. package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs → iss-ctrl-set-value-event-Dhw0Vj5J.mjs} +2 -2
  83. package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs.map → iss-ctrl-set-value-event-Dhw0Vj5J.mjs.map} +1 -1
  84. package/fesm2022/iss-ctrl-slide-toggle.field-TVVbAr6p.mjs +85 -0
  85. package/fesm2022/iss-ctrl-slide-toggle.field-TVVbAr6p.mjs.map +1 -0
  86. package/fesm2022/iss-ctrl-slide-toggle.mjs +72 -0
  87. package/fesm2022/iss-ctrl-slide-toggle.mjs.map +1 -0
  88. package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs +34 -0
  89. package/fesm2022/iss-ctrl-slide-toggle.viewer-hsIHwDj3.mjs.map +1 -0
  90. package/fesm2022/{iss-ctrl-table.field-B5FxF6hn.mjs → iss-ctrl-table.field-E0r9w0os.mjs} +142 -140
  91. package/fesm2022/iss-ctrl-table.field-E0r9w0os.mjs.map +1 -0
  92. package/fesm2022/iss-ctrl-textarea.field-CmHPDpk-.mjs +82 -0
  93. package/fesm2022/iss-ctrl-textarea.field-CmHPDpk-.mjs.map +1 -0
  94. package/fesm2022/iss-ctrl-textarea.mjs +115 -0
  95. package/fesm2022/iss-ctrl-textarea.mjs.map +1 -0
  96. package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs +22 -0
  97. package/fesm2022/iss-ctrl-textarea.viewer-CpmLauik.mjs.map +1 -0
  98. package/fesm2022/iss-ctrl-time-picker.field-Cb0I5Ut1.mjs +77 -0
  99. package/fesm2022/iss-ctrl-time-picker.field-Cb0I5Ut1.mjs.map +1 -0
  100. package/fesm2022/iss-ctrl-time-picker.mjs +170 -0
  101. package/fesm2022/iss-ctrl-time-picker.mjs.map +1 -0
  102. package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs +22 -0
  103. package/fesm2022/iss-ctrl-time-picker.viewer-CJeFLrdI.mjs.map +1 -0
  104. package/fesm2022/iss-ctrl-toggle-button.field-Bj8WrkB-.mjs +105 -0
  105. package/fesm2022/iss-ctrl-toggle-button.field-Bj8WrkB-.mjs.map +1 -0
  106. package/fesm2022/iss-ctrl-toggle-button.mjs +156 -0
  107. package/fesm2022/iss-ctrl-toggle-button.mjs.map +1 -0
  108. package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs +30 -0
  109. package/fesm2022/iss-ctrl-toggle-button.viewer-CC-8_Dy4.mjs.map +1 -0
  110. package/fesm2022/iss-ctrl-tokens.mjs +25 -0
  111. package/fesm2022/iss-ctrl-tokens.mjs.map +1 -0
  112. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs → iss-ctrl-trigger-based-on-json-value-D9rTXVD1.mjs} +2 -2
  113. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map → iss-ctrl-trigger-based-on-json-value-D9rTXVD1.mjs.map} +1 -1
  114. package/fesm2022/{iss-ctrl-user-picker.field-BH63sZ-X.mjs → iss-ctrl-user-picker.field-BIzB5ZX6.mjs} +151 -150
  115. package/fesm2022/iss-ctrl-user-picker.field-BIzB5ZX6.mjs.map +1 -0
  116. package/fesm2022/iss-ctrl.mjs +3 -1
  117. package/fesm2022/iss-ctrl.mjs.map +1 -1
  118. package/package.json +69 -1
  119. package/types/iss-ctrl-base.d.ts +306 -0
  120. package/types/iss-ctrl-checkbox.d.ts +45 -0
  121. package/types/iss-ctrl-chips.d.ts +41 -0
  122. package/types/iss-ctrl-date-picker.d.ts +75 -0
  123. package/types/iss-ctrl-date-range-picker.d.ts +95 -0
  124. package/types/iss-ctrl-datetime-picker.d.ts +77 -0
  125. package/types/iss-ctrl-file-picker.d.ts +95 -0
  126. package/types/iss-ctrl-input.d.ts +76 -0
  127. package/types/iss-ctrl-mobile.d.ts +91 -0
  128. package/types/iss-ctrl-plate.d.ts +54 -0
  129. package/types/iss-ctrl-radio.d.ts +34 -0
  130. package/types/iss-ctrl-select.d.ts +75 -0
  131. package/types/iss-ctrl-slide-toggle.d.ts +26 -0
  132. package/types/iss-ctrl-textarea.d.ts +30 -0
  133. package/types/iss-ctrl-time-picker.d.ts +48 -0
  134. package/types/iss-ctrl-toggle-button.d.ts +41 -0
  135. package/types/iss-ctrl-tokens.d.ts +21 -0
  136. package/types/iss-ctrl.d.ts +120 -1810
  137. package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs +0 -9683
  138. package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs.map +0 -1
  139. package/fesm2022/iss-ctrl-load-event-bOt6IlIo.mjs.map +0 -1
  140. package/fesm2022/iss-ctrl-table.field-B5FxF6hn.mjs.map +0 -1
  141. package/fesm2022/iss-ctrl-user-picker.field-BH63sZ-X.mjs.map +0 -1
@@ -0,0 +1,95 @@
1
+ import * as i0 from '@angular/core';
2
+ import { OutputEmitterRef, OnDestroy, InputSignal, Signal, WritableSignal } from '@angular/core';
3
+ import { ControlBase } from 'iss-ctrl/base';
4
+ import { IssAttachment } from 'iss-ctrl/tokens';
5
+
6
+ declare class Droppable {
7
+ onDrop: OutputEmitterRef<FileList>;
8
+ onDragOver(evt: any): void;
9
+ onDragLeave(evt: any): void;
10
+ onDropped(evt: any): void;
11
+ static ɵfac: i0.ɵɵFactoryDeclaration<Droppable, never>;
12
+ static ɵdir: i0.ɵɵDirectiveDeclaration<Droppable, "[droppable]", never, {}, { "onDrop": "onDrop"; }, never, never, true, never>;
13
+ }
14
+
15
+ interface IssFile {
16
+ id?: string;
17
+ name: string;
18
+ size: string | number;
19
+ type: string;
20
+ selected?: number;
21
+ errorMsg?: string;
22
+ file?: File;
23
+ }
24
+
25
+ /**
26
+ * `<iss-ctrl-file-picker>` — attachment upload with a per-file progress and error state.
27
+ *
28
+ * Uploading is done by the host: the control emits the picked files and renders whatever is
29
+ * fed back through `uploadedFiles`, `uploading` and `uploadingError`.
30
+ *
31
+ * @example
32
+ * ```html
33
+ * <iss-ctrl-file-picker
34
+ * formControlName="attachments"
35
+ * [multiple]="true"
36
+ * accept=".pdf,.png"
37
+ * [uploading]="uploading()"
38
+ * [uploadedFiles]="uploaded()"
39
+ * />
40
+ * ```
41
+ *
42
+ * ### Own inputs
43
+ * | Property | Type | Default | Description |
44
+ * | --- | --- | --- | --- |
45
+ * | `accept` | `string \| undefined` | `undefined` | Accepted extensions or MIME types for the native picker. |
46
+ * | `showDownloadButton` | `boolean` | `true` | Shows the download action on each attachment. |
47
+ * | `showDeleteButton` | `boolean` | `true` | Shows the remove action on each attachment. |
48
+ * | `uploading` | `boolean` | `false` | Renders the in-progress state. |
49
+ * | `uploadedFiles` | `IssAttachment[]` | `[]` | Files already stored on the server. |
50
+ * | `uploadingError` | `string \| undefined` | `undefined` | Error message attached to the failed upload. |
51
+ *
52
+ * ### Inherited from {@link ControlBase}
53
+ * `formControlName` · `readonly` · `className` · `(onChange)` · `multiple` · `hints`
54
+ *
55
+ * Does not project a label — the field label is rendered by the wrapping `iss-field-*`.
56
+ */
57
+ declare class FilePickerControl extends ControlBase implements OnDestroy {
58
+ #private;
59
+ /**
60
+ * Accepted extensions or MIME types, passed straight to the native file input.
61
+ */
62
+ accept: InputSignal<string | undefined>;
63
+ /**
64
+ * Shows the download action on each listed attachment.
65
+ */
66
+ showDownloadButton: InputSignal<boolean>;
67
+ /**
68
+ * Shows the remove action on each listed attachment.
69
+ */
70
+ showDeleteButton: InputSignal<boolean>;
71
+ /**
72
+ * Renders the upload-in-progress state; set by the host that performs the upload.
73
+ */
74
+ uploading: InputSignal<boolean>;
75
+ /**
76
+ * Attachments already stored on the server, merged into the rendered list.
77
+ */
78
+ uploadedFiles: InputSignal<IssAttachment[]>;
79
+ /**
80
+ * Error message shown on the attachment whose upload failed.
81
+ */
82
+ uploadingError: InputSignal<string | undefined>;
83
+ readonly filesValue: Signal<any>;
84
+ protected attachments: WritableSignal<IssFile[]>;
85
+ ngOnDestroy(): void;
86
+ writeValue(val: FormData | string | null): void;
87
+ protected onDelete(files: IssFile[]): void;
88
+ protected captureFile($event: FileList): void;
89
+ protected openFilePicker(input: HTMLInputElement): void;
90
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilePickerControl, never>;
91
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilePickerControl, "iss-ctrl-file-picker", never, { "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "showDownloadButton": { "alias": "showDownloadButton"; "required": false; "isSignal": true; }; "showDeleteButton": { "alias": "showDeleteButton"; "required": false; "isSignal": true; }; "uploading": { "alias": "uploading"; "required": false; "isSignal": true; }; "uploadedFiles": { "alias": "uploadedFiles"; "required": false; "isSignal": true; }; "uploadingError": { "alias": "uploadingError"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
92
+ }
93
+
94
+ export { Droppable, FilePickerControl };
95
+ export type { IssFile };
@@ -0,0 +1,76 @@
1
+ import * as i0 from '@angular/core';
2
+ import { OnDestroy, InputSignal, OutputEmitterRef } from '@angular/core';
3
+ import { Validator } from '@angular/forms';
4
+ import { ControlBase } from 'iss-ctrl/base';
5
+
6
+ /**
7
+ * `<iss-ctrl-input>` — single line text input, the base for every scalar text field.
8
+ *
9
+ * `type` is forwarded to the native input, so `number`, `email` and `password` variants all
10
+ * come from this one control.
11
+ *
12
+ * @example
13
+ * ```html
14
+ * <iss-ctrl-input formControlName="amount" type="number" [min]="0" suffixText="SAR">
15
+ * <label>Amount</label>
16
+ * </iss-ctrl-input>
17
+ * ```
18
+ *
19
+ * ### Own inputs
20
+ * | Property | Type | Default | Description |
21
+ * | --- | --- | --- | --- |
22
+ * | `type` | `string` | `"text"` | Native input type: `text`, `number`, `email`, `password`, … |
23
+ * | `prefixIcon` | `string` | `""` | Icon rendered before the value. |
24
+ * | `prefixText` | `string` | `""` | Text rendered before the value. |
25
+ * | `suffixIcon` | `string` | `""` | Icon rendered after the value. |
26
+ * | `suffixText` | `string` | `""` | Text rendered after the value. |
27
+ *
28
+ * ### Inherited from {@link ControlBase}
29
+ * `formControlName` · `readonly` · `className` · `(onChange)` · `placeholder` · `min` · `max` · `minLength` · `maxLength` · `hints`
30
+ *
31
+ * ### Outputs
32
+ * - `(onPrefixClick)` — `string`, the prefix affix was clicked.
33
+ * - `(onSuffixClick)` — `string`, the suffix affix was clicked.
34
+ *
35
+ * Projects `<label>` into the floating label; omit it to render the control without one.
36
+ *
37
+ * Also projects `[issPrefix]` and `[issSuffix]` for fully custom affixes.
38
+ */
39
+ declare class InputControl extends ControlBase implements Validator, OnDestroy {
40
+ #private;
41
+ /**
42
+ * Native input type — `text`, `number`, `email`, `password`, and so on.
43
+ */
44
+ type: InputSignal<string>;
45
+ /**
46
+ * Icon name rendered before the value.
47
+ */
48
+ prefixIcon: InputSignal<string>;
49
+ /**
50
+ * Static text rendered before the value.
51
+ */
52
+ prefixText: InputSignal<string>;
53
+ /**
54
+ * Icon name rendered after the value.
55
+ */
56
+ suffixIcon: InputSignal<string>;
57
+ /**
58
+ * Static text rendered after the value, a unit or currency for example.
59
+ */
60
+ suffixText: InputSignal<string>;
61
+ /**
62
+ * Emits when the prefix affix is clicked.
63
+ */
64
+ onPrefixClick: OutputEmitterRef<string>;
65
+ /**
66
+ * Emits when the suffix affix is clicked.
67
+ */
68
+ onSuffixClick: OutputEmitterRef<string>;
69
+ emitSuffixClick(): void;
70
+ emitPrefixClick(): void;
71
+ ngOnDestroy(): void;
72
+ static ɵfac: i0.ɵɵFactoryDeclaration<InputControl, never>;
73
+ static ɵcmp: i0.ɵɵComponentDeclaration<InputControl, "iss-ctrl-input", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; "isSignal": true; }; "prefixText": { "alias": "prefixText"; "required": false; "isSignal": true; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; "isSignal": true; }; "suffixText": { "alias": "suffixText"; "required": false; "isSignal": true; }; }, { "onPrefixClick": "onPrefixClick"; "onSuffixClick": "onSuffixClick"; }, never, ["label", "[issPrefix]", "[issSuffix]"], true, never>;
74
+ }
75
+
76
+ export { InputControl };
@@ -0,0 +1,91 @@
1
+ import * as i0 from '@angular/core';
2
+ import { OnDestroy, WritableSignal, InputSignal, Signal } from '@angular/core';
3
+ import { Validator, FormControl, AbstractControl, ValidationErrors } from '@angular/forms';
4
+ import { ControlBase } from 'iss-ctrl/base';
5
+ import { PhoneNumber } from 'libphonenumber-js/mobile';
6
+
7
+ type ISO2 = "AF" | "AL" | "DZ" | "AS" | "AD" | "AO" | "AI" | "AG" | "AR" | "AM" | "AW" | "AU" | "AT" | "AZ" | "BS" | "BH" | "BD" | "BB" | "BY" | "BE" | "BZ" | "BJ" | "BM" | "BT" | "BO" | "BA" | "BW" | "BR" | "IO" | "VG" | "BN" | "BG" | "BF" | "BI" | "KH" | "CM" | "CA" | "CV" | "BQ" | "KY" | "CF" | "TD" | "CL" | "CN" | "CX" | "CC" | "CO" | "KM" | "CD" | "CG" | "CK" | "CR" | "CI" | "HR" | "CU" | "CW" | "CY" | "CZ" | "DK" | "DJ" | "DM" | "DO" | "EC" | "EG" | "SV" | "GQ" | "ER" | "EE" | "ET" | "FK" | "FO" | "FJ" | "FI" | "FR" | "GF" | "PF" | "GA" | "GM" | "GE" | "DE" | "GH" | "GI" | "GR" | "GL" | "GD" | "GP" | "GU" | "GT" | "GG" | "GN" | "GW" | "GY" | "HT" | "HN" | "HK" | "HU" | "IS" | "IN" | "ID" | "IR" | "IQ" | "IE" | "IM" | "IL" | "IT" | "JM" | "JP" | "JE" | "JO" | "KZ" | "KE" | "KI" | "XK" | "KW" | "KG" | "LA" | "LV" | "LB" | "LS" | "LR" | "LY" | "LI" | "LT" | "LU" | "MO" | "MK" | "MG" | "MW" | "MY" | "MV" | "ML" | "MT" | "MH" | "MQ" | "MR" | "MU" | "YT" | "MX" | "FM" | "MD" | "MC" | "MN" | "ME" | "MS" | "MA" | "MZ" | "MM" | "NA" | "NR" | "NP" | "NL" | "NC" | "NZ" | "NI" | "NE" | "NG" | "NU" | "NF" | "KP" | "MP" | "NO" | "OM" | "PK" | "PW" | "PS" | "PA" | "PG" | "PY" | "PE" | "PH" | "PL" | "PT" | "PR" | "QA" | "RE" | "RO" | "RU" | "RW" | "BL" | "SH" | "KN" | "LC" | "MF" | "PM" | "VC" | "WS" | "SM" | "ST" | "SA" | "SN" | "RS" | "SC" | "SL" | "SG" | "SX" | "SK" | "SI" | "SB" | "SO" | "ZA" | "KR" | "SS" | "ES" | "LK" | "SD" | "SR" | "SJ" | "SZ" | "SE" | "CH" | "SY" | "TW" | "TJ" | "TZ" | "TH" | "TL" | "TG" | "TK" | "TO" | "TT" | "TN" | "TR" | "TM" | "TC" | "TV" | "VI" | "UG" | "UA" | "AE" | "GB" | "US" | "UY" | "UZ" | "VU" | "VA" | "VE" | "VN" | "WF" | "EH" | "YE" | "ZM" | "ZW" | "AX";
8
+
9
+ interface Country {
10
+ name: string;
11
+ code: ISO2;
12
+ dailCode: string;
13
+ areaCodes?: string[];
14
+ priority: number;
15
+ order: number;
16
+ placeholder: string;
17
+ }
18
+
19
+ declare const DEFAULT_COUNTRY: Country;
20
+ declare const COUNTRIES: Country[];
21
+
22
+ interface Mobile {
23
+ dailCode: string;
24
+ code: ISO2;
25
+ nationalNumber: string;
26
+ internationalNumber: string;
27
+ placeholder: string;
28
+ name: string;
29
+ priority: 0;
30
+ order: 0;
31
+ }
32
+
33
+ declare class Phone {
34
+ parse(phoneNumber: string, countryCode?: ISO2): PhoneNumber | undefined;
35
+ getPhoneNumberObject(number: string): Mobile | undefined;
36
+ format(phoneNumber: string, countryCode: ISO2, numberFormat: "E.164" | "INTERNATIONAL" | "NATIONAL"): string;
37
+ validate(number: string): boolean;
38
+ getPlaceholder(countryCode: ISO2): string;
39
+ getCountryIsoCode(dailCode: string, number: PhoneNumber): string;
40
+ getCountryByDailCode(dailCode: string | undefined, number: PhoneNumber): Country | undefined;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<Phone, never>;
42
+ static ɵprov: i0.ɵɵInjectableDeclaration<Phone>;
43
+ }
44
+
45
+ /**
46
+ * `<iss-ctrl-mobile>` — international phone number with a country selector.
47
+ *
48
+ * The number is validated against the selected country and stored in its international form.
49
+ *
50
+ * @example
51
+ * ```html
52
+ * <iss-ctrl-mobile formControlName="mobile" [preferredCountries]="['SA', 'AE']">
53
+ * <label>Mobile</label>
54
+ * </iss-ctrl-mobile>
55
+ * ```
56
+ *
57
+ * ### Own inputs
58
+ * | Property | Type | Default | Description |
59
+ * | --- | --- | --- | --- |
60
+ * | `preferredCountries` | `ISO2[]` | `["SA"]` | Countries pinned to the top of the country list. |
61
+ *
62
+ * ### Inherited from {@link ControlBase}
63
+ * `formControlName` · `readonly` · `className` · `(onChange)`
64
+ *
65
+ * Projects `<label>` into the floating label; omit it to render the control without one.
66
+ */
67
+ declare class MobileControl extends ControlBase implements OnDestroy, Validator {
68
+ #private;
69
+ phoneService: Phone;
70
+ isOpen: WritableSignal<boolean>;
71
+ selectedCountry: WritableSignal<Country>;
72
+ /**
73
+ * ISO-2 country codes pinned to the top of the country list; the first one is preselected.
74
+ */
75
+ preferredCountries: InputSignal<ISO2[]>;
76
+ searchInput: FormControl;
77
+ filteredCountries: Signal<Country[]>;
78
+ writeValue(value: string | null): void;
79
+ emit(): void;
80
+ validate(control: AbstractControl): ValidationErrors | null;
81
+ ngOnDestroy(): void;
82
+ protected onInput(event: KeyboardEvent): void;
83
+ protected onSelectCountry(country: Country): void;
84
+ protected closeCountryCodeMenu(): void;
85
+ protected toggleCountryCodeMenu(): void;
86
+ static ɵfac: i0.ɵɵFactoryDeclaration<MobileControl, never>;
87
+ static ɵcmp: i0.ɵɵComponentDeclaration<MobileControl, "iss-ctrl-mobile", never, { "preferredCountries": { "alias": "preferredCountries"; "required": false; "isSignal": true; }; }, {}, never, ["label"], true, never>;
88
+ }
89
+
90
+ export { COUNTRIES, DEFAULT_COUNTRY, MobileControl, Phone };
91
+ export type { Country, ISO2, Mobile };
@@ -0,0 +1,54 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ControlBase } from 'iss-ctrl/base';
3
+
4
+ interface PlateLetter {
5
+ label: {
6
+ ar: string;
7
+ en: string;
8
+ };
9
+ value: string;
10
+ }
11
+
12
+ declare const PLATE_LETTERS: PlateLetter[];
13
+
14
+ /**
15
+ * `<iss-ctrl-plate-number>` — Saudi vehicle plate, entered as digits and letters in both
16
+ * Arabic and English.
17
+ *
18
+ * Typing into one script fills the matching cell in the other automatically, and letters are
19
+ * validated against the allowed plate alphabet.
20
+ *
21
+ * @example
22
+ * ```html
23
+ * <iss-ctrl-plate-number formControlName="plate" [readonly]="false"/>
24
+ * ```
25
+ *
26
+ * ### Own inputs
27
+ * None — the control is configured entirely through the inherited properties.
28
+ *
29
+ * ### Inherited from {@link ControlBase}
30
+ * `formControlName` · `readonly` · `className` · `(onChange)`
31
+ *
32
+ * Does not project a label — the field label is rendered by the wrapping `iss-field-*`.
33
+ */
34
+ declare class PlateControl extends ControlBase {
35
+ #private;
36
+ numbersAr: _angular_core.WritableSignal<string[]>;
37
+ numbersEn: _angular_core.WritableSignal<string[]>;
38
+ lettersAr: _angular_core.WritableSignal<string[]>;
39
+ lettersEn: _angular_core.WritableSignal<string[]>;
40
+ letterErrors: _angular_core.WritableSignal<boolean[]>;
41
+ writeValue(value: string | null): void;
42
+ onNumberInput(index: number, event: Event, lang: "ar" | "en"): void;
43
+ onLetterInput(index: number, event: Event, lang: "ar" | "en"): void;
44
+ protected preventNonDigits($event: KeyboardEvent, ar: string): void;
45
+ private emitPlate;
46
+ private stringifyPlate;
47
+ private focusInput;
48
+ private convertDigit;
49
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PlateControl, never>;
50
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PlateControl, "iss-ctrl-plate-number", never, {}, {}, never, never, true, never>;
51
+ }
52
+
53
+ export { PLATE_LETTERS, PlateControl };
54
+ export type { PlateLetter };
@@ -0,0 +1,34 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InputSignal } from '@angular/core';
3
+ import { ControlBase, Option } from 'iss-ctrl/base';
4
+
5
+ /**
6
+ * `<iss-ctrl-radio>` — one choice out of a fixed set of options.
7
+ *
8
+ * @example
9
+ * ```html
10
+ * <iss-ctrl-radio formControlName="gender" [options]="genders"/>
11
+ * ```
12
+ *
13
+ * ### Own inputs
14
+ * | Property | Type | Default | Description |
15
+ * | --- | --- | --- | --- |
16
+ * | `options` | `Option[]` | **required** | The selectable choices. |
17
+ *
18
+ * ### Inherited from {@link ControlBase}
19
+ * `formControlName` · `readonly` · `className` · `(onChange)`
20
+ *
21
+ * Does not project a label — the field label is rendered by the wrapping `iss-field-*`.
22
+ */
23
+ declare class RadioControl extends ControlBase {
24
+ /**
25
+ * Selectable choices, each a `{ value, label }` pair. Required.
26
+ */
27
+ options: InputSignal<Option[]>;
28
+ writeValue(value: string | null): void;
29
+ onRadioChange(value: string): void;
30
+ static ɵfac: i0.ɵɵFactoryDeclaration<RadioControl, never>;
31
+ static ɵcmp: i0.ɵɵComponentDeclaration<RadioControl, "iss-ctrl-radio", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
32
+ }
33
+
34
+ export { RadioControl };
@@ -0,0 +1,75 @@
1
+ import * as i0 from '@angular/core';
2
+ import { OnDestroy, WritableSignal, InputSignal, Signal, OutputEmitterRef } from '@angular/core';
3
+ import { ControlBase, Option } from 'iss-ctrl/base';
4
+
5
+ /**
6
+ * `<iss-ctrl-select>` — dropdown selection, single or multiple, with a search box.
7
+ *
8
+ * Typing in the search box emits `(onQueryChange)`, so options can be loaded remotely; set
9
+ * `loading` while that request is in flight.
10
+ *
11
+ * @example
12
+ * ```html
13
+ * <iss-ctrl-select
14
+ * formControlName="city"
15
+ * [options]="cities()"
16
+ * [multiple]="false"
17
+ * [loading]="loading()"
18
+ * (onQueryChange)="search($event)"
19
+ * >
20
+ * <label>City</label>
21
+ * </iss-ctrl-select>
22
+ * ```
23
+ *
24
+ * ### Own inputs
25
+ * | Property | Type | Default | Description |
26
+ * | --- | --- | --- | --- |
27
+ * | `options` | `Option[]` | **required** | The selectable choices. |
28
+ * | `height` | `string` | `"150px"` | Max height of the open panel. |
29
+ * | `loading` | `boolean` | `false` | Shows the loading state inside the panel. |
30
+ *
31
+ * ### Inherited from {@link ControlBase}
32
+ * `formControlName` · `readonly` · `className` · `(onChange)` · `placeholder` · `multiple`
33
+ *
34
+ * ### Outputs
35
+ * - `(onQueryChange)` — `string`, the current search text.
36
+ *
37
+ * Projects `<label>` into the floating label; omit it to render the control without one.
38
+ */
39
+ declare class SelectControl extends ControlBase implements OnDestroy {
40
+ #private;
41
+ selectedOptions: WritableSignal<Map<string, Option>>;
42
+ /**
43
+ * Selectable choices, each a `{ value, label }` pair. Required.
44
+ */
45
+ options: InputSignal<Option[]>;
46
+ /**
47
+ * Maximum height of the open options panel, as a CSS length.
48
+ */
49
+ height: InputSignal<string>;
50
+ query: Signal<string>;
51
+ readonly filteredOptions: Signal<Option[]>;
52
+ /**
53
+ * Shows the loading state inside the panel while options are being fetched.
54
+ */
55
+ loading: InputSignal<boolean>;
56
+ /**
57
+ * Emits the search text so the host can load matching options.
58
+ */
59
+ onQueryChange: OutputEmitterRef<string>;
60
+ protected optionTemplate: any;
61
+ protected cardViewerTemplate: any;
62
+ protected allSelected: WritableSignal<boolean>;
63
+ displayFn: (options: Option | Option[]) => string;
64
+ writeValue(value: string | null): void;
65
+ captureValue($event: any): void;
66
+ removeFromSelectedOptionsMap(option: Option): void;
67
+ clearSelection(): void;
68
+ toggleAllSelection(): void;
69
+ ngOnDestroy(): void;
70
+ protected isEmpty(): boolean;
71
+ static ɵfac: i0.ɵɵFactoryDeclaration<SelectControl, never>;
72
+ static ɵcmp: i0.ɵɵComponentDeclaration<SelectControl, "iss-ctrl-select", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "onQueryChange": "onQueryChange"; }, ["optionTemplate", "cardViewerTemplate"], ["label"], true, never>;
73
+ }
74
+
75
+ export { SelectControl };
@@ -0,0 +1,26 @@
1
+ import { ControlBase } from 'iss-ctrl/base';
2
+ import * as i0 from '@angular/core';
3
+
4
+ /**
5
+ * `<iss-ctrl-slide-toggle>` — an on/off switch for a boolean value.
6
+ *
7
+ * @example
8
+ * ```html
9
+ * <iss-ctrl-slide-toggle formControlName="active" (onChange)="save($event)"/>
10
+ * ```
11
+ *
12
+ * ### Own inputs
13
+ * None — the control is configured entirely through the inherited properties.
14
+ *
15
+ * ### Inherited from {@link ControlBase}
16
+ * `formControlName` · `readonly` · `className` · `(onChange)`
17
+ *
18
+ * Does not project a label — the field label is rendered by the wrapping `iss-field-*`.
19
+ */
20
+ declare class SlideToggleControl extends ControlBase {
21
+ onSlideToggleChange(checked: boolean): void;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<SlideToggleControl, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<SlideToggleControl, "iss-ctrl-slide-toggle", never, {}, {}, never, never, true, never>;
24
+ }
25
+
26
+ export { SlideToggleControl };
@@ -0,0 +1,30 @@
1
+ import * as i0 from '@angular/core';
2
+ import { OnDestroy } from '@angular/core';
3
+ import { ControlBase } from 'iss-ctrl/base';
4
+
5
+ /**
6
+ * `<iss-ctrl-textarea>` — multi line free text.
7
+ *
8
+ * @example
9
+ * ```html
10
+ * <iss-ctrl-textarea formControlName="notes" [maxLength]="500" placeholder="Add a note">
11
+ * <label>Notes</label>
12
+ * </iss-ctrl-textarea>
13
+ * ```
14
+ *
15
+ * ### Own inputs
16
+ * None — the control is configured entirely through the inherited properties.
17
+ *
18
+ * ### Inherited from {@link ControlBase}
19
+ * `formControlName` · `readonly` · `className` · `(onChange)` · `placeholder` · `minLength` · `maxLength` · `hints`
20
+ *
21
+ * Projects `<label>` into the floating label; omit it to render the control without one.
22
+ */
23
+ declare class TextareaControl extends ControlBase implements OnDestroy {
24
+ #private;
25
+ ngOnDestroy(): void;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<TextareaControl, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<TextareaControl, "iss-ctrl-textarea", never, {}, {}, never, ["label"], true, never>;
28
+ }
29
+
30
+ export { TextareaControl };
@@ -0,0 +1,48 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InputSignal } from '@angular/core';
3
+ import { ControlBase } from 'iss-ctrl/base';
4
+
5
+ /**
6
+ * `<iss-ctrl-time-picker>` — time of day, picked from a list generated at a fixed interval.
7
+ *
8
+ * @example
9
+ * ```html
10
+ * <iss-ctrl-time-picker formControlName="startsAt" interval="15min" minTime="08:00" maxTime="17:00">
11
+ * <label>Starts at</label>
12
+ * </iss-ctrl-time-picker>
13
+ * ```
14
+ *
15
+ * ### Own inputs
16
+ * | Property | Type | Default | Description |
17
+ * | --- | --- | --- | --- |
18
+ * | `interval` | `string` | `"30min"` | Step between the offered times. |
19
+ * | `minTime` | `string \| null` | `null` | Earliest offered time, `HH:mm`. |
20
+ * | `maxTime` | `string \| null` | `null` | Latest offered time, `HH:mm`. |
21
+ *
22
+ * ### Inherited from {@link ControlBase}
23
+ * `formControlName` · `readonly` · `className` · `(onChange)`
24
+ *
25
+ * Projects `<label>` into the floating label; omit it to render the control without one.
26
+ */
27
+ declare class TimePickerControl extends ControlBase {
28
+ #private;
29
+ /**
30
+ * Step between the offered times, for example `"15min"` or `"30min"`.
31
+ */
32
+ interval: InputSignal<string>;
33
+ /**
34
+ * Earliest offered time of day, as `HH:mm`.
35
+ */
36
+ minTime: InputSignal<string | null>;
37
+ /**
38
+ * Latest offered time of day, as `HH:mm`.
39
+ */
40
+ maxTime: InputSignal<string | null>;
41
+ emit(evt: any): void;
42
+ clear(event: MouseEvent): void;
43
+ writeValue(value: any): void;
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<TimePickerControl, never>;
45
+ static ɵcmp: i0.ɵɵComponentDeclaration<TimePickerControl, "iss-ctrl-time-picker", never, { "interval": { "alias": "interval"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; }, {}, never, ["label"], true, never>;
46
+ }
47
+
48
+ export { TimePickerControl };
@@ -0,0 +1,41 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InputSignal, WritableSignal } from '@angular/core';
3
+ import { ControlBase, Option } from 'iss-ctrl/base';
4
+
5
+ /**
6
+ * `<iss-ctrl-toggle-button>` — options rendered as a button group instead of a dropdown.
7
+ *
8
+ * With `multiple` set, several buttons can be active at once.
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <iss-ctrl-toggle-button formControlName="priority" [options]="priorities" [multiple]="false"/>
13
+ * ```
14
+ *
15
+ * ### Own inputs
16
+ * | Property | Type | Default | Description |
17
+ * | --- | --- | --- | --- |
18
+ * | `options` | `Option[]` | **required** | The selectable choices. |
19
+ *
20
+ * ### Inherited from {@link ControlBase}
21
+ * `formControlName` · `readonly` · `className` · `(onChange)` · `multiple`
22
+ *
23
+ * Does not project a label — the field label is rendered by the wrapping `iss-field-*`.
24
+ */
25
+ declare class ToggleButtonControl extends ControlBase {
26
+ #private;
27
+ /**
28
+ * Selectable choices, each a `{ value, label }` pair. Required.
29
+ */
30
+ options: InputSignal<Option[]>;
31
+ selectedOptions: WritableSignal<Map<string, Option>>;
32
+ writeValue(value: string | null): void;
33
+ addToSelectedOptionsMap(option: Map<string, Option>): void;
34
+ onToggleButtonChange(checked: boolean, value: string): void;
35
+ stringifySelectedOptions(): string | null;
36
+ getEmissionValue(options: any): void;
37
+ static ɵfac: i0.ɵɵFactoryDeclaration<ToggleButtonControl, never>;
38
+ static ɵcmp: i0.ɵɵComponentDeclaration<ToggleButtonControl, "iss-ctrl-toggle-button", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
39
+ }
40
+
41
+ export { ToggleButtonControl };
@@ -0,0 +1,21 @@
1
+ import { InjectionToken } from '@angular/core';
2
+
3
+ interface IssAttachment {
4
+ id: string;
5
+ name: string;
6
+ type: string;
7
+ size: number;
8
+ }
9
+
10
+ declare const ATTACHMENT_UPLOAD_URL: InjectionToken<string>;
11
+ declare const ATTACHMENT_UPLOAD_RESPONSE_MAPPER: InjectionToken<(res: any) => IssAttachment[]>;
12
+ declare const ATTACHMENT_DOWNLOAD_URL: InjectionToken<string>;
13
+
14
+ declare const HOST: InjectionToken<string>;
15
+
16
+ declare const UI_LANGUAGE: InjectionToken<string>;
17
+
18
+ declare const USER_SEARCH_API: InjectionToken<string>;
19
+
20
+ export { ATTACHMENT_DOWNLOAD_URL, ATTACHMENT_UPLOAD_RESPONSE_MAPPER, ATTACHMENT_UPLOAD_URL, HOST, UI_LANGUAGE, USER_SEARCH_API };
21
+ export type { IssAttachment };