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
package/README.md CHANGED
@@ -7,6 +7,39 @@ This library was generated with [Angular CLI](https://github.com/angular/angular
7
7
  Run `ng generate component component-name --project iss` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project iss`.
8
8
  > Note: Don't forget to add `--project iss` or else it will be added to the default project in your `angular.json` file.
9
9
 
10
+ ## Entry points
11
+
12
+ The package is split so an app downloads only what it renders.
13
+
14
+ | Entry point | Contents |
15
+ | --- | --- |
16
+ | `iss-ctrl` | The form engine: `Outlet`, `FormEngine`, `FieldBase`, the COMPONENTS/VIEWERS/SERVICES/VALIDATORS indexes, validators and pipes. |
17
+ | `iss-ctrl/tokens` | `HOST`, `UI_LANGUAGE`, `USER_SEARCH_API` and the `ATTACHMENT_*` tokens. Import from here in an app's root providers so the engine stays out of its initial bundle. |
18
+ | `iss-ctrl/base` | `ControlBase`, `ViewerBase`, `Hints`, `IssDateAdapter`, the Hijri utilities — what a control is built from. |
19
+ | `iss-ctrl/<control>` | One per control: `input`, `textarea`, `select`, `checkbox`, `radio`, `chips`, `toggle-button`, `slide-toggle`, `date-picker`, `time-picker`, `datetime-picker`, `date-range-picker`, `file-picker`, `plate`, `mobile`. |
20
+
21
+ Controls are deliberately **not** re-exported from `iss-ctrl`. A static re-export makes the
22
+ bundler inline the control — and then every control — into whatever imports the engine, which
23
+ is what the split exists to prevent. Import a control from its own entry point:
24
+
25
+ ```ts
26
+ import { Outlet } from "iss-ctrl";
27
+ import { HOST } from "iss-ctrl/tokens";
28
+ import { MobileControl } from "iss-ctrl/mobile";
29
+ ```
30
+
31
+ Fields and viewers are internal: the outlet resolves them through the indexes with a dynamic
32
+ import, so each one is its own lazy chunk. `iss-ctrl/mobile` matters most — it is the only
33
+ part of the library that pulls in libphonenumber-js.
34
+
35
+ ## Adding a control
36
+
37
+ Add `projects/iss/<name>/` with an `ng-package.json` and `src/public-api.ts`, put the control
38
+ and its support files there, add the path to `tsconfig.json`, and keep the field and viewer in
39
+ `projects/iss/src/components/controls/<name>/`. A control may import from `iss-ctrl/base`,
40
+ `iss-ctrl/tokens` and other control entry points, but never from `iss-ctrl` — that closes a
41
+ dependency cycle and ng-packagr will reject the build.
42
+
10
43
  ## Build
11
44
 
12
45
  Run `ng build iss` to build the project. The build artifacts will be stored in the `dist/` directory.
@@ -0,0 +1,110 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, computed, CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core';
3
+ import { MatProgressBar } from '@angular/material/progress-bar';
4
+ import { MatTooltip } from '@angular/material/tooltip';
5
+ import { ViewerBase } from 'iss-ctrl/base';
6
+
7
+ class AttachmentViewer extends ViewerBase {
8
+ uploading = input(false, ...(ngDevMode ? [{ debugName: "uploading" }] : /* istanbul ignore next */ []));
9
+ uploadingError = input("", ...(ngDevMode ? [{ debugName: "uploadingError" }] : /* istanbul ignore next */ []));
10
+ deleteOut = output();
11
+ attachments = computed(() => {
12
+ return this.field().ctrlJsonValue().map((attachment) => {
13
+ return {
14
+ name: attachment.name,
15
+ size: attachment.size,
16
+ type: attachment.type,
17
+ errorMsg: attachment.errorMsg,
18
+ file: attachment.file
19
+ };
20
+ });
21
+ }, ...(ngDevMode ? [{ debugName: "attachments" }] : /* istanbul ignore next */ []));
22
+ onDownload($event) {
23
+ const fileUrl = this.#createObjectUrl($event.detail.value);
24
+ const anchorElement = this.#createAnchorElement(fileUrl, $event.detail.value.name);
25
+ this.#useAnchorElementThenDispose(anchorElement, fileUrl);
26
+ }
27
+ onDelete(index) {
28
+ const fileHtmlElement = document.getElementById("file");
29
+ if (fileHtmlElement) {
30
+ fileHtmlElement.value = "";
31
+ }
32
+ const updatedFiles = this.field().ctrlJsonValue().filter((_, i) => i !== index);
33
+ this.field().ctrlJsonValue = computed(() => updatedFiles, ...(ngDevMode ? [{ debugName: "ctrlJsonValue" }] : /* istanbul ignore next */ []));
34
+ this.deleteOut.emit(this.field().ctrlJsonValue());
35
+ }
36
+ #createObjectUrl(file) {
37
+ const blob = new Blob([file], { type: "application/octet-stream" });
38
+ return window.URL.createObjectURL(blob);
39
+ }
40
+ #createAnchorElement(fileUrl, fileName) {
41
+ const a = document.createElement("a");
42
+ a.setAttribute("style", "display: none");
43
+ a.href = fileUrl;
44
+ a.download = fileName;
45
+ return a;
46
+ }
47
+ #useAnchorElementThenDispose(a, fileUrl) {
48
+ a.click();
49
+ window.URL.revokeObjectURL(fileUrl);
50
+ a.remove();
51
+ }
52
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AttachmentViewer, deps: null, target: i0.ɵɵFactoryTarget.Component });
53
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AttachmentViewer, isStandalone: true, selector: "iss-viewer-attachment", inputs: { uploading: { classPropertyName: "uploading", publicName: "uploading", isSignal: true, isRequired: false, transformFunction: null }, uploadingError: { classPropertyName: "uploadingError", publicName: "uploadingError", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { deleteOut: "deleteOut" }, usesInheritance: true, ngImport: i0, template: `
54
+ @if (attachments()?.length) {
55
+ <section class="files-list">
56
+ @for (file of attachments(); track $index) {
57
+ <div class="file-item-container">
58
+ @if (file) {
59
+ <ds-attachments
60
+ [matTooltip]="file.name"
61
+ [file]="file.file ?? file"
62
+ [showDownload]="field().config.showDownloadButton"
63
+ [attr.readonly]="!field().config.showDeleteButton"
64
+ (downloadEvent)="onDownload($event)"
65
+ (deleteEvent)="onDelete($index)"
66
+ >
67
+ </ds-attachments>
68
+ @if (uploading()) {
69
+ <mat-progress-bar mode="indeterminate" />
70
+ }
71
+ }
72
+ </div>
73
+ }
74
+ </section>
75
+ }
76
+ `, isInline: true, styles: [".insideTableStyle{width:272px}.files-list{--file-item-width: 270px;display:grid;grid-template-columns:repeat(auto-fill,var(--file-item-width));grid-gap:.5rem}@media(max-width:768px){.files-list{grid-template-columns:repeat(auto-fill,minmax(var(--file-item-width),1fr))}}.mat-mdc-progress-bar{--mat-progress-bar-active-indicator-color: var(--purple);--mat-progress-bar-track-color: rgba(var(--rgb-purple), .25)}.file-item-container .file-item{--file-bg: var(--off-white);--file-radius: var(--box-radius);--icon-color: var(--purple);--icon-size: 2rem;--file-border: transparent;display:flex;align-items:center;background-color:var(--file-bg);border:1px solid var(--file-border);border-radius:var(--file-radius);padding:0 1rem;height:70px;gap:.75rem}.file-item-container .file-item.error{--file-bg: rgba(var(--rgb-red), 10%);--file-border: var(--red);--icon-color: var(--red)}.file-item-container .file-item .icon{color:var(--icon-color);font-size:var(--icon-size)}.file-item-container .file-item .file-action{display:flex;align-items:center;gap:.5rem}ds-attachments::part(base){--file-width: 250px}\n"], dependencies: [{ kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }] });
77
+ }
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AttachmentViewer, decorators: [{
79
+ type: Component,
80
+ args: [{ selector: "iss-viewer-attachment", imports: [
81
+ MatTooltip,
82
+ MatProgressBar,
83
+ ], template: `
84
+ @if (attachments()?.length) {
85
+ <section class="files-list">
86
+ @for (file of attachments(); track $index) {
87
+ <div class="file-item-container">
88
+ @if (file) {
89
+ <ds-attachments
90
+ [matTooltip]="file.name"
91
+ [file]="file.file ?? file"
92
+ [showDownload]="field().config.showDownloadButton"
93
+ [attr.readonly]="!field().config.showDeleteButton"
94
+ (downloadEvent)="onDownload($event)"
95
+ (deleteEvent)="onDelete($index)"
96
+ >
97
+ </ds-attachments>
98
+ @if (uploading()) {
99
+ <mat-progress-bar mode="indeterminate" />
100
+ }
101
+ }
102
+ </div>
103
+ }
104
+ </section>
105
+ }
106
+ `, schemas: [CUSTOM_ELEMENTS_SCHEMA], styles: [".insideTableStyle{width:272px}.files-list{--file-item-width: 270px;display:grid;grid-template-columns:repeat(auto-fill,var(--file-item-width));grid-gap:.5rem}@media(max-width:768px){.files-list{grid-template-columns:repeat(auto-fill,minmax(var(--file-item-width),1fr))}}.mat-mdc-progress-bar{--mat-progress-bar-active-indicator-color: var(--purple);--mat-progress-bar-track-color: rgba(var(--rgb-purple), .25)}.file-item-container .file-item{--file-bg: var(--off-white);--file-radius: var(--box-radius);--icon-color: var(--purple);--icon-size: 2rem;--file-border: transparent;display:flex;align-items:center;background-color:var(--file-bg);border:1px solid var(--file-border);border-radius:var(--file-radius);padding:0 1rem;height:70px;gap:.75rem}.file-item-container .file-item.error{--file-bg: rgba(var(--rgb-red), 10%);--file-border: var(--red);--icon-color: var(--red)}.file-item-container .file-item .icon{color:var(--icon-color);font-size:var(--icon-size)}.file-item-container .file-item .file-action{display:flex;align-items:center;gap:.5rem}ds-attachments::part(base){--file-width: 250px}\n"] }]
107
+ }], propDecorators: { uploading: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploading", required: false }] }], uploadingError: [{ type: i0.Input, args: [{ isSignal: true, alias: "uploadingError", required: false }] }], deleteOut: [{ type: i0.Output, args: ["deleteOut"] }] } });
108
+
109
+ export { AttachmentViewer };
110
+ //# sourceMappingURL=iss-ctrl-attachment.viewer-DVUL39xd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iss-ctrl-attachment.viewer-DVUL39xd.mjs","sources":["../../../projects/iss/src/components/controls/file-picker/attachment.viewer.ts"],"sourcesContent":["import { Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, InputSignal, output, OutputEmitterRef } from \"@angular/core\";\nimport { MatProgressBar } from \"@angular/material/progress-bar\";\nimport { MatTooltip } from \"@angular/material/tooltip\";\nimport { ViewerBase } from \"iss-ctrl/base\";\nimport { IssFile } from \"iss-ctrl/file-picker\";\n\n@Component({\n selector: \"iss-viewer-attachment\",\n imports: [\n MatTooltip,\n MatProgressBar,\n ],\n template: `\n @if (attachments()?.length) {\n <section class=\"files-list\">\n @for (file of attachments(); track $index) {\n <div class=\"file-item-container\">\n @if (file) {\n <ds-attachments\n [matTooltip]=\"file.name\"\n [file]=\"file.file ?? file\"\n [showDownload]=\"field().config.showDownloadButton\"\n [attr.readonly]=\"!field().config.showDeleteButton\"\n (downloadEvent)=\"onDownload($event)\"\n (deleteEvent)=\"onDelete($index)\"\n >\n </ds-attachments>\n @if (uploading()) {\n <mat-progress-bar mode=\"indeterminate\" />\n }\n }\n </div>\n }\n </section>\n }\n `,\n styles: `\n .insideTableStyle {\n width: 272px;\n }\n\n .files-list {\n --file-item-width: 270px;\n display: grid;\n grid-template-columns: repeat(auto-fill, var(--file-item-width));\n grid-gap: 0.5rem;\n @media (max-width: 768px) {\n grid-template-columns: repeat(auto-fill, minmax(var(--file-item-width), 1fr));\n }\n\n\n }\n\n .mat-mdc-progress-bar {\n --mat-progress-bar-active-indicator-color: var(--purple);\n --mat-progress-bar-track-color: rgba(var(--rgb-purple), .25);\n }\n\n\n .file-item-container {\n .file-item {\n --file-bg: var(--off-white);\n --file-radius: var(--box-radius);\n --icon-color: var(--purple);\n --icon-size: 2rem;\n --file-border: transparent;\n\n display: flex;\n align-items: center;\n background-color: var(--file-bg);\n border: 1px solid var(--file-border);\n border-radius: var(--file-radius);\n padding: 0 1rem;\n height: 70px;\n gap: 0.75rem;\n\n &.error {\n --file-bg: rgba(var(--rgb-red), 10%);\n --file-border: var(--red);\n --icon-color: var(--red);\n }\n\n .icon {\n color: var(--icon-color);\n font-size: var(--icon-size);\n }\n\n .file-action {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n }\n }\n\n ds-attachments::part(base) {\n --file-width: 250px;\n }\n\n ::ng-deep {\n .file-item .name-size {\n display: flex;\n flex-direction: column;\n justify-content: center;\n flex-grow: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 120px;\n }\n }\n `,\n schemas: [CUSTOM_ELEMENTS_SCHEMA]\n})\nexport class AttachmentViewer extends ViewerBase {\n uploading: InputSignal<boolean> = input(false);\n uploadingError: InputSignal<string> = input(\"\");\n deleteOut: OutputEmitterRef<File[]> = output();\n attachments = computed(() => {\n return this.field().ctrlJsonValue().map((attachment: IssFile): IssFile => {\n return {\n name: attachment.name,\n size: attachment.size,\n type: attachment.type,\n errorMsg: attachment.errorMsg,\n file: attachment.file\n };\n });\n });\n\n protected onDownload($event: any) {\n const fileUrl: string = this.#createObjectUrl($event.detail.value);\n const anchorElement: HTMLAnchorElement = this.#createAnchorElement(fileUrl, $event.detail.value.name);\n this.#useAnchorElementThenDispose(anchorElement, fileUrl);\n }\n\n protected onDelete(index: number) {\n const fileHtmlElement: HTMLInputElement | null = document.getElementById(\"file\") as HTMLInputElement;\n if (fileHtmlElement) {\n fileHtmlElement.value = \"\";\n }\n const updatedFiles = this.field().ctrlJsonValue().filter((_: any, i: number): boolean => i !== index);\n this.field().ctrlJsonValue = computed(() => updatedFiles);\n this.deleteOut.emit(this.field().ctrlJsonValue());\n }\n\n #createObjectUrl(file: File): string {\n const blob: Blob = new Blob([file], {type: \"application/octet-stream\"});\n return window.URL.createObjectURL(blob);\n }\n\n #createAnchorElement(fileUrl: string, fileName: string): HTMLAnchorElement {\n const a: HTMLAnchorElement = document.createElement(\"a\");\n a.setAttribute(\"style\", \"display: none\");\n a.href = fileUrl;\n a.download = fileName;\n return a;\n }\n\n #useAnchorElementThenDispose(a: HTMLAnchorElement, fileUrl: string) {\n a.click();\n window.URL.revokeObjectURL(fileUrl);\n a.remove();\n }\n}\n"],"names":[],"mappings":"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"}