iss-ctrl 0.0.21 → 0.0.23
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 +682 -0
- package/fesm2022/iss-ctrl-base.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.field-CILXADas.mjs +88 -0
- package/fesm2022/iss-ctrl-checkbox.field-CILXADas.mjs.map +1 -0
- package/fesm2022/iss-ctrl-checkbox.mjs +146 -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-445Ds3V7.mjs +76 -0
- package/fesm2022/iss-ctrl-chips.field-445Ds3V7.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-Djhh1FsR.mjs +98 -0
- package/fesm2022/iss-ctrl-date-picker.field-Djhh1FsR.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-Dv636SAm.mjs +97 -0
- package/fesm2022/iss-ctrl-date-range-picker.field-Dv636SAm.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-DldY8vke.mjs +98 -0
- package/fesm2022/iss-ctrl-datetime-picker.field-DldY8vke.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-dropdownlist.field-DikBAtc_.mjs +87 -0
- package/fesm2022/iss-ctrl-dropdownlist.field-DikBAtc_.mjs.map +1 -0
- package/fesm2022/iss-ctrl-dropdownlist.mjs +398 -0
- package/fesm2022/iss-ctrl-dropdownlist.mjs.map +1 -0
- package/fesm2022/iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs +30 -0
- package/fesm2022/iss-ctrl-dropdownlist.viewer-OWJxDpr8.mjs.map +1 -0
- package/fesm2022/iss-ctrl-file-picker.field-BMZaJxvj.mjs +210 -0
- package/fesm2022/iss-ctrl-file-picker.field-BMZaJxvj.mjs.map +1 -0
- package/fesm2022/iss-ctrl-file-picker.mjs +274 -0
- package/fesm2022/iss-ctrl-file-picker.mjs.map +1 -0
- package/fesm2022/iss-ctrl-input.field-BiwBFYx3.mjs +104 -0
- package/fesm2022/iss-ctrl-input.field-BiwBFYx3.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-BG-QWWdq.mjs +1770 -0
- package/fesm2022/iss-ctrl-iss-ctrl-BG-QWWdq.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-load-event-bOt6IlIo.mjs → iss-ctrl-load-event-T4L3k9XO.mjs} +4 -3
- package/fesm2022/iss-ctrl-load-event-T4L3k9XO.mjs.map +1 -0
- package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs → iss-ctrl-load-options-event-tG258cbP.mjs} +3 -3
- package/fesm2022/{iss-ctrl-load-options-event-CxyAyNMe.mjs.map → iss-ctrl-load-options-event-tG258cbP.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs → iss-ctrl-load-value-event--7zt90Dl.mjs} +3 -3
- package/fesm2022/{iss-ctrl-load-value-event-DJKJ5S3h.mjs.map → iss-ctrl-load-value-event--7zt90Dl.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-mobile.field-DLccnWKX.mjs +77 -0
- package/fesm2022/iss-ctrl-mobile.field-DLccnWKX.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-CT1wVmfF.mjs} +2 -2
- package/fesm2022/{iss-ctrl-note.field-B_Lbp28X.mjs.map → iss-ctrl-note.field-CT1wVmfF.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-plate.field-CQQY8rnE.mjs +92 -0
- package/fesm2022/iss-ctrl-plate.field-CQQY8rnE.mjs.map +1 -0
- package/fesm2022/iss-ctrl-plate.mjs +493 -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-Dp5D-AXQ.mjs +88 -0
- package/fesm2022/iss-ctrl-radio.field-Dp5D-AXQ.mjs.map +1 -0
- package/fesm2022/iss-ctrl-radio.mjs +104 -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-COUv4Kin.mjs} +2 -2
- package/fesm2022/{iss-ctrl-replace-api-keys-C0XYQW4i.mjs.map → iss-ctrl-replace-api-keys-COUv4Kin.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs → iss-ctrl-set-value-event-D0-_qIyS.mjs} +2 -2
- package/fesm2022/{iss-ctrl-set-value-event-CgXhi0Bv.mjs.map → iss-ctrl-set-value-event-D0-_qIyS.mjs.map} +1 -1
- package/fesm2022/iss-ctrl-slide-toggle.field-vCJHOiSG.mjs +85 -0
- package/fesm2022/iss-ctrl-slide-toggle.field-vCJHOiSG.mjs.map +1 -0
- package/fesm2022/iss-ctrl-slide-toggle.mjs +66 -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-DdFjH-D8.mjs} +142 -140
- package/fesm2022/iss-ctrl-table.field-DdFjH-D8.mjs.map +1 -0
- package/fesm2022/iss-ctrl-textarea.field-Dqhhu2m4.mjs +82 -0
- package/fesm2022/iss-ctrl-textarea.field-Dqhhu2m4.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-CdmxRiH8.mjs +77 -0
- package/fesm2022/iss-ctrl-time-picker.field-CdmxRiH8.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-rAT7dVFC.mjs +101 -0
- package/fesm2022/iss-ctrl-toggle-button.field-rAT7dVFC.mjs.map +1 -0
- package/fesm2022/iss-ctrl-toggle-button.mjs +158 -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-I92SNsv9.mjs} +2 -2
- package/fesm2022/{iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map → iss-ctrl-trigger-based-on-json-value-I92SNsv9.mjs.map} +1 -1
- package/fesm2022/{iss-ctrl-user-picker.field-BH63sZ-X.mjs → iss-ctrl-user-picker.field-DpmYCfpD.mjs} +154 -153
- package/fesm2022/iss-ctrl-user-picker.field-DpmYCfpD.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 +318 -0
- package/types/iss-ctrl-checkbox.d.ts +46 -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-dropdownlist.d.ts +78 -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-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 +303 -2005
- 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
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`, `dropdownlist`, `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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"}
|