@seniorsistemas/angular-components 18.1.0 → 18.1.2
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/checkbox/lib/checkbox/checkbox.component.d.ts +13 -3
- package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +21 -12
- package/esm2022/dynamic-form/lib/dynamic-form/components/lookup/lookup.component.mjs +2 -1
- package/esm2022/file-upload/lib/file-upload/file-upload.component.mjs +4 -4
- package/esm2022/file-upload/lib/file-upload/file-upload.module.mjs +13 -30
- package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +2 -34
- package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +1 -1
- package/esm2022/select/lib/select/select.component.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +20 -11
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -0
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-upload.mjs +7 -24
- package/fesm2022/seniorsistemas-angular-components-file-upload.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +1 -33
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/file-upload/lib/file-upload/file-upload.module.d.ts +1 -1
- package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +0 -15
- package/package.json +7 -7
|
@@ -13,8 +13,8 @@ import * as i5 from '@seniorsistemas/angular-components/button';
|
|
|
13
13
|
import { ButtonModule } from '@seniorsistemas/angular-components/button';
|
|
14
14
|
import * as i6 from 'primeng/tooltip';
|
|
15
15
|
import { TooltipModule } from 'primeng/tooltip';
|
|
16
|
-
import * as i7 from '
|
|
17
|
-
import { ProgressBarModule } from '
|
|
16
|
+
import * as i7 from '@seniorsistemas/angular-components/progressbar';
|
|
17
|
+
import { ProgressBarModule } from '@seniorsistemas/angular-components/progressbar';
|
|
18
18
|
import { LocaleModule } from '@seniorsistemas/angular-components/locale';
|
|
19
19
|
|
|
20
20
|
const ALL_PERMISSIONS = ['add', 'read', 'remove'];
|
|
@@ -246,11 +246,11 @@ class FileUploadComponent {
|
|
|
246
246
|
});
|
|
247
247
|
}
|
|
248
248
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileUploadComponent, deps: [{ token: i1.DomSanitizer }, { token: FileUploadService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
249
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FileUploadComponent, selector: "s-file-upload", inputs: { id: "id", chooseLabel: "chooseLabel", removeLabel: "removeLabel", cancelLabel: "cancelLabel", successTooltip: "successTooltip", multiple: "multiple", accept: "accept", supportedExtensions: "supportedExtensions", ariaLabelFileName: "ariaLabelFileName", maxFileSize: "maxFileSize", maxCombinedFileSize: "maxCombinedFileSize", fileLimit: "fileLimit", ariaLabelProgress: "ariaLabelProgress", ariaLabelSuccess: "ariaLabelSuccess", ariaLabelError: "ariaLabelError", ariaLabelRemove: "ariaLabelRemove", formGroup: "formGroup", disabled: "disabled", showFileUploadDate: "showFileUploadDate", permissions: "permissions", files: "files" }, outputs: { uploadHandler: "uploadHandler", removeFile: "removeFile", cancelUpload: "cancelUpload", downloadFile: "downloadFile", validateErrors: "validateErrors" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "inputUpload", first: true, predicate: ["inputUpload"], descendants: true }, { propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true }], ngImport: i0, template: "<div\n [id]=\"id\"\n class=\"s-fileupload\"\n>\n <div class=\"s-fileupload-choose\">\n <input\n #inputUpload\n [id]=\"id + 'input-upload'\"\n type=\"file\"\n name=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n (change)=\"_onInputFileSelect($event)\"\n />\n <s-button\n *ngIf=\"permissions.includes(ADD_PERMISSION)\"\n [id]=\"id + 'upload-button'\"\n [label]=\"chooseLabel || 'platform.angular_components.attach_files' | translate\"\n (clicked)=\"inputUpload.click()\"\n priority=\"primary\"\n [disabled]=\"disabled || !!formGroup?.disabled || fileLimit === files.length\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n\n <section\n *ngIf=\"files.length\"\n [id]=\"id + 'fileupload-list'\"\n class=\"s-fileupload-list\"\n role=\"grid\"\n >\n <ng-container *ngFor=\"let file of files; let i = index\">\n <div\n class=\"s-fileupload-list-file\"\n role=\"row\"\n >\n <div\n [id]=\"id + '-file-' + i + '-name'\"\n class=\"flex flex-grow items-center justify-between overflow-hidden text-ellipsis text-nowrap\"\n role=\"gridcell\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (permissions.includes(READ_PERMISSION) && file.savedFile) || file.progress === 100\n ? descriptionUrl\n : description;\n context: {\n $implicit: file,\n index: i,\n }\n \"\n >\n </ng-container>\n\n <span>{{ formatFileSize(file.size) }}</span>\n\n <span\n *ngIf=\"modifiedDate\"\n class=\"s-fileupload-list-file-name-date\"\n >{{ modifiedDate }}</span\n >\n </div>\n <div\n class=\"s-fileupload-list-file-status\"\n role=\"gridcell\"\n >\n <p-progressBar\n *ngIf=\"file.isUploading && !isSmallDevice\"\n [style]=\"{\n width: '250px',\n 'background-color': '#d8d8d8',\n 'border-radius': '0px',\n height: '14px',\n }\"\n [value]=\"file.progress\"\n [showValue]=\"false\"\n role=\"alert\"\n [attr.aria-label]=\"ariaLabelProgress || 'platform.angular_components.loading_file' | translate\"\n >\n </p-progressBar>\n <span\n *ngIf=\"file.isUploading && isSmallDevice\"\n [id]=\"id + '-file-' + i + '-spin'\"\n class=\"fas fa-circle-notch fa-spin\"\n [attr.aria-label]=\"ariaLabelProgress || 'platform.angular_components.loading_file' | translate\"\n >\n </span>\n\n <span\n *ngIf=\"!file.isUploading && !file.error && file.progress === 100\"\n [id]=\"id + '-file-' + i + '-check'\"\n class=\"fas fa-check\"\n role=\"alert\"\n [attr.aria-label]=\"\n ariaLabelSuccess ||\n successTooltip ||\n 'platform.angular_components.file_attached_successfully' | translate\n \"\n [pTooltip]=\"\n successTooltip || 'platform.angular_components.file_attached_successfully' | translate\n \"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n <span\n *ngIf=\"file.error?.message\"\n [id]=\"id + '-file-' + i + '-error'\"\n class=\"fas fa-times\"\n role=\"alert\"\n [pTooltip]=\"file.error?.message\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n </div>\n <div\n class=\"s-fileupload-list-file-actions\"\n role=\"gridcell\"\n >\n <a\n *ngIf=\"file.isUploading\"\n [id]=\"id + '-file-' + i + '-cancel'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onCancelUpload(i)\"\n >\n {{ cancelLabel || 'platform.angular_components.cancel' | translate }}\n </a>\n <a\n *ngIf=\"\n permissions.includes(REMOVE_PERMISSION) &&\n !file.isUploading &&\n !(disabled || !!formGroup?.disabled)\n \"\n role=\"button\"\n tabindex=\"0\"\n [id]=\"id + '-file-' + i + '-remove'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onRemoveFile(file)\"\n [attr.aria-label]=\"\n ariaLabelRemove || removeLabel || 'platform.angular_components.remove' | translate\n \"\n >\n {{ removeLabel || 'platform.angular_components.remove' | translate }}\n </a>\n </div>\n </div>\n </ng-container>\n </section>\n</div>\n\n<ng-template\n #descriptionUrl\n let-file\n let-i=\"index\"\n>\n <div class=\"flex justify-between\">\n <div>\n <a\n [id]=\"id + '-file-' + i + '-name-link'\"\n tabindex=\"0\"\n (click)=\"onDowloadFile(i)\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n class=\"break-words\"\n >{{ file.name }}\n </a>\n <a\n style=\"display: none\"\n [href]=\"file.objectURL\"\n target=\"_blank\"\n download\n #anchor\n >\n </a>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #description\n let-file\n>\n <div class=\"flex justify-between\">\n <span\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n >\n {{ file.name }}\n </span>\n </div>\n</ng-template>\n\n", styles: [".s-fileupload .s-fileupload-choose{position:relative;margin:15px 0;width:max-content}.s-fileupload input[type=file]{display:none}.s-fileupload-list{border:1px solid #ccc}.s-fileupload-list-file:not(:first-child){border-top:1px solid #ccc}.s-fileupload-list .s-fileupload-list-file{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;padding:15px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name{display:flex;flex-direction:column;align-self:center;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name .s-fileupload-list-file-name-date{font-size:.75rem;color:#999}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name>a{cursor:pointer;text-decoration:none}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-status{align-self:center}.s-fileupload-list .s-fileupload-list-file .fas.fa-circle-notch{color:#d8d8d8;font-size:12px}.s-fileupload-list .s-fileupload-list-file .fas.fa-check{color:#0c9348;font-size:12px}.s-fileupload-list .s-fileupload-list-file .fas.fa-times{color:#c13018;font-size:12px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions{margin-top:15px;align-self:center;width:100%}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action{text-decoration:none;color:#428bca}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action:hover,.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action :focus,.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action :visited{text-decoration:none}@media (min-width: 768px){.s-fileupload-list .s-fileupload-list-file{flex-wrap:nowrap}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name{width:auto;flex-grow:2}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-status{margin:0 15px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions{margin:0;width:auto}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor"], outputs: ["clicked"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "style", "unit", "mode", "color"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
249
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FileUploadComponent, selector: "s-file-upload", inputs: { id: "id", chooseLabel: "chooseLabel", removeLabel: "removeLabel", cancelLabel: "cancelLabel", successTooltip: "successTooltip", multiple: "multiple", accept: "accept", supportedExtensions: "supportedExtensions", ariaLabelFileName: "ariaLabelFileName", maxFileSize: "maxFileSize", maxCombinedFileSize: "maxCombinedFileSize", fileLimit: "fileLimit", ariaLabelProgress: "ariaLabelProgress", ariaLabelSuccess: "ariaLabelSuccess", ariaLabelError: "ariaLabelError", ariaLabelRemove: "ariaLabelRemove", formGroup: "formGroup", disabled: "disabled", showFileUploadDate: "showFileUploadDate", permissions: "permissions", files: "files" }, outputs: { uploadHandler: "uploadHandler", removeFile: "removeFile", cancelUpload: "cancelUpload", downloadFile: "downloadFile", validateErrors: "validateErrors" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "inputUpload", first: true, predicate: ["inputUpload"], descendants: true }, { propertyName: "anchor", first: true, predicate: ["anchor"], descendants: true }], ngImport: i0, template: "<div\n [id]=\"id\"\n class=\"s-fileupload\"\n>\n <div class=\"s-fileupload-choose\">\n <input\n #inputUpload\n [id]=\"id + 'input-upload'\"\n type=\"file\"\n name=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n (change)=\"_onInputFileSelect($event)\"\n />\n @if (permissions.includes(ADD_PERMISSION)) {\n <s-button\n [id]=\"id + 'upload-button'\"\n [label]=\"chooseLabel || 'platform.angular_components.attach_files' | translate\"\n (clicked)=\"inputUpload.click()\"\n priority=\"primary\"\n [disabled]=\"disabled || !!formGroup?.disabled || fileLimit === files.length\"\n [auxiliary]=\"false\"\n >\n </s-button>\n }\n </div>\n\n @if (files.length) {\n <section\n [id]=\"id + 'fileupload-list'\"\n class=\"s-fileupload-list\"\n role=\"grid\"\n >\n @for (file of files; track file; let i = $index) {\n <div\n class=\"s-fileupload-list-file\"\n role=\"row\"\n >\n <div\n [id]=\"id + '-file-' + i + '-name'\"\n class=\"flex flex-grow items-center justify-between overflow-hidden text-ellipsis text-nowrap\"\n role=\"gridcell\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (permissions.includes(READ_PERMISSION) && file.savedFile) || file.progress === 100\n ? descriptionUrl\n : description;\n context: {\n $implicit: file,\n index: i,\n }\n \"\n >\n </ng-container>\n\n <span>{{ formatFileSize(file.size) }}</span>\n\n @if (modifiedDate) {\n <span class=\"s-fileupload-list-file-name-date\">{{ modifiedDate }}</span>\n }\n </div>\n <div\n class=\"s-fileupload-list-file-status\"\n role=\"gridcell\"\n >\n @if (file.isUploading && !isSmallDevice) {\n <div class=\"w-64\">\n <s-progressbar\n [value]=\"file.progress ?? 0\"\n [showValue]=\"false\"\n activeColor=\"blue\"\n ></s-progressbar>\n </div>\n }\n\n @if (file.isUploading && isSmallDevice) {\n <span\n [id]=\"id + '-file-' + i + '-spin'\"\n class=\"fas fa-circle-notch fa-spin\"\n [attr.aria-label]=\"\n ariaLabelProgress || 'platform.angular_components.loading_file' | translate\n \"\n >\n </span>\n }\n\n @if (!file.isUploading && !file.error && file.progress === 100) {\n <span\n [id]=\"id + '-file-' + i + '-check'\"\n class=\"fas fa-check\"\n role=\"alert\"\n [attr.aria-label]=\"\n ariaLabelSuccess ||\n successTooltip ||\n 'platform.angular_components.file_attached_successfully' | translate\n \"\n [pTooltip]=\"\n successTooltip || 'platform.angular_components.file_attached_successfully'\n | translate\n \"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n }\n\n @if (file.error?.message) {\n <span\n [id]=\"id + '-file-' + i + '-error'\"\n class=\"fas fa-times\"\n role=\"alert\"\n [pTooltip]=\"file.error?.message\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n }\n </div>\n <div\n class=\"s-fileupload-list-file-actions\"\n role=\"gridcell\"\n >\n @if (file.isUploading) {\n <a\n [id]=\"id + '-file-' + i + '-cancel'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onCancelUpload(i)\"\n >\n {{ cancelLabel || 'platform.angular_components.cancel' | translate }}\n </a>\n }\n\n @if (\n permissions.includes(REMOVE_PERMISSION) &&\n !file.isUploading &&\n !(disabled || !!formGroup?.disabled)\n ) {\n <a\n role=\"button\"\n tabindex=\"0\"\n [id]=\"id + '-file-' + i + '-remove'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onRemoveFile(file)\"\n [attr.aria-label]=\"\n ariaLabelRemove || removeLabel || 'platform.angular_components.remove' | translate\n \"\n >\n {{ removeLabel || 'platform.angular_components.remove' | translate }}\n </a>\n }\n </div>\n </div>\n }\n </section>\n }\n</div>\n\n<ng-template\n #descriptionUrl\n let-file\n let-i=\"index\"\n>\n <div class=\"flex justify-between\">\n <div>\n <a\n [id]=\"id + '-file-' + i + '-name-link'\"\n tabindex=\"0\"\n (click)=\"onDowloadFile(i)\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n class=\"break-words\"\n >{{ file.name }}\n </a>\n <a\n style=\"display: none\"\n [href]=\"file.objectURL\"\n target=\"_blank\"\n download\n #anchor\n >\n </a>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #description\n let-file\n>\n <div class=\"flex justify-between\">\n <span\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n >\n {{ file.name }}\n </span>\n </div>\n</ng-template>\n\n", styles: [".s-fileupload .s-fileupload-choose{position:relative;margin:15px 0;width:max-content}.s-fileupload input[type=file]{display:none}.s-fileupload-list{border:1px solid #ccc}.s-fileupload-list-file:not(:first-child){border-top:1px solid #ccc}.s-fileupload-list .s-fileupload-list-file{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;padding:15px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name{display:flex;flex-direction:column;align-self:center;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name .s-fileupload-list-file-name-date{font-size:.75rem;color:#999}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name>a{cursor:pointer;text-decoration:none}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-status{align-self:center}.s-fileupload-list .s-fileupload-list-file .fas.fa-circle-notch{color:#d8d8d8;font-size:12px}.s-fileupload-list .s-fileupload-list-file .fas.fa-check{color:#0c9348;font-size:12px}.s-fileupload-list .s-fileupload-list-file .fas.fa-times{color:#c13018;font-size:12px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions{margin-top:15px;align-self:center;width:100%}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action{text-decoration:none;color:#428bca}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action:hover,.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action :focus,.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action :visited{text-decoration:none}@media (min-width: 768px){.s-fileupload-list .s-fileupload-list-file{flex-wrap:nowrap}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name{width:auto;flex-grow:2}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-status{margin:0 15px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions{margin:0;width:auto}}\n"], dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor"], outputs: ["clicked"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.ProgressBarComponent, selector: "s-progressbar", inputs: ["value", "activeColor", "numberFormatOptions", "targetValue", "label", "targetLabel", "showValue", "mode"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
|
|
250
250
|
}
|
|
251
251
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileUploadComponent, decorators: [{
|
|
252
252
|
type: Component,
|
|
253
|
-
args: [{ selector: 's-file-upload', template: "<div\n [id]=\"id\"\n class=\"s-fileupload\"\n>\n <div class=\"s-fileupload-choose\">\n <input\n #inputUpload\n [id]=\"id + 'input-upload'\"\n type=\"file\"\n name=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n (change)=\"_onInputFileSelect($event)\"\n />\n <s-button\n *ngIf=\"permissions.includes(ADD_PERMISSION)\"\n [id]=\"id + 'upload-button'\"\n [label]=\"chooseLabel || 'platform.angular_components.attach_files' | translate\"\n (clicked)=\"inputUpload.click()\"\n priority=\"primary\"\n [disabled]=\"disabled || !!formGroup?.disabled || fileLimit === files.length\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n\n <section\n *ngIf=\"files.length\"\n [id]=\"id + 'fileupload-list'\"\n class=\"s-fileupload-list\"\n role=\"grid\"\n >\n <ng-container *ngFor=\"let file of files; let i = index\">\n <div\n class=\"s-fileupload-list-file\"\n role=\"row\"\n >\n <div\n [id]=\"id + '-file-' + i + '-name'\"\n class=\"flex flex-grow items-center justify-between overflow-hidden text-ellipsis text-nowrap\"\n role=\"gridcell\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (permissions.includes(READ_PERMISSION) && file.savedFile) || file.progress === 100\n ? descriptionUrl\n : description;\n context: {\n $implicit: file,\n index: i,\n }\n \"\n >\n </ng-container>\n\n <span>{{ formatFileSize(file.size) }}</span>\n\n <span\n *ngIf=\"modifiedDate\"\n class=\"s-fileupload-list-file-name-date\"\n >{{ modifiedDate }}</span\n >\n </div>\n <div\n class=\"s-fileupload-list-file-status\"\n role=\"gridcell\"\n >\n <p-progressBar\n *ngIf=\"file.isUploading && !isSmallDevice\"\n [style]=\"{\n width: '250px',\n 'background-color': '#d8d8d8',\n 'border-radius': '0px',\n height: '14px',\n }\"\n [value]=\"file.progress\"\n [showValue]=\"false\"\n role=\"alert\"\n [attr.aria-label]=\"ariaLabelProgress || 'platform.angular_components.loading_file' | translate\"\n >\n </p-progressBar>\n <span\n *ngIf=\"file.isUploading && isSmallDevice\"\n [id]=\"id + '-file-' + i + '-spin'\"\n class=\"fas fa-circle-notch fa-spin\"\n [attr.aria-label]=\"ariaLabelProgress || 'platform.angular_components.loading_file' | translate\"\n >\n </span>\n\n <span\n *ngIf=\"!file.isUploading && !file.error && file.progress === 100\"\n [id]=\"id + '-file-' + i + '-check'\"\n class=\"fas fa-check\"\n role=\"alert\"\n [attr.aria-label]=\"\n ariaLabelSuccess ||\n successTooltip ||\n 'platform.angular_components.file_attached_successfully' | translate\n \"\n [pTooltip]=\"\n successTooltip || 'platform.angular_components.file_attached_successfully' | translate\n \"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n <span\n *ngIf=\"file.error?.message\"\n [id]=\"id + '-file-' + i + '-error'\"\n class=\"fas fa-times\"\n role=\"alert\"\n [pTooltip]=\"file.error?.message\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n </div>\n <div\n class=\"s-fileupload-list-file-actions\"\n role=\"gridcell\"\n >\n <a\n *ngIf=\"file.isUploading\"\n [id]=\"id + '-file-' + i + '-cancel'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onCancelUpload(i)\"\n >\n {{ cancelLabel || 'platform.angular_components.cancel' | translate }}\n </a>\n <a\n *ngIf=\"\n permissions.includes(REMOVE_PERMISSION) &&\n !file.isUploading &&\n !(disabled || !!formGroup?.disabled)\n \"\n role=\"button\"\n tabindex=\"0\"\n [id]=\"id + '-file-' + i + '-remove'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onRemoveFile(file)\"\n [attr.aria-label]=\"\n ariaLabelRemove || removeLabel || 'platform.angular_components.remove' | translate\n \"\n >\n {{ removeLabel || 'platform.angular_components.remove' | translate }}\n </a>\n </div>\n </div>\n </ng-container>\n </section>\n</div>\n\n<ng-template\n #descriptionUrl\n let-file\n let-i=\"index\"\n>\n <div class=\"flex justify-between\">\n <div>\n <a\n [id]=\"id + '-file-' + i + '-name-link'\"\n tabindex=\"0\"\n (click)=\"onDowloadFile(i)\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n class=\"break-words\"\n >{{ file.name }}\n </a>\n <a\n style=\"display: none\"\n [href]=\"file.objectURL\"\n target=\"_blank\"\n download\n #anchor\n >\n </a>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #description\n let-file\n>\n <div class=\"flex justify-between\">\n <span\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n >\n {{ file.name }}\n </span>\n </div>\n</ng-template>\n\n", styles: [".s-fileupload .s-fileupload-choose{position:relative;margin:15px 0;width:max-content}.s-fileupload input[type=file]{display:none}.s-fileupload-list{border:1px solid #ccc}.s-fileupload-list-file:not(:first-child){border-top:1px solid #ccc}.s-fileupload-list .s-fileupload-list-file{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;padding:15px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name{display:flex;flex-direction:column;align-self:center;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name .s-fileupload-list-file-name-date{font-size:.75rem;color:#999}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name>a{cursor:pointer;text-decoration:none}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-status{align-self:center}.s-fileupload-list .s-fileupload-list-file .fas.fa-circle-notch{color:#d8d8d8;font-size:12px}.s-fileupload-list .s-fileupload-list-file .fas.fa-check{color:#0c9348;font-size:12px}.s-fileupload-list .s-fileupload-list-file .fas.fa-times{color:#c13018;font-size:12px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions{margin-top:15px;align-self:center;width:100%}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action{text-decoration:none;color:#428bca}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action:hover,.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action :focus,.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action :visited{text-decoration:none}@media (min-width: 768px){.s-fileupload-list .s-fileupload-list-file{flex-wrap:nowrap}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name{width:auto;flex-grow:2}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-status{margin:0 15px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions{margin:0;width:auto}}\n"] }]
|
|
253
|
+
args: [{ selector: 's-file-upload', template: "<div\n [id]=\"id\"\n class=\"s-fileupload\"\n>\n <div class=\"s-fileupload-choose\">\n <input\n #inputUpload\n [id]=\"id + 'input-upload'\"\n type=\"file\"\n name=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n (change)=\"_onInputFileSelect($event)\"\n />\n @if (permissions.includes(ADD_PERMISSION)) {\n <s-button\n [id]=\"id + 'upload-button'\"\n [label]=\"chooseLabel || 'platform.angular_components.attach_files' | translate\"\n (clicked)=\"inputUpload.click()\"\n priority=\"primary\"\n [disabled]=\"disabled || !!formGroup?.disabled || fileLimit === files.length\"\n [auxiliary]=\"false\"\n >\n </s-button>\n }\n </div>\n\n @if (files.length) {\n <section\n [id]=\"id + 'fileupload-list'\"\n class=\"s-fileupload-list\"\n role=\"grid\"\n >\n @for (file of files; track file; let i = $index) {\n <div\n class=\"s-fileupload-list-file\"\n role=\"row\"\n >\n <div\n [id]=\"id + '-file-' + i + '-name'\"\n class=\"flex flex-grow items-center justify-between overflow-hidden text-ellipsis text-nowrap\"\n role=\"gridcell\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (permissions.includes(READ_PERMISSION) && file.savedFile) || file.progress === 100\n ? descriptionUrl\n : description;\n context: {\n $implicit: file,\n index: i,\n }\n \"\n >\n </ng-container>\n\n <span>{{ formatFileSize(file.size) }}</span>\n\n @if (modifiedDate) {\n <span class=\"s-fileupload-list-file-name-date\">{{ modifiedDate }}</span>\n }\n </div>\n <div\n class=\"s-fileupload-list-file-status\"\n role=\"gridcell\"\n >\n @if (file.isUploading && !isSmallDevice) {\n <div class=\"w-64\">\n <s-progressbar\n [value]=\"file.progress ?? 0\"\n [showValue]=\"false\"\n activeColor=\"blue\"\n ></s-progressbar>\n </div>\n }\n\n @if (file.isUploading && isSmallDevice) {\n <span\n [id]=\"id + '-file-' + i + '-spin'\"\n class=\"fas fa-circle-notch fa-spin\"\n [attr.aria-label]=\"\n ariaLabelProgress || 'platform.angular_components.loading_file' | translate\n \"\n >\n </span>\n }\n\n @if (!file.isUploading && !file.error && file.progress === 100) {\n <span\n [id]=\"id + '-file-' + i + '-check'\"\n class=\"fas fa-check\"\n role=\"alert\"\n [attr.aria-label]=\"\n ariaLabelSuccess ||\n successTooltip ||\n 'platform.angular_components.file_attached_successfully' | translate\n \"\n [pTooltip]=\"\n successTooltip || 'platform.angular_components.file_attached_successfully'\n | translate\n \"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n }\n\n @if (file.error?.message) {\n <span\n [id]=\"id + '-file-' + i + '-error'\"\n class=\"fas fa-times\"\n role=\"alert\"\n [pTooltip]=\"file.error?.message\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n }\n </div>\n <div\n class=\"s-fileupload-list-file-actions\"\n role=\"gridcell\"\n >\n @if (file.isUploading) {\n <a\n [id]=\"id + '-file-' + i + '-cancel'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onCancelUpload(i)\"\n >\n {{ cancelLabel || 'platform.angular_components.cancel' | translate }}\n </a>\n }\n\n @if (\n permissions.includes(REMOVE_PERMISSION) &&\n !file.isUploading &&\n !(disabled || !!formGroup?.disabled)\n ) {\n <a\n role=\"button\"\n tabindex=\"0\"\n [id]=\"id + '-file-' + i + '-remove'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onRemoveFile(file)\"\n [attr.aria-label]=\"\n ariaLabelRemove || removeLabel || 'platform.angular_components.remove' | translate\n \"\n >\n {{ removeLabel || 'platform.angular_components.remove' | translate }}\n </a>\n }\n </div>\n </div>\n }\n </section>\n }\n</div>\n\n<ng-template\n #descriptionUrl\n let-file\n let-i=\"index\"\n>\n <div class=\"flex justify-between\">\n <div>\n <a\n [id]=\"id + '-file-' + i + '-name-link'\"\n tabindex=\"0\"\n (click)=\"onDowloadFile(i)\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n class=\"break-words\"\n >{{ file.name }}\n </a>\n <a\n style=\"display: none\"\n [href]=\"file.objectURL\"\n target=\"_blank\"\n download\n #anchor\n >\n </a>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #description\n let-file\n>\n <div class=\"flex justify-between\">\n <span\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n >\n {{ file.name }}\n </span>\n </div>\n</ng-template>\n\n", styles: [".s-fileupload .s-fileupload-choose{position:relative;margin:15px 0;width:max-content}.s-fileupload input[type=file]{display:none}.s-fileupload-list{border:1px solid #ccc}.s-fileupload-list-file:not(:first-child){border-top:1px solid #ccc}.s-fileupload-list .s-fileupload-list-file{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;padding:15px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name{display:flex;flex-direction:column;align-self:center;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name .s-fileupload-list-file-name-date{font-size:.75rem;color:#999}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name>a{cursor:pointer;text-decoration:none}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-status{align-self:center}.s-fileupload-list .s-fileupload-list-file .fas.fa-circle-notch{color:#d8d8d8;font-size:12px}.s-fileupload-list .s-fileupload-list-file .fas.fa-check{color:#0c9348;font-size:12px}.s-fileupload-list .s-fileupload-list-file .fas.fa-times{color:#c13018;font-size:12px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions{margin-top:15px;align-self:center;width:100%}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action{text-decoration:none;color:#428bca}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action:hover,.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action :focus,.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions a.s-fileupload-list-file-actions-action :visited{text-decoration:none}@media (min-width: 768px){.s-fileupload-list .s-fileupload-list-file{flex-wrap:nowrap}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-name{width:auto;flex-grow:2}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-status{margin:0 15px}.s-fileupload-list .s-fileupload-list-file .s-fileupload-list-file-actions{margin:0;width:auto}}\n"] }]
|
|
254
254
|
}], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: FileUploadService }, { type: i3.TranslateService }], propDecorators: { inputUpload: [{
|
|
255
255
|
type: ViewChild,
|
|
256
256
|
args: ['inputUpload', { static: false }]
|
|
@@ -316,31 +316,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
316
316
|
|
|
317
317
|
class FileUploadModule {
|
|
318
318
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileUploadModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
319
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: FileUploadModule, declarations: [FileUploadComponent], imports: [CommonModule,
|
|
320
|
-
|
|
321
|
-
TooltipModule,
|
|
322
|
-
ProgressBarModule,
|
|
323
|
-
TranslateModule,
|
|
324
|
-
LocaleModule], exports: [FileUploadComponent] });
|
|
325
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileUploadModule, providers: [FileUploadService], imports: [CommonModule,
|
|
326
|
-
ButtonModule,
|
|
327
|
-
TooltipModule,
|
|
328
|
-
ProgressBarModule,
|
|
329
|
-
TranslateModule,
|
|
330
|
-
LocaleModule] });
|
|
319
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: FileUploadModule, declarations: [FileUploadComponent], imports: [CommonModule, ButtonModule, TooltipModule, ProgressBarModule, TranslateModule, LocaleModule], exports: [FileUploadComponent] });
|
|
320
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileUploadModule, providers: [FileUploadService], imports: [CommonModule, ButtonModule, TooltipModule, ProgressBarModule, TranslateModule, LocaleModule] });
|
|
331
321
|
}
|
|
332
322
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FileUploadModule, decorators: [{
|
|
333
323
|
type: NgModule,
|
|
334
324
|
args: [{
|
|
335
325
|
declarations: [FileUploadComponent],
|
|
336
|
-
imports: [
|
|
337
|
-
CommonModule,
|
|
338
|
-
ButtonModule,
|
|
339
|
-
TooltipModule,
|
|
340
|
-
ProgressBarModule,
|
|
341
|
-
TranslateModule,
|
|
342
|
-
LocaleModule,
|
|
343
|
-
],
|
|
326
|
+
imports: [CommonModule, ButtonModule, TooltipModule, ProgressBarModule, TranslateModule, LocaleModule],
|
|
344
327
|
providers: [FileUploadService],
|
|
345
328
|
exports: [FileUploadComponent],
|
|
346
329
|
}]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seniorsistemas-angular-components-file-upload.mjs","sources":["../../projects/angular-components/file-upload/src/lib/file-upload/models/file-upload-permissions.ts","../../projects/angular-components/file-upload/src/lib/file-upload/file-upload.service.ts","../../projects/angular-components/file-upload/src/lib/file-upload/file-upload.component.ts","../../projects/angular-components/file-upload/src/lib/file-upload/file-upload.component.html","../../projects/angular-components/file-upload/src/lib/file-upload/file-upload.module.ts","../../projects/angular-components/file-upload/src/seniorsistemas-angular-components-file-upload.ts"],"sourcesContent":["export type FileUploadPermissions = 'add' | 'read' | 'remove';\n\nexport const ALL_PERMISSIONS: FileUploadPermissions[] = ['add', 'read', 'remove'];\n","import { Injectable } from '@angular/core';\nimport { ListBlobMetadataRequest, ListBlobMetadataResponse } from './models/list-blob-metadata';\nimport { CustomHttpClient } from '@seniorsistemas/angular-components/common';\n\n@Injectable()\nexport class FileUploadService {\n private BASE_URL_FIELD_CUSTOMIZATION = 'platform/field_customization';\n private TOKEN = new AbortController();\n\n public async getMetadataCustomField<T>(request: ListBlobMetadataRequest): Promise<ListBlobMetadataResponse> {\n return CustomHttpClient.post(`${this.BASE_URL_FIELD_CUSTOMIZATION}/queries/getFileMetadata`, request, {\n signal: this.TOKEN.signal,\n });\n }\n}\n","import {\n AfterContentInit,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport moment from 'moment';\nimport { FileUploadService } from './file-upload.service';\nimport { ListBlobMetadataResponse } from './models/list-blob-metadata';\nimport { FileDto } from './models/file-dto';\nimport { UploadError } from './models/uploadError';\nimport { FileUploadPermissions, ALL_PERMISSIONS } from './models/file-upload-permissions';\nimport { Breakpoints, isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\n\n@Component({\n selector: 's-file-upload',\n templateUrl: './file-upload.component.html',\n styleUrls: ['./file-upload.component.scss'],\n})\nexport class FileUploadComponent implements OnInit, OnDestroy, AfterContentInit {\n public static nextId = 0;\n\n public ADD_PERMISSION: FileUploadPermissions = 'add';\n public READ_PERMISSION: FileUploadPermissions = 'read';\n public REMOVE_PERMISSION: FileUploadPermissions = 'remove';\n\n @ViewChild('inputUpload', { static: false })\n private readonly inputUpload: ElementRef | null = null;\n\n @ViewChild('anchor', { static: false })\n private readonly anchor: ElementRef | null = null;\n\n @Input()\n public id = `s-file-upload-${FileUploadComponent.nextId++}`;\n\n @Input()\n public chooseLabel?: string;\n\n @Input()\n public removeLabel?: string;\n\n @Input()\n public cancelLabel?: string;\n\n @Input()\n public successTooltip?: string;\n\n @Input()\n public multiple?: boolean;\n\n @Input()\n public accept?: string;\n\n @Input()\n public supportedExtensions: string[] = [];\n\n @Input()\n public ariaLabelFileName?: string;\n\n @Input()\n public maxFileSize?: number;\n\n @Input()\n public maxCombinedFileSize?: number;\n\n @Input()\n public fileLimit?: number;\n\n @Input()\n public ariaLabelProgress?: string;\n\n @Input()\n public ariaLabelSuccess?: string;\n\n @Input()\n public ariaLabelError?: string;\n\n @Input()\n public ariaLabelRemove?: string;\n\n @Input()\n public formGroup?: FormControl;\n\n @Input()\n public disabled = false;\n\n @Input()\n public showFileUploadDate: boolean = false;\n\n @Input()\n public permissions: FileUploadPermissions[] = ALL_PERMISSIONS;\n\n @Input()\n public set files(files: FileDto[]) {\n if (this.showFileUploadDate && files[0]?.objectId) {\n this.getUploadDate(files);\n }\n this._files = files.map((file) => {\n file.objectURL = this.sanitizer.bypassSecurityTrustUrl(window.URL.createObjectURL(file));\n return file;\n });\n }\n\n @Output()\n public uploadHandler: EventEmitter<{ files: FileDto[] }> = new EventEmitter();\n\n @Output()\n public removeFile: EventEmitter<{ file: File }> = new EventEmitter();\n\n @Output()\n public cancelUpload: EventEmitter<number> = new EventEmitter();\n\n @Output()\n public downloadFile: EventEmitter<{ index: number; anchor: ElementRef }> = new EventEmitter();\n\n @Output()\n public validateErrors: EventEmitter<UploadError> = new EventEmitter();\n\n private _files: FileDto[] = [];\n private readonly ngUsubscribe: Subject<void> = new Subject();\n public isSmallDevice = false;\n public inputValue = '';\n public modifiedDate?: string;\n\n constructor(\n private readonly sanitizer: DomSanitizer,\n private readonly fileUploadService: FileUploadService,\n private readonly translate: TranslateService,\n ) {}\n\n public ngOnInit(): void {\n this.supportedExtensions = this.supportedExtensions.map((extension) =>\n extension.replace('.', '').toLowerCase(),\n );\n }\n\n public ngOnDestroy() {\n this.ngUsubscribe.next();\n this.ngUsubscribe.complete();\n }\n\n public ngAfterContentInit() {\n this.update();\n }\n\n @HostListener('window:resize')\n public onResize() {\n this.update();\n }\n\n public _onInputFileSelect($event: Event): void {\n const eventTargetFiles = ($event.target as HTMLInputElement)?.files as FileList;\n const dataTransferFiles = ($event as DragEvent).dataTransfer?.files as FileList;\n const files: FileDto[] = Array.from(dataTransferFiles ? dataTransferFiles : eventTargetFiles);\n this.onFileSelect(files);\n }\n\n public onFileSelect(files: FileDto[]): void {\n const newFiles: FileDto[] = [];\n\n if (!this.multiple) {\n this.files = [];\n }\n\n if (this.isFileLimitExceeded(files)) {\n this.validateErrors.emit({\n files,\n validation: 'maxFileLimit',\n });\n this.clearFileInput();\n return;\n }\n\n if (this.isFileCombinedSizeExceeded(files)) {\n this.validateErrors.emit({\n files: files,\n validation: 'maxCombinedFileSize',\n });\n this.clearFileInput();\n return;\n }\n\n for (const file of files) {\n if (this.isUnsupportedFileExtension(file)) {\n this.validateErrors.emit({\n files: [file],\n validation: 'unsupportedExtension',\n });\n continue;\n }\n\n if (this.isFileSizeExceeded(file)) {\n this.validateErrors.emit({\n files: [file],\n validation: 'maxFileSize',\n });\n continue;\n }\n\n newFiles.push(file);\n }\n\n if (newFiles.length) {\n this.files = this.files.concat(newFiles);\n this.uploadHandler.emit({\n files: newFiles,\n });\n }\n\n this.clearFileInput();\n }\n\n public onRemoveFile(file: FileDto): void {\n const fileIndex = this.files.indexOf(file);\n const removedFiles = this.files.splice(fileIndex, 1);\n\n if (removedFiles.length) {\n this.removeFile.emit({ file });\n }\n }\n\n public onCancelUpload(index: number) {\n const removedFiles = this.files.splice(index, 1);\n\n if (removedFiles.length) {\n this.cancelUpload.emit(index);\n }\n\n this.clearFileInput();\n }\n\n public onDowloadFile(index: number) {\n if (isNullOrUndefined(this.anchor)) return;\n\n this.downloadFile.emit({\n index,\n anchor: this.anchor,\n });\n }\n\n public get files(): FileDto[] {\n return this._files;\n }\n\n public formatFileSize(size: number): string {\n if (size === 0) {\n return '0 Bytes';\n }\n const k = 1024;\n const sizes = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(size) / Math.log(k));\n return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n private update() {\n const windowWidth = window.innerWidth;\n this.isSmallDevice = windowWidth <= Breakpoints.SM_MAX;\n }\n\n private isFileLimitExceeded(files: FileDto[]) {\n if (!this.fileLimit) {\n return false;\n }\n return this.files.length + files.length > this.fileLimit;\n }\n\n private isFileCombinedSizeExceeded(files: File[]): boolean {\n if (!this.maxCombinedFileSize) {\n return false;\n }\n\n const filesList = [...files, ...this.files];\n\n const combinedSize = filesList.reduce((combinedSize, file) => combinedSize + file.size, 0);\n\n return combinedSize > this.maxCombinedFileSize;\n }\n\n private isFileSizeExceeded(file: File): boolean {\n if (!this.maxFileSize) {\n return false;\n }\n return file.size > this.maxFileSize;\n }\n\n private isUnsupportedFileExtension(file: File) {\n if (this.supportedExtensions?.length) {\n const extension = file.name.split('.').pop()?.toLowerCase() ?? '';\n\n return !this.supportedExtensions.includes(extension);\n }\n return false;\n }\n\n private clearFileInput() {\n if (isNullOrUndefined(this.inputUpload?.nativeElement)) return;\n\n this.inputUpload.nativeElement.value = null;\n }\n\n private getUploadDate(blobFile: FileDto[]): void {\n if (!blobFile) {\n return;\n }\n\n this.fileUploadService\n .getMetadataCustomField({ objectId: blobFile[0].objectId ?? '' })\n .then((metadata) => this.setModifiedDate(metadata));\n }\n\n private setModifiedDate(metadata: ListBlobMetadataResponse): void {\n const hour = moment(metadata.modified).format('HH');\n const minutes = moment(metadata.modified).format('mm');\n const day = moment(metadata.modified).format('DD');\n const month = moment(metadata.modified).format('MM');\n const fullYear = moment(metadata.modified).format('YYYY');\n\n this.modifiedDate = this.translate.instant('platform.angular_components.date_modified_custom_blob', {\n hour,\n minutes,\n day,\n month,\n fullYear,\n });\n }\n}\n\n","<div\n [id]=\"id\"\n class=\"s-fileupload\"\n>\n <div class=\"s-fileupload-choose\">\n <input\n #inputUpload\n [id]=\"id + 'input-upload'\"\n type=\"file\"\n name=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n (change)=\"_onInputFileSelect($event)\"\n />\n <s-button\n *ngIf=\"permissions.includes(ADD_PERMISSION)\"\n [id]=\"id + 'upload-button'\"\n [label]=\"chooseLabel || 'platform.angular_components.attach_files' | translate\"\n (clicked)=\"inputUpload.click()\"\n priority=\"primary\"\n [disabled]=\"disabled || !!formGroup?.disabled || fileLimit === files.length\"\n [auxiliary]=\"false\"\n >\n </s-button>\n </div>\n\n <section\n *ngIf=\"files.length\"\n [id]=\"id + 'fileupload-list'\"\n class=\"s-fileupload-list\"\n role=\"grid\"\n >\n <ng-container *ngFor=\"let file of files; let i = index\">\n <div\n class=\"s-fileupload-list-file\"\n role=\"row\"\n >\n <div\n [id]=\"id + '-file-' + i + '-name'\"\n class=\"flex flex-grow items-center justify-between overflow-hidden text-ellipsis text-nowrap\"\n role=\"gridcell\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (permissions.includes(READ_PERMISSION) && file.savedFile) || file.progress === 100\n ? descriptionUrl\n : description;\n context: {\n $implicit: file,\n index: i,\n }\n \"\n >\n </ng-container>\n\n <span>{{ formatFileSize(file.size) }}</span>\n\n <span\n *ngIf=\"modifiedDate\"\n class=\"s-fileupload-list-file-name-date\"\n >{{ modifiedDate }}</span\n >\n </div>\n <div\n class=\"s-fileupload-list-file-status\"\n role=\"gridcell\"\n >\n <p-progressBar\n *ngIf=\"file.isUploading && !isSmallDevice\"\n [style]=\"{\n width: '250px',\n 'background-color': '#d8d8d8',\n 'border-radius': '0px',\n height: '14px',\n }\"\n [value]=\"file.progress\"\n [showValue]=\"false\"\n role=\"alert\"\n [attr.aria-label]=\"ariaLabelProgress || 'platform.angular_components.loading_file' | translate\"\n >\n </p-progressBar>\n <span\n *ngIf=\"file.isUploading && isSmallDevice\"\n [id]=\"id + '-file-' + i + '-spin'\"\n class=\"fas fa-circle-notch fa-spin\"\n [attr.aria-label]=\"ariaLabelProgress || 'platform.angular_components.loading_file' | translate\"\n >\n </span>\n\n <span\n *ngIf=\"!file.isUploading && !file.error && file.progress === 100\"\n [id]=\"id + '-file-' + i + '-check'\"\n class=\"fas fa-check\"\n role=\"alert\"\n [attr.aria-label]=\"\n ariaLabelSuccess ||\n successTooltip ||\n 'platform.angular_components.file_attached_successfully' | translate\n \"\n [pTooltip]=\"\n successTooltip || 'platform.angular_components.file_attached_successfully' | translate\n \"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n <span\n *ngIf=\"file.error?.message\"\n [id]=\"id + '-file-' + i + '-error'\"\n class=\"fas fa-times\"\n role=\"alert\"\n [pTooltip]=\"file.error?.message\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n </div>\n <div\n class=\"s-fileupload-list-file-actions\"\n role=\"gridcell\"\n >\n <a\n *ngIf=\"file.isUploading\"\n [id]=\"id + '-file-' + i + '-cancel'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onCancelUpload(i)\"\n >\n {{ cancelLabel || 'platform.angular_components.cancel' | translate }}\n </a>\n <a\n *ngIf=\"\n permissions.includes(REMOVE_PERMISSION) &&\n !file.isUploading &&\n !(disabled || !!formGroup?.disabled)\n \"\n role=\"button\"\n tabindex=\"0\"\n [id]=\"id + '-file-' + i + '-remove'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onRemoveFile(file)\"\n [attr.aria-label]=\"\n ariaLabelRemove || removeLabel || 'platform.angular_components.remove' | translate\n \"\n >\n {{ removeLabel || 'platform.angular_components.remove' | translate }}\n </a>\n </div>\n </div>\n </ng-container>\n </section>\n</div>\n\n<ng-template\n #descriptionUrl\n let-file\n let-i=\"index\"\n>\n <div class=\"flex justify-between\">\n <div>\n <a\n [id]=\"id + '-file-' + i + '-name-link'\"\n tabindex=\"0\"\n (click)=\"onDowloadFile(i)\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n class=\"break-words\"\n >{{ file.name }}\n </a>\n <a\n style=\"display: none\"\n [href]=\"file.objectURL\"\n target=\"_blank\"\n download\n #anchor\n >\n </a>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #description\n let-file\n>\n <div class=\"flex justify-between\">\n <span\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n >\n {{ file.name }}\n </span>\n </div>\n</ng-template>\n\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { TranslateModule } from \"@ngx-translate/core\";\nimport { ProgressBarModule } from \"primeng/progressbar\";\nimport { TooltipModule } from \"primeng/tooltip\";\n\nimport { FileUploadService } from \"./file-upload.service\";\nimport { FileUploadComponent } from \"./file-upload.component\";\nimport { ButtonModule } from \"@seniorsistemas/angular-components/button\";\nimport { LocaleModule } from \"@seniorsistemas/angular-components/locale\";\n\n@NgModule({\n declarations: [FileUploadComponent],\n imports: [\n CommonModule,\n ButtonModule,\n TooltipModule,\n ProgressBarModule,\n TranslateModule,\n LocaleModule,\n ],\n providers: [FileUploadService],\n exports: [FileUploadComponent],\n})\nexport class FileUploadModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.FileUploadService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-file-upload.mjs","sources":["../../projects/angular-components/file-upload/src/lib/file-upload/models/file-upload-permissions.ts","../../projects/angular-components/file-upload/src/lib/file-upload/file-upload.service.ts","../../projects/angular-components/file-upload/src/lib/file-upload/file-upload.component.ts","../../projects/angular-components/file-upload/src/lib/file-upload/file-upload.component.html","../../projects/angular-components/file-upload/src/lib/file-upload/file-upload.module.ts","../../projects/angular-components/file-upload/src/seniorsistemas-angular-components-file-upload.ts"],"sourcesContent":["export type FileUploadPermissions = 'add' | 'read' | 'remove';\n\nexport const ALL_PERMISSIONS: FileUploadPermissions[] = ['add', 'read', 'remove'];\n","import { Injectable } from '@angular/core';\nimport { ListBlobMetadataRequest, ListBlobMetadataResponse } from './models/list-blob-metadata';\nimport { CustomHttpClient } from '@seniorsistemas/angular-components/common';\n\n@Injectable()\nexport class FileUploadService {\n private BASE_URL_FIELD_CUSTOMIZATION = 'platform/field_customization';\n private TOKEN = new AbortController();\n\n public async getMetadataCustomField<T>(request: ListBlobMetadataRequest): Promise<ListBlobMetadataResponse> {\n return CustomHttpClient.post(`${this.BASE_URL_FIELD_CUSTOMIZATION}/queries/getFileMetadata`, request, {\n signal: this.TOKEN.signal,\n });\n }\n}\n","import {\n AfterContentInit,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport moment from 'moment';\nimport { FileUploadService } from './file-upload.service';\nimport { ListBlobMetadataResponse } from './models/list-blob-metadata';\nimport { FileDto } from './models/file-dto';\nimport { UploadError } from './models/uploadError';\nimport { FileUploadPermissions, ALL_PERMISSIONS } from './models/file-upload-permissions';\nimport { Breakpoints, isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\n\n@Component({\n selector: 's-file-upload',\n templateUrl: './file-upload.component.html',\n styleUrls: ['./file-upload.component.scss'],\n})\nexport class FileUploadComponent implements OnInit, OnDestroy, AfterContentInit {\n public static nextId = 0;\n\n public ADD_PERMISSION: FileUploadPermissions = 'add';\n public READ_PERMISSION: FileUploadPermissions = 'read';\n public REMOVE_PERMISSION: FileUploadPermissions = 'remove';\n\n @ViewChild('inputUpload', { static: false })\n private readonly inputUpload: ElementRef | null = null;\n\n @ViewChild('anchor', { static: false })\n private readonly anchor: ElementRef | null = null;\n\n @Input()\n public id = `s-file-upload-${FileUploadComponent.nextId++}`;\n\n @Input()\n public chooseLabel?: string;\n\n @Input()\n public removeLabel?: string;\n\n @Input()\n public cancelLabel?: string;\n\n @Input()\n public successTooltip?: string;\n\n @Input()\n public multiple?: boolean;\n\n @Input()\n public accept?: string;\n\n @Input()\n public supportedExtensions: string[] = [];\n\n @Input()\n public ariaLabelFileName?: string;\n\n @Input()\n public maxFileSize?: number;\n\n @Input()\n public maxCombinedFileSize?: number;\n\n @Input()\n public fileLimit?: number;\n\n @Input()\n public ariaLabelProgress?: string;\n\n @Input()\n public ariaLabelSuccess?: string;\n\n @Input()\n public ariaLabelError?: string;\n\n @Input()\n public ariaLabelRemove?: string;\n\n @Input()\n public formGroup?: FormControl;\n\n @Input()\n public disabled = false;\n\n @Input()\n public showFileUploadDate: boolean = false;\n\n @Input()\n public permissions: FileUploadPermissions[] = ALL_PERMISSIONS;\n\n @Input()\n public set files(files: FileDto[]) {\n if (this.showFileUploadDate && files[0]?.objectId) {\n this.getUploadDate(files);\n }\n this._files = files.map((file) => {\n file.objectURL = this.sanitizer.bypassSecurityTrustUrl(window.URL.createObjectURL(file));\n return file;\n });\n }\n\n @Output()\n public uploadHandler: EventEmitter<{ files: FileDto[] }> = new EventEmitter();\n\n @Output()\n public removeFile: EventEmitter<{ file: File }> = new EventEmitter();\n\n @Output()\n public cancelUpload: EventEmitter<number> = new EventEmitter();\n\n @Output()\n public downloadFile: EventEmitter<{ index: number; anchor: ElementRef }> = new EventEmitter();\n\n @Output()\n public validateErrors: EventEmitter<UploadError> = new EventEmitter();\n\n private _files: FileDto[] = [];\n private readonly ngUsubscribe: Subject<void> = new Subject();\n public isSmallDevice = false;\n public inputValue = '';\n public modifiedDate?: string;\n\n constructor(\n private readonly sanitizer: DomSanitizer,\n private readonly fileUploadService: FileUploadService,\n private readonly translate: TranslateService,\n ) {}\n\n public ngOnInit(): void {\n this.supportedExtensions = this.supportedExtensions.map((extension) =>\n extension.replace('.', '').toLowerCase(),\n );\n }\n\n public ngOnDestroy() {\n this.ngUsubscribe.next();\n this.ngUsubscribe.complete();\n }\n\n public ngAfterContentInit() {\n this.update();\n }\n\n @HostListener('window:resize')\n public onResize() {\n this.update();\n }\n\n public _onInputFileSelect($event: Event): void {\n const eventTargetFiles = ($event.target as HTMLInputElement)?.files as FileList;\n const dataTransferFiles = ($event as DragEvent).dataTransfer?.files as FileList;\n const files: FileDto[] = Array.from(dataTransferFiles ? dataTransferFiles : eventTargetFiles);\n this.onFileSelect(files);\n }\n\n public onFileSelect(files: FileDto[]): void {\n const newFiles: FileDto[] = [];\n\n if (!this.multiple) {\n this.files = [];\n }\n\n if (this.isFileLimitExceeded(files)) {\n this.validateErrors.emit({\n files,\n validation: 'maxFileLimit',\n });\n this.clearFileInput();\n return;\n }\n\n if (this.isFileCombinedSizeExceeded(files)) {\n this.validateErrors.emit({\n files: files,\n validation: 'maxCombinedFileSize',\n });\n this.clearFileInput();\n return;\n }\n\n for (const file of files) {\n if (this.isUnsupportedFileExtension(file)) {\n this.validateErrors.emit({\n files: [file],\n validation: 'unsupportedExtension',\n });\n continue;\n }\n\n if (this.isFileSizeExceeded(file)) {\n this.validateErrors.emit({\n files: [file],\n validation: 'maxFileSize',\n });\n continue;\n }\n\n newFiles.push(file);\n }\n\n if (newFiles.length) {\n this.files = this.files.concat(newFiles);\n this.uploadHandler.emit({\n files: newFiles,\n });\n }\n\n this.clearFileInput();\n }\n\n public onRemoveFile(file: FileDto): void {\n const fileIndex = this.files.indexOf(file);\n const removedFiles = this.files.splice(fileIndex, 1);\n\n if (removedFiles.length) {\n this.removeFile.emit({ file });\n }\n }\n\n public onCancelUpload(index: number) {\n const removedFiles = this.files.splice(index, 1);\n\n if (removedFiles.length) {\n this.cancelUpload.emit(index);\n }\n\n this.clearFileInput();\n }\n\n public onDowloadFile(index: number) {\n if (isNullOrUndefined(this.anchor)) return;\n\n this.downloadFile.emit({\n index,\n anchor: this.anchor,\n });\n }\n\n public get files(): FileDto[] {\n return this._files;\n }\n\n public formatFileSize(size: number): string {\n if (size === 0) {\n return '0 Bytes';\n }\n const k = 1024;\n const sizes = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(size) / Math.log(k));\n return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n private update() {\n const windowWidth = window.innerWidth;\n this.isSmallDevice = windowWidth <= Breakpoints.SM_MAX;\n }\n\n private isFileLimitExceeded(files: FileDto[]) {\n if (!this.fileLimit) {\n return false;\n }\n return this.files.length + files.length > this.fileLimit;\n }\n\n private isFileCombinedSizeExceeded(files: File[]): boolean {\n if (!this.maxCombinedFileSize) {\n return false;\n }\n\n const filesList = [...files, ...this.files];\n\n const combinedSize = filesList.reduce((combinedSize, file) => combinedSize + file.size, 0);\n\n return combinedSize > this.maxCombinedFileSize;\n }\n\n private isFileSizeExceeded(file: File): boolean {\n if (!this.maxFileSize) {\n return false;\n }\n return file.size > this.maxFileSize;\n }\n\n private isUnsupportedFileExtension(file: File) {\n if (this.supportedExtensions?.length) {\n const extension = file.name.split('.').pop()?.toLowerCase() ?? '';\n\n return !this.supportedExtensions.includes(extension);\n }\n return false;\n }\n\n private clearFileInput() {\n if (isNullOrUndefined(this.inputUpload?.nativeElement)) return;\n\n this.inputUpload.nativeElement.value = null;\n }\n\n private getUploadDate(blobFile: FileDto[]): void {\n if (!blobFile) {\n return;\n }\n\n this.fileUploadService\n .getMetadataCustomField({ objectId: blobFile[0].objectId ?? '' })\n .then((metadata) => this.setModifiedDate(metadata));\n }\n\n private setModifiedDate(metadata: ListBlobMetadataResponse): void {\n const hour = moment(metadata.modified).format('HH');\n const minutes = moment(metadata.modified).format('mm');\n const day = moment(metadata.modified).format('DD');\n const month = moment(metadata.modified).format('MM');\n const fullYear = moment(metadata.modified).format('YYYY');\n\n this.modifiedDate = this.translate.instant('platform.angular_components.date_modified_custom_blob', {\n hour,\n minutes,\n day,\n month,\n fullYear,\n });\n }\n}\n\n","<div\n [id]=\"id\"\n class=\"s-fileupload\"\n>\n <div class=\"s-fileupload-choose\">\n <input\n #inputUpload\n [id]=\"id + 'input-upload'\"\n type=\"file\"\n name=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n (change)=\"_onInputFileSelect($event)\"\n />\n @if (permissions.includes(ADD_PERMISSION)) {\n <s-button\n [id]=\"id + 'upload-button'\"\n [label]=\"chooseLabel || 'platform.angular_components.attach_files' | translate\"\n (clicked)=\"inputUpload.click()\"\n priority=\"primary\"\n [disabled]=\"disabled || !!formGroup?.disabled || fileLimit === files.length\"\n [auxiliary]=\"false\"\n >\n </s-button>\n }\n </div>\n\n @if (files.length) {\n <section\n [id]=\"id + 'fileupload-list'\"\n class=\"s-fileupload-list\"\n role=\"grid\"\n >\n @for (file of files; track file; let i = $index) {\n <div\n class=\"s-fileupload-list-file\"\n role=\"row\"\n >\n <div\n [id]=\"id + '-file-' + i + '-name'\"\n class=\"flex flex-grow items-center justify-between overflow-hidden text-ellipsis text-nowrap\"\n role=\"gridcell\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (permissions.includes(READ_PERMISSION) && file.savedFile) || file.progress === 100\n ? descriptionUrl\n : description;\n context: {\n $implicit: file,\n index: i,\n }\n \"\n >\n </ng-container>\n\n <span>{{ formatFileSize(file.size) }}</span>\n\n @if (modifiedDate) {\n <span class=\"s-fileupload-list-file-name-date\">{{ modifiedDate }}</span>\n }\n </div>\n <div\n class=\"s-fileupload-list-file-status\"\n role=\"gridcell\"\n >\n @if (file.isUploading && !isSmallDevice) {\n <div class=\"w-64\">\n <s-progressbar\n [value]=\"file.progress ?? 0\"\n [showValue]=\"false\"\n activeColor=\"blue\"\n ></s-progressbar>\n </div>\n }\n\n @if (file.isUploading && isSmallDevice) {\n <span\n [id]=\"id + '-file-' + i + '-spin'\"\n class=\"fas fa-circle-notch fa-spin\"\n [attr.aria-label]=\"\n ariaLabelProgress || 'platform.angular_components.loading_file' | translate\n \"\n >\n </span>\n }\n\n @if (!file.isUploading && !file.error && file.progress === 100) {\n <span\n [id]=\"id + '-file-' + i + '-check'\"\n class=\"fas fa-check\"\n role=\"alert\"\n [attr.aria-label]=\"\n ariaLabelSuccess ||\n successTooltip ||\n 'platform.angular_components.file_attached_successfully' | translate\n \"\n [pTooltip]=\"\n successTooltip || 'platform.angular_components.file_attached_successfully'\n | translate\n \"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n }\n\n @if (file.error?.message) {\n <span\n [id]=\"id + '-file-' + i + '-error'\"\n class=\"fas fa-times\"\n role=\"alert\"\n [pTooltip]=\"file.error?.message\"\n tooltipPosition=\"top\"\n showDelay=\"500\"\n [appendTo]=\"'body'\"\n >\n </span>\n }\n </div>\n <div\n class=\"s-fileupload-list-file-actions\"\n role=\"gridcell\"\n >\n @if (file.isUploading) {\n <a\n [id]=\"id + '-file-' + i + '-cancel'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onCancelUpload(i)\"\n >\n {{ cancelLabel || 'platform.angular_components.cancel' | translate }}\n </a>\n }\n\n @if (\n permissions.includes(REMOVE_PERMISSION) &&\n !file.isUploading &&\n !(disabled || !!formGroup?.disabled)\n ) {\n <a\n role=\"button\"\n tabindex=\"0\"\n [id]=\"id + '-file-' + i + '-remove'\"\n class=\"s-fileupload-list-file-actions-action\"\n (click)=\"onRemoveFile(file)\"\n [attr.aria-label]=\"\n ariaLabelRemove || removeLabel || 'platform.angular_components.remove' | translate\n \"\n >\n {{ removeLabel || 'platform.angular_components.remove' | translate }}\n </a>\n }\n </div>\n </div>\n }\n </section>\n }\n</div>\n\n<ng-template\n #descriptionUrl\n let-file\n let-i=\"index\"\n>\n <div class=\"flex justify-between\">\n <div>\n <a\n [id]=\"id + '-file-' + i + '-name-link'\"\n tabindex=\"0\"\n (click)=\"onDowloadFile(i)\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n class=\"break-words\"\n >{{ file.name }}\n </a>\n <a\n style=\"display: none\"\n [href]=\"file.objectURL\"\n target=\"_blank\"\n download\n #anchor\n >\n </a>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #description\n let-file\n>\n <div class=\"flex justify-between\">\n <span\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabelFileName || file.name\"\n >\n {{ file.name }}\n </span>\n </div>\n</ng-template>\n\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ButtonModule } from '@seniorsistemas/angular-components/button';\nimport { LocaleModule } from '@seniorsistemas/angular-components/locale';\nimport { ProgressBarModule } from '@seniorsistemas/angular-components/progressbar';\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport { FileUploadComponent } from './file-upload.component';\nimport { FileUploadService } from './file-upload.service';\n\n@NgModule({\n declarations: [FileUploadComponent],\n imports: [CommonModule, ButtonModule, TooltipModule, ProgressBarModule, TranslateModule, LocaleModule],\n providers: [FileUploadService],\n exports: [FileUploadComponent],\n})\nexport class FileUploadModule {}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.FileUploadService"],"mappings":"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"}
|
|
@@ -322,27 +322,6 @@ class NumericMaskDirective {
|
|
|
322
322
|
const multiplier = new BigNumber(10).pow(decimalPlaces);
|
|
323
323
|
return bigNumber.multipliedBy(multiplier).integerValue(BigNumber.ROUND_DOWN).dividedBy(multiplier);
|
|
324
324
|
}
|
|
325
|
-
/**
|
|
326
|
-
* Checks if the value has excessive decimal places
|
|
327
|
-
* @private
|
|
328
|
-
*/
|
|
329
|
-
hasExcessiveDecimalPlaces(value) {
|
|
330
|
-
const parts = value.split(this.decimalSeparator);
|
|
331
|
-
if (parts.length > 1) {
|
|
332
|
-
const decimalPart = parts[1].replace(/[^0-9]/g, '');
|
|
333
|
-
return decimalPart.length > this.maxDecimalPlaces();
|
|
334
|
-
}
|
|
335
|
-
return false;
|
|
336
|
-
}
|
|
337
|
-
/**
|
|
338
|
-
* Clears the input and notifies the model
|
|
339
|
-
* @private
|
|
340
|
-
*/
|
|
341
|
-
clearInput() {
|
|
342
|
-
this.renderer.setProperty(this.elementRef.nativeElement, 'value', '');
|
|
343
|
-
this.lastModelValue = null;
|
|
344
|
-
this.onChange(null);
|
|
345
|
-
}
|
|
346
325
|
/**
|
|
347
326
|
* Parses a string value to its numeric representation, handling separators and sign
|
|
348
327
|
* Returns BigNumber to preserve full precision and optional number conversion
|
|
@@ -386,18 +365,7 @@ class NumericMaskDirective {
|
|
|
386
365
|
const effectiveDecimalPlaces = decimalPart.replace(/0+$/, '').length;
|
|
387
366
|
const decimalPlacesToShow = Math.max(this.minDecimalPlaces(), Math.min(effectiveDecimalPlaces, this.maxDecimalPlaces()));
|
|
388
367
|
decimalPart = decimalPart.substring(0, decimalPlacesToShow).padEnd(decimalPlacesToShow, '0');
|
|
389
|
-
return formattedInteger + this.decimalSeparator + decimalPart;
|
|
390
|
-
}
|
|
391
|
-
/**
|
|
392
|
-
* Formats the value according to the locale
|
|
393
|
-
* @private
|
|
394
|
-
*/
|
|
395
|
-
formatValue(value) {
|
|
396
|
-
if (!value || value.trim() === '') {
|
|
397
|
-
return '';
|
|
398
|
-
}
|
|
399
|
-
const { numeric } = this.parseStringToValue(value);
|
|
400
|
-
return this.formatNumeric(numeric);
|
|
368
|
+
return decimalPart ? formattedInteger + this.decimalSeparator + decimalPart : formattedInteger;
|
|
401
369
|
}
|
|
402
370
|
/**
|
|
403
371
|
* Converts the formatted value to the model format (international standard string)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seniorsistemas-angular-components-numeric-mask.mjs","sources":["../../projects/angular-components/numeric-mask/src/lib/numeric-mask/numeric-mask.directive.ts","../../projects/angular-components/numeric-mask/src/lib/numeric-mask/numeric-mask.module.ts","../../projects/angular-components/numeric-mask/src/seniorsistemas-angular-components-numeric-mask.ts"],"sourcesContent":["import { Directive, effect, ElementRef, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { LocaleService } from '@seniorsistemas/angular-components/locale';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Numeric mask directive with internationalization support.\n *\n * Formats numeric values according to the specified locale, applying\n * appropriate thousand and decimal separators, with support for negative values,\n * min/max decimal places control, and scientific notation.\n *\n * @example\n * ```html\n * <input\n * type=\"text\"\n * sNumericMask\n * [locale]=\"'pt-BR'\"\n * [minDecimalPlaces]=\"2\"\n * [maxDecimalPlaces]=\"2\"\n * [allowNegative]=\"true\"\n * [(ngModel)]=\"value\"\n * />\n * ```\n */\n@Directive({\n selector: '[sNumericMask]',\n standalone: true,\n host: {\n '(input)': 'onInput($event)',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(paste)': 'onPaste($event)',\n '(keydown)': 'onKeyDown($event)',\n '(keypress)': 'onKeyPress($event)',\n '[style.text-align]': '\"right\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NumericMaskDirective),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NumericMaskDirective),\n multi: true,\n },\n ],\n})\nexport class NumericMaskDirective implements OnInit, ControlValueAccessor, Validator {\n /**\n * Locale for formatting (e.g. 'pt-BR', 'en-US', 'de-DE')\n * If not provided, uses the locale from LocaleService\n */\n public locale = input<string | undefined>(undefined);\n\n /**\n * Minimum number of decimal places to display\n * @default 0\n */\n public minDecimalPlaces = input(0);\n\n /**\n * Maximum number of decimal places allowed\n * @default 10\n */\n public maxDecimalPlaces = input(10);\n\n /**\n * Allows negative values\n * @default false\n */\n public allowNegative = input(false);\n\n /**\n * Enables scientific notation support\n * @default true\n */\n public allowScientificNotation = input(true);\n\n /**\n * Minimum value allowed\n */\n public min = input<number | undefined>(undefined);\n\n /**\n * Maximum value allowed\n */\n public max = input<number | undefined>(undefined);\n\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n private readonly renderer = inject(Renderer2);\n private readonly localeService = inject(LocaleService, { optional: true });\n\n private onChange: (value: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n private decimalSeparator = ',';\n private thousandSeparator = '.';\n private currentLocale = 'pt-BR';\n private lastModelValue: string | null = null;\n\n constructor() {\n effect(() => {\n const inputLocale = this.locale();\n\n if (inputLocale) {\n this.currentLocale = inputLocale;\n this.updateSeparators();\n }\n });\n }\n\n public ngOnInit(): void {\n if (this.minDecimalPlaces() > this.maxDecimalPlaces()) {\n throw new Error(\n `NumericMaskDirective: minDecimalPlaces (${this.minDecimalPlaces()}) cannot be greater than maxDecimalPlaces (${this.maxDecimalPlaces()})`\n );\n }\n\n if (this.locale()) {\n this.currentLocale = this.locale()!;\n this.updateSeparators();\n this.setInputMode();\n } else if (this.localeService) {\n this.localeService.get().subscribe(() => {\n this.currentLocale = this.localeService!.getLocaleOptions()?.locale || 'pt-BR';\n this.updateSeparators();\n this.setInputMode();\n });\n } else {\n this.updateSeparators();\n this.setInputMode();\n }\n }\n\n /**\n * Listener for input events (typing)\n */\n public onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n let value = input.value;\n value = this.normalizeSeparators(value);\n this.processInputValue(value);\n }\n\n /**\n * Listener for focus events (gaining focus)\n */\n public onFocus(): void {\n const input = this.elementRef.nativeElement;\n const currentValue = input.value;\n\n if (!currentValue || currentValue.trim() === '') {\n return;\n }\n\n if (this.lastModelValue) {\n const displayValue = this.lastModelValue.replace('.', this.decimalSeparator);\n this.renderer.setProperty(input, 'value', displayValue);\n input.select();\n return;\n }\n\n const modelValue = this.toModelValue(currentValue);\n\n if (!modelValue) {\n return;\n }\n\n const displayValue = modelValue.replace('.', this.decimalSeparator);\n this.renderer.setProperty(input, 'value', displayValue);\n input.select();\n }\n\n /**\n * Listener for blur events (focus loss)\n */\n public onBlur(): void {\n this.onTouched();\n\n const currentValue = this.elementRef.nativeElement.value;\n\n if (!currentValue || currentValue.trim() === '') {\n this.onChange(null);\n this.lastModelValue = null;\n return;\n }\n\n const modelValue = this.toModelValue(currentValue);\n\n if (!modelValue) {\n this.onChange(null);\n this.lastModelValue = null;\n return;\n }\n\n this.lastModelValue = modelValue;\n const displayValue = this.fromModelValue(modelValue);\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', displayValue);\n this.onChange(modelValue);\n }\n\n /**\n * Listener for paste events (clipboard)\n */\n public onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n\n const pastedText = event.clipboardData?.getData('text') || '';\n let value = this.parseClipboardValue(pastedText);\n\n this.processInputValue(value);\n }\n\n /**\n * Listener for special keys (+ and -)\n */\n public onKeyDown(event: KeyboardEvent): void {\n const key = event.key;\n\n if (key === '-' || key === '+') {\n const input = this.elementRef.nativeElement;\n const value = input.value;\n const cursorPosition = input.selectionStart || 0;\n\n if (key === '-' && this.allowScientificNotation()) {\n const charBeforeCursor = value[cursorPosition - 1];\n if (charBeforeCursor === 'e' || charBeforeCursor === 'E') {\n return;\n }\n }\n\n event.preventDefault();\n if (!this.allowNegative()) {\n return;\n }\n\n this.toggleSign(value, key === '-');\n }\n }\n\n /**\n * Listener for keypress to block invalid characters\n */\n public onKeyPress(event: KeyboardEvent): void {\n const key = event.key;\n const input = this.elementRef.nativeElement;\n const cursorPosition = input.selectionStart || 0;\n const value = input.value;\n\n if ((key === '-' || key === '+') && this.allowScientificNotation()) {\n const charBeforeCursor = value[cursorPosition - 1];\n if (charBeforeCursor === 'e' || charBeforeCursor === 'E') {\n return;\n }\n }\n\n if (key === '+' || key === '-') {\n event.preventDefault();\n return;\n }\n\n const isDigit = /^[0-9]$/.test(key);\n const isLocaleDecimalSeparator = key === this.decimalSeparator;\n const isOtherSeparator = (key === ',' || key === '.') && key !== this.decimalSeparator;\n const isScientificNotation = (key === 'e' || key === 'E') && this.allowScientificNotation();\n const isControlKey = event.ctrlKey || event.metaKey || event.altKey;\n const isSpecialKey = [\n 'Backspace',\n 'Tab',\n 'Enter',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Delete',\n 'Home',\n 'End',\n ].includes(key);\n\n if (isOtherSeparator) {\n event.preventDefault();\n return;\n }\n\n if (isScientificNotation) {\n if (value.includes('e') || value.includes('E')) {\n event.preventDefault();\n return;\n }\n\n const charBeforeCursor = value[cursorPosition - 1];\n if (!charBeforeCursor || !/^[0-9]$/.test(charBeforeCursor)) {\n event.preventDefault();\n return;\n }\n }\n\n if (!isDigit && !isLocaleDecimalSeparator && !isScientificNotation && !isControlKey && !isSpecialKey) {\n event.preventDefault();\n }\n }\n\n /**\n * Updates separators according to the locale\n * @private\n */\n private updateSeparators(): void {\n const formatted = new Intl.NumberFormat(this.currentLocale).format(1234.5);\n\n this.thousandSeparator = formatted[1];\n this.decimalSeparator = formatted[5];\n }\n\n /**\n * Processes input value and updates the input and model\n * @private\n */\n private processInputValue(value: string): void {\n if (!this.decimalSeparator || !this.thousandSeparator) {\n this.updateSeparators();\n }\n\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n\n const modelValue = this.toModelValue(value);\n\n // During typing, clear the stored model value so onFocus will recalculate\n this.lastModelValue = null;\n\n this.onChange(modelValue);\n }\n\n /**\n * Sets inputmode for numeric keyboard on mobile devices\n * @private\n */\n private setInputMode(): void {\n this.renderer.setAttribute(this.elementRef.nativeElement, 'inputmode', 'decimal');\n this.renderer.setAttribute(this.elementRef.nativeElement, 'autocomplete', 'off');\n }\n\n /**\n * Removes separators from a formatted value\n * @private\n */\n private removeSeparators(value: string): string {\n const thousandRegex = new RegExp(`\\\\${this.escapeRegex(this.thousandSeparator)}`, 'g');\n return value.replace(thousandRegex, '');\n }\n\n /**\n * Strips unnecessary trailing zeros from decimal part\n * @private\n */\n private stripTrailingZeros(value: string): string {\n const parts = value.split(this.decimalSeparator);\n if (parts.length === 2) {\n const decimalPart = parts[1].replace(/0+$/, '');\n return decimalPart.length > 0 ? parts[0] + this.decimalSeparator + decimalPart : parts[0];\n }\n return value;\n }\n\n /**\n * Normalizes separators during typing\n * @private\n */\n private normalizeSeparators(value: string): string {\n value = this.removeSeparators(value);\n\n if (this.decimalSeparator === ',') {\n value = value.replace(/\\./g, ',');\n } else if (this.decimalSeparator === '.') {\n value = value.replace(/,/g, '.');\n }\n\n const parts = value.split(this.decimalSeparator);\n if (parts.length > 2) {\n value = parts[0] + this.decimalSeparator + parts.slice(1).join('');\n }\n\n return value;\n }\n\n /**\n * Escapes special characters for use in regex\n * @private\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Truncates a number to the specified decimal places (never rounds)\n * @private\n */\n private truncateToDecimalPlaces(bigNumber: BigNumber, decimalPlaces: number): BigNumber {\n if (decimalPlaces < 0) {\n return bigNumber;\n }\n const multiplier = new BigNumber(10).pow(decimalPlaces);\n return bigNumber.multipliedBy(multiplier).integerValue(BigNumber.ROUND_DOWN).dividedBy(multiplier);\n }\n\n /**\n * Checks if the value has excessive decimal places\n * @private\n */\n private hasExcessiveDecimalPlaces(value: string): boolean {\n const parts = value.split(this.decimalSeparator);\n\n if (parts.length > 1) {\n const decimalPart = parts[1].replace(/[^0-9]/g, '');\n return decimalPart.length > this.maxDecimalPlaces();\n }\n\n return false;\n }\n\n /**\n * Clears the input and notifies the model\n * @private\n */\n private clearInput(): void {\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', '');\n this.lastModelValue = null;\n this.onChange(null);\n }\n\n /**\n * Parses a string value to its numeric representation, handling separators and sign\n * Returns BigNumber to preserve full precision and optional number conversion\n * @private\n */\n private parseStringToValue(value: string): { bigNumber: BigNumber; numeric: number; isNegative: boolean } {\n const isNegative = value.startsWith('-');\n let numericStr = value\n .replace(/^-/, '')\n .replace(new RegExp(`\\\\${this.thousandSeparator}`, 'g'), '')\n .replace(new RegExp(`\\\\${this.decimalSeparator}`, 'g'), '.');\n\n if (numericStr === '.' || numericStr === '') {\n numericStr = '0';\n } else if (numericStr.startsWith('.')) {\n numericStr = '0' + numericStr;\n }\n\n let bigNumber = new BigNumber(numericStr);\n if (bigNumber.isNaN()) {\n bigNumber = new BigNumber(0);\n }\n\n if (isNegative && this.allowNegative()) {\n bigNumber = bigNumber.negated();\n }\n\n return { bigNumber, numeric: bigNumber.toNumber(), isNegative };\n }\n\n /**\n * Formats a numeric value according to the locale\n * Truncates (never rounds) to maxDecimalPlaces and pads with zeros to minDecimalPlaces\n * @private\n */\n private formatNumeric(numeric: number | BigNumber): string {\n let bigNumeric = numeric instanceof BigNumber ? numeric : new BigNumber(numeric);\n \n const truncatedValue = this.truncateToDecimalPlaces(bigNumeric, this.maxDecimalPlaces());\n \n const valueStr = truncatedValue.toFixed(Math.max(this.minDecimalPlaces(), this.maxDecimalPlaces()));\n \n let formattedValue = valueStr.replace('.', this.decimalSeparator);\n \n const parts = formattedValue.split(this.decimalSeparator);\n const integerPart = parts[0];\n let decimalPart = parts[1] || '';\n \n const formattedInteger = new Intl.NumberFormat(this.currentLocale).format(\n parseInt(integerPart, 10) || 0\n ).split(this.decimalSeparator)[0];\n \n const effectiveDecimalPlaces = decimalPart.replace(/0+$/, '').length;\n \n const decimalPlacesToShow = Math.max(\n this.minDecimalPlaces(),\n Math.min(effectiveDecimalPlaces, this.maxDecimalPlaces())\n );\n \n decimalPart = decimalPart.substring(0, decimalPlacesToShow).padEnd(decimalPlacesToShow, '0');\n \n return formattedInteger + this.decimalSeparator + decimalPart;\n }\n\n /**\n * Formats the value according to the locale\n * @private\n */\n private formatValue(value: string): string {\n if (!value || value.trim() === '') {\n return '';\n }\n const { numeric } = this.parseStringToValue(value);\n return this.formatNumeric(numeric);\n }\n\n /**\n * Converts the formatted value to the model format (international standard string)\n * Always returns decimal notation, never scientific notation\n * Stores the full precision value without truncation\n * @private\n */\n private toModelValue(formattedValue: string): string | null {\n if (!formattedValue || formattedValue.trim() === '') {\n return null;\n }\n const { bigNumber } = this.parseStringToValue(formattedValue);\n return bigNumber.toFixed();\n }\n\n /**\n * Converts the model value to display format\n * @private\n */\n private fromModelValue(modelValue: string | null): string {\n if (modelValue === null || modelValue === undefined || modelValue === '') {\n return '';\n }\n const bigNumber = new BigNumber(modelValue);\n if (bigNumber.isNaN()) {\n return '';\n }\n return this.formatNumeric(bigNumber);\n }\n\n /**\n * Processes pasted value from clipboard\n * Converts scientific notation to decimal using BigNumber\n * @private\n */\n private parseClipboardValue(text: string): string {\n if (this.allowScientificNotation() && /[eE]/.test(text)) {\n try {\n const bigNumeric = new BigNumber(text);\n if (!bigNumeric.isNaN()) {\n text = bigNumeric.toFixed();\n }\n } catch {\n void 0;\n }\n }\n return this.normalizeSeparators(text);\n }\n\n /**\n * Toggles the sign (- or +) of a value\n * @private\n */\n private toggleSign(value: string, makeNegative: boolean): void {\n const input = this.elementRef.nativeElement;\n let newValue = value;\n\n if (makeNegative && !newValue.startsWith('-')) {\n newValue = '-' + newValue;\n } else if (!makeNegative && newValue.startsWith('-')) {\n newValue = newValue.substring(1);\n } else {\n return;\n }\n\n this.renderer.setProperty(input, 'value', newValue);\n const modelValue = this.toModelValue(newValue);\n this.lastModelValue = null;\n this.onChange(modelValue);\n }\n\n public writeValue(value: string | null): void {\n if (!this.decimalSeparator || !this.thousandSeparator) {\n this.updateSeparators();\n }\n const hasFocus = document.activeElement === this.elementRef.nativeElement;\n if (hasFocus) {\n const formattedValue = this.fromModelValue(value);\n const rawValue = this.stripTrailingZeros(this.removeSeparators(formattedValue));\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', rawValue);\n } else {\n const formattedValue = this.fromModelValue(value);\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', formattedValue);\n }\n }\n\n public registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n const numericValue = parseFloat(value);\n\n if (isNaN(numericValue)) {\n return null;\n }\n\n if (!this.allowNegative() && numericValue < 0) {\n return { negativeNotAllowed: true };\n }\n\n const minValue = this.min();\n if (minValue !== undefined && numericValue < minValue) {\n return {\n min: {\n min: minValue,\n actual: numericValue,\n },\n };\n }\n\n const maxValue = this.max();\n if (maxValue !== undefined && numericValue > maxValue) {\n return {\n max: {\n max: maxValue,\n actual: numericValue,\n },\n };\n }\n\n const decimalPart = value.split('.')[1];\n\n if (decimalPart && decimalPart.length > this.maxDecimalPlaces()) {\n return {\n excessiveDecimalPlaces: {\n max: this.maxDecimalPlaces(),\n actual: decimalPart.length,\n },\n };\n }\n\n return null;\n }\n}\n\n","import { NgModule } from '@angular/core';\n\nimport { NumericMaskDirective } from './numeric-mask.directive';\n\n@NgModule({\n imports: [NumericMaskDirective],\n exports: [NumericMaskDirective],\n})\nexport class CurrencyMaskModule {}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-numeric-mask.mjs","sources":["../../projects/angular-components/numeric-mask/src/lib/numeric-mask/numeric-mask.directive.ts","../../projects/angular-components/numeric-mask/src/lib/numeric-mask/numeric-mask.module.ts","../../projects/angular-components/numeric-mask/src/seniorsistemas-angular-components-numeric-mask.ts"],"sourcesContent":["import { Directive, effect, ElementRef, forwardRef, inject, input, OnInit, Renderer2 } from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { LocaleService } from '@seniorsistemas/angular-components/locale';\nimport BigNumber from 'bignumber.js';\n\n/**\n * Numeric mask directive with internationalization support.\n *\n * Formats numeric values according to the specified locale, applying\n * appropriate thousand and decimal separators, with support for negative values,\n * min/max decimal places control, and scientific notation.\n *\n * @example\n * ```html\n * <input\n * type=\"text\"\n * sNumericMask\n * [locale]=\"'pt-BR'\"\n * [minDecimalPlaces]=\"2\"\n * [maxDecimalPlaces]=\"2\"\n * [allowNegative]=\"true\"\n * [(ngModel)]=\"value\"\n * />\n * ```\n */\n@Directive({\n selector: '[sNumericMask]',\n standalone: true,\n host: {\n '(input)': 'onInput($event)',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(paste)': 'onPaste($event)',\n '(keydown)': 'onKeyDown($event)',\n '(keypress)': 'onKeyPress($event)',\n '[style.text-align]': '\"right\"',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NumericMaskDirective),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => NumericMaskDirective),\n multi: true,\n },\n ],\n})\nexport class NumericMaskDirective implements OnInit, ControlValueAccessor, Validator {\n /**\n * Locale for formatting (e.g. 'pt-BR', 'en-US', 'de-DE')\n * If not provided, uses the locale from LocaleService\n */\n public locale = input<string | undefined>(undefined);\n\n /**\n * Minimum number of decimal places to display\n * @default 0\n */\n public minDecimalPlaces = input(0);\n\n /**\n * Maximum number of decimal places allowed\n * @default 10\n */\n public maxDecimalPlaces = input(10);\n\n /**\n * Allows negative values\n * @default false\n */\n public allowNegative = input(false);\n\n /**\n * Enables scientific notation support\n * @default true\n */\n public allowScientificNotation = input(true);\n\n /**\n * Minimum value allowed\n */\n public min = input<number | undefined>(undefined);\n\n /**\n * Maximum value allowed\n */\n public max = input<number | undefined>(undefined);\n\n private readonly elementRef = inject(ElementRef<HTMLInputElement>);\n private readonly renderer = inject(Renderer2);\n private readonly localeService = inject(LocaleService, { optional: true });\n\n private onChange: (value: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n private decimalSeparator = ',';\n private thousandSeparator = '.';\n private currentLocale = 'pt-BR';\n private lastModelValue: string | null = null;\n\n constructor() {\n effect(() => {\n const inputLocale = this.locale();\n\n if (inputLocale) {\n this.currentLocale = inputLocale;\n this.updateSeparators();\n }\n });\n }\n\n public ngOnInit(): void {\n if (this.minDecimalPlaces() > this.maxDecimalPlaces()) {\n throw new Error(\n `NumericMaskDirective: minDecimalPlaces (${this.minDecimalPlaces()}) cannot be greater than maxDecimalPlaces (${this.maxDecimalPlaces()})`\n );\n }\n\n if (this.locale()) {\n this.currentLocale = this.locale()!;\n this.updateSeparators();\n this.setInputMode();\n } else if (this.localeService) {\n this.localeService.get().subscribe(() => {\n this.currentLocale = this.localeService!.getLocaleOptions()?.locale || 'pt-BR';\n this.updateSeparators();\n this.setInputMode();\n });\n } else {\n this.updateSeparators();\n this.setInputMode();\n }\n }\n\n /**\n * Listener for input events (typing)\n */\n public onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n let value = input.value;\n value = this.normalizeSeparators(value);\n this.processInputValue(value);\n }\n\n /**\n * Listener for focus events (gaining focus)\n */\n public onFocus(): void {\n const input = this.elementRef.nativeElement;\n const currentValue = input.value;\n\n if (!currentValue || currentValue.trim() === '') {\n return;\n }\n\n if (this.lastModelValue) {\n const displayValue = this.lastModelValue.replace('.', this.decimalSeparator);\n this.renderer.setProperty(input, 'value', displayValue);\n input.select();\n return;\n }\n\n const modelValue = this.toModelValue(currentValue);\n\n if (!modelValue) {\n return;\n }\n\n const displayValue = modelValue.replace('.', this.decimalSeparator);\n this.renderer.setProperty(input, 'value', displayValue);\n input.select();\n }\n\n /**\n * Listener for blur events (focus loss)\n */\n public onBlur(): void {\n this.onTouched();\n\n const currentValue = this.elementRef.nativeElement.value;\n\n if (!currentValue || currentValue.trim() === '') {\n this.onChange(null);\n this.lastModelValue = null;\n return;\n }\n\n const modelValue = this.toModelValue(currentValue);\n\n if (!modelValue) {\n this.onChange(null);\n this.lastModelValue = null;\n return;\n }\n\n this.lastModelValue = modelValue;\n const displayValue = this.fromModelValue(modelValue);\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', displayValue);\n this.onChange(modelValue);\n }\n\n /**\n * Listener for paste events (clipboard)\n */\n public onPaste(event: ClipboardEvent): void {\n event.preventDefault();\n\n const pastedText = event.clipboardData?.getData('text') || '';\n let value = this.parseClipboardValue(pastedText);\n\n this.processInputValue(value);\n }\n\n /**\n * Listener for special keys (+ and -)\n */\n public onKeyDown(event: KeyboardEvent): void {\n const key = event.key;\n\n if (key === '-' || key === '+') {\n const input = this.elementRef.nativeElement;\n const value = input.value;\n const cursorPosition = input.selectionStart || 0;\n\n if (key === '-' && this.allowScientificNotation()) {\n const charBeforeCursor = value[cursorPosition - 1];\n if (charBeforeCursor === 'e' || charBeforeCursor === 'E') {\n return;\n }\n }\n\n event.preventDefault();\n if (!this.allowNegative()) {\n return;\n }\n\n this.toggleSign(value, key === '-');\n }\n }\n\n /**\n * Listener for keypress to block invalid characters\n */\n public onKeyPress(event: KeyboardEvent): void {\n const key = event.key;\n const input = this.elementRef.nativeElement;\n const cursorPosition = input.selectionStart || 0;\n const value = input.value;\n\n if ((key === '-' || key === '+') && this.allowScientificNotation()) {\n const charBeforeCursor = value[cursorPosition - 1];\n if (charBeforeCursor === 'e' || charBeforeCursor === 'E') {\n return;\n }\n }\n\n if (key === '+' || key === '-') {\n event.preventDefault();\n return;\n }\n\n const isDigit = /^[0-9]$/.test(key);\n const isLocaleDecimalSeparator = key === this.decimalSeparator;\n const isOtherSeparator = (key === ',' || key === '.') && key !== this.decimalSeparator;\n const isScientificNotation = (key === 'e' || key === 'E') && this.allowScientificNotation();\n const isControlKey = event.ctrlKey || event.metaKey || event.altKey;\n const isSpecialKey = [\n 'Backspace',\n 'Tab',\n 'Enter',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Delete',\n 'Home',\n 'End',\n ].includes(key);\n\n if (isOtherSeparator) {\n event.preventDefault();\n return;\n }\n\n if (isScientificNotation) {\n if (value.includes('e') || value.includes('E')) {\n event.preventDefault();\n return;\n }\n\n const charBeforeCursor = value[cursorPosition - 1];\n if (!charBeforeCursor || !/^[0-9]$/.test(charBeforeCursor)) {\n event.preventDefault();\n return;\n }\n }\n\n if (!isDigit && !isLocaleDecimalSeparator && !isScientificNotation && !isControlKey && !isSpecialKey) {\n event.preventDefault();\n }\n }\n\n /**\n * Updates separators according to the locale\n * @private\n */\n private updateSeparators(): void {\n const formatted = new Intl.NumberFormat(this.currentLocale).format(1234.5);\n\n this.thousandSeparator = formatted[1];\n this.decimalSeparator = formatted[5];\n }\n\n /**\n * Processes input value and updates the input and model\n * @private\n */\n private processInputValue(value: string): void {\n if (!this.decimalSeparator || !this.thousandSeparator) {\n this.updateSeparators();\n }\n\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n\n const modelValue = this.toModelValue(value);\n\n // During typing, clear the stored model value so onFocus will recalculate\n this.lastModelValue = null;\n\n this.onChange(modelValue);\n }\n\n /**\n * Sets inputmode for numeric keyboard on mobile devices\n * @private\n */\n private setInputMode(): void {\n this.renderer.setAttribute(this.elementRef.nativeElement, 'inputmode', 'decimal');\n this.renderer.setAttribute(this.elementRef.nativeElement, 'autocomplete', 'off');\n }\n\n /**\n * Removes separators from a formatted value\n * @private\n */\n private removeSeparators(value: string): string {\n const thousandRegex = new RegExp(`\\\\${this.escapeRegex(this.thousandSeparator)}`, 'g');\n return value.replace(thousandRegex, '');\n }\n\n /**\n * Strips unnecessary trailing zeros from decimal part\n * @private\n */\n private stripTrailingZeros(value: string): string {\n const parts = value.split(this.decimalSeparator);\n if (parts.length === 2) {\n const decimalPart = parts[1].replace(/0+$/, '');\n return decimalPart.length > 0 ? parts[0] + this.decimalSeparator + decimalPart : parts[0];\n }\n return value;\n }\n\n /**\n * Normalizes separators during typing\n * @private\n */\n private normalizeSeparators(value: string): string {\n value = this.removeSeparators(value);\n\n if (this.decimalSeparator === ',') {\n value = value.replace(/\\./g, ',');\n } else if (this.decimalSeparator === '.') {\n value = value.replace(/,/g, '.');\n }\n\n const parts = value.split(this.decimalSeparator);\n if (parts.length > 2) {\n value = parts[0] + this.decimalSeparator + parts.slice(1).join('');\n }\n\n return value;\n }\n\n /**\n * Escapes special characters for use in regex\n * @private\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n /**\n * Truncates a number to the specified decimal places (never rounds)\n * @private\n */\n private truncateToDecimalPlaces(bigNumber: BigNumber, decimalPlaces: number): BigNumber {\n if (decimalPlaces < 0) {\n return bigNumber;\n }\n const multiplier = new BigNumber(10).pow(decimalPlaces);\n return bigNumber.multipliedBy(multiplier).integerValue(BigNumber.ROUND_DOWN).dividedBy(multiplier);\n }\n\n /**\n * Parses a string value to its numeric representation, handling separators and sign\n * Returns BigNumber to preserve full precision and optional number conversion\n * @private\n */\n private parseStringToValue(value: string): { bigNumber: BigNumber; numeric: number; isNegative: boolean } {\n const isNegative = value.startsWith('-');\n let numericStr = value\n .replace(/^-/, '')\n .replace(new RegExp(`\\\\${this.thousandSeparator}`, 'g'), '')\n .replace(new RegExp(`\\\\${this.decimalSeparator}`, 'g'), '.');\n\n if (numericStr === '.' || numericStr === '') {\n numericStr = '0';\n } else if (numericStr.startsWith('.')) {\n numericStr = '0' + numericStr;\n }\n\n let bigNumber = new BigNumber(numericStr);\n if (bigNumber.isNaN()) {\n bigNumber = new BigNumber(0);\n }\n\n if (isNegative && this.allowNegative()) {\n bigNumber = bigNumber.negated();\n }\n\n return { bigNumber, numeric: bigNumber.toNumber(), isNegative };\n }\n\n /**\n * Formats a numeric value according to the locale\n * Truncates (never rounds) to maxDecimalPlaces and pads with zeros to minDecimalPlaces\n * @private\n */\n private formatNumeric(numeric: number | BigNumber): string {\n let bigNumeric = numeric instanceof BigNumber ? numeric : new BigNumber(numeric);\n \n const truncatedValue = this.truncateToDecimalPlaces(bigNumeric, this.maxDecimalPlaces());\n \n const valueStr = truncatedValue.toFixed(Math.max(this.minDecimalPlaces(), this.maxDecimalPlaces()));\n \n let formattedValue = valueStr.replace('.', this.decimalSeparator);\n \n const parts = formattedValue.split(this.decimalSeparator);\n const integerPart = parts[0];\n let decimalPart = parts[1] || '';\n \n const formattedInteger = new Intl.NumberFormat(this.currentLocale).format(\n parseInt(integerPart, 10) || 0\n ).split(this.decimalSeparator)[0];\n \n const effectiveDecimalPlaces = decimalPart.replace(/0+$/, '').length;\n \n const decimalPlacesToShow = Math.max(\n this.minDecimalPlaces(),\n Math.min(effectiveDecimalPlaces, this.maxDecimalPlaces())\n );\n \n decimalPart = decimalPart.substring(0, decimalPlacesToShow).padEnd(decimalPlacesToShow, '0');\n\n return decimalPart ? formattedInteger + this.decimalSeparator + decimalPart : formattedInteger;\n }\n\n /**\n * Converts the formatted value to the model format (international standard string)\n * Always returns decimal notation, never scientific notation\n * Stores the full precision value without truncation\n * @private\n */\n private toModelValue(formattedValue: string): string | null {\n if (!formattedValue || formattedValue.trim() === '') {\n return null;\n }\n const { bigNumber } = this.parseStringToValue(formattedValue);\n return bigNumber.toFixed();\n }\n\n /**\n * Converts the model value to display format\n * @private\n */\n private fromModelValue(modelValue: string | null): string {\n if (modelValue === null || modelValue === undefined || modelValue === '') {\n return '';\n }\n const bigNumber = new BigNumber(modelValue);\n if (bigNumber.isNaN()) {\n return '';\n }\n return this.formatNumeric(bigNumber);\n }\n\n /**\n * Processes pasted value from clipboard\n * Converts scientific notation to decimal using BigNumber\n * @private\n */\n private parseClipboardValue(text: string): string {\n if (this.allowScientificNotation() && /[eE]/.test(text)) {\n try {\n const bigNumeric = new BigNumber(text);\n if (!bigNumeric.isNaN()) {\n text = bigNumeric.toFixed();\n }\n } catch {\n void 0;\n }\n }\n return this.normalizeSeparators(text);\n }\n\n /**\n * Toggles the sign (- or +) of a value\n * @private\n */\n private toggleSign(value: string, makeNegative: boolean): void {\n const input = this.elementRef.nativeElement;\n let newValue = value;\n\n if (makeNegative && !newValue.startsWith('-')) {\n newValue = '-' + newValue;\n } else if (!makeNegative && newValue.startsWith('-')) {\n newValue = newValue.substring(1);\n } else {\n return;\n }\n\n this.renderer.setProperty(input, 'value', newValue);\n const modelValue = this.toModelValue(newValue);\n this.lastModelValue = null;\n this.onChange(modelValue);\n }\n\n public writeValue(value: string | null): void {\n if (!this.decimalSeparator || !this.thousandSeparator) {\n this.updateSeparators();\n }\n const hasFocus = document.activeElement === this.elementRef.nativeElement;\n if (hasFocus) {\n const formattedValue = this.fromModelValue(value);\n const rawValue = this.stripTrailingZeros(this.removeSeparators(formattedValue));\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', rawValue);\n } else {\n const formattedValue = this.fromModelValue(value);\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', formattedValue);\n }\n }\n\n public registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n\n public validate(control: AbstractControl): ValidationErrors | null {\n const value = control.value;\n\n if (!value) {\n return null;\n }\n\n const numericValue = parseFloat(value);\n\n if (isNaN(numericValue)) {\n return null;\n }\n\n if (!this.allowNegative() && numericValue < 0) {\n return { negativeNotAllowed: true };\n }\n\n const minValue = this.min();\n if (minValue !== undefined && numericValue < minValue) {\n return {\n min: {\n min: minValue,\n actual: numericValue,\n },\n };\n }\n\n const maxValue = this.max();\n if (maxValue !== undefined && numericValue > maxValue) {\n return {\n max: {\n max: maxValue,\n actual: numericValue,\n },\n };\n }\n\n const decimalPart = value.split('.')[1];\n\n if (decimalPart && decimalPart.length > this.maxDecimalPlaces()) {\n return {\n excessiveDecimalPlaces: {\n max: this.maxDecimalPlaces(),\n actual: decimalPart.length,\n },\n };\n }\n\n return null;\n }\n}\n\n","import { NgModule } from '@angular/core';\n\nimport { NumericMaskDirective } from './numeric-mask.directive';\n\n@NgModule({\n imports: [NumericMaskDirective],\n exports: [NumericMaskDirective],\n})\nexport class CurrencyMaskModule {}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAaA;;;;;;;;;;;;;;;;;;;AAmBG;MA0BU,oBAAoB,CAAA;AAC7B;;;AAGG;AACI,IAAA,MAAM,GAAG,KAAK,CAAqB,SAAS,CAAC,CAAC;AAErD;;;AAGG;AACI,IAAA,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC;;;AAGG;AACI,IAAA,gBAAgB,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;AAEpC;;;AAGG;AACI,IAAA,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AAEpC;;;AAGG;AACI,IAAA,uBAAuB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;AAE7C;;AAEG;AACI,IAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,CAAC,CAAC;AAElD;;AAEG;AACI,IAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,CAAC,CAAC;AAEjC,IAAA,UAAU,GAAG,MAAM,EAAC,UAA4B,EAAC,CAAC;AAClD,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAEnE,IAAA,QAAQ,GAAmC,MAAK,GAAG,CAAC;AACpD,IAAA,SAAS,GAAe,MAAK,GAAG,CAAC;IACjC,gBAAgB,GAAG,GAAG,CAAC;IACvB,iBAAiB,GAAG,GAAG,CAAC;IACxB,aAAa,GAAG,OAAO,CAAC;IACxB,cAAc,GAAkB,IAAI,CAAC;AAE7C,IAAA,WAAA,GAAA;QACI,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAElC,IAAI,WAAW,EAAE;AACb,gBAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;gBACjC,IAAI,CAAC,gBAAgB,EAAE,CAAC;aAC3B;AACL,SAAC,CAAC,CAAC;KACN;IAEM,QAAQ,GAAA;QACX,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE;AACnD,YAAA,MAAM,IAAI,KAAK,CACX,CAAA,wCAAA,EAA2C,IAAI,CAAC,gBAAgB,EAAE,CAAA,2CAAA,EAA8C,IAAI,CAAC,gBAAgB,EAAE,CAAA,CAAA,CAAG,CAC7I,CAAC;SACL;AAED,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACf,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,EAAG,CAAC;YACpC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;AAAM,aAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YAC3B,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAK;AACpC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAc,CAAC,gBAAgB,EAAE,EAAE,MAAM,IAAI,OAAO,CAAC;gBAC/E,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,EAAE,CAAC;AACxB,aAAC,CAAC,CAAC;SACN;aAAM;YACH,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,EAAE,CAAC;SACvB;KACJ;AAED;;AAEG;AACI,IAAA,OAAO,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;AAC/C,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AACxB,QAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACxC,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;KACjC;AAED;;AAEG;IACI,OAAO,GAAA;AACV,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC5C,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;QAEjC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC7C,OAAO;SACV;AAED,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7E,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YACxD,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,OAAO;SACV;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAEnD,IAAI,CAAC,UAAU,EAAE;YACb,OAAO;SACV;AAED,QAAA,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QACxD,KAAK,CAAC,MAAM,EAAE,CAAC;KAClB;AAED;;AAEG;IACI,MAAM,GAAA;QACT,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC;QAEzD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC7C,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,OAAO;SACV;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAEnD,IAAI,CAAC,UAAU,EAAE;AACb,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,OAAO;SACV;AAED,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AAChF,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAC7B;AAED;;AAEG;AACI,IAAA,OAAO,CAAC,KAAqB,EAAA;QAChC,KAAK,CAAC,cAAc,EAAE,CAAC;AAEvB,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AAEjD,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;KACjC;AAED;;AAEG;AACI,IAAA,SAAS,CAAC,KAAoB,EAAA;AACjC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAEtB,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE;AAC5B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC5C,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AAC1B,YAAA,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;YAEjD,IAAI,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,uBAAuB,EAAE,EAAE;gBAC/C,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;gBACnD,IAAI,gBAAgB,KAAK,GAAG,IAAI,gBAAgB,KAAK,GAAG,EAAE;oBACtD,OAAO;iBACV;aACJ;YAED,KAAK,CAAC,cAAc,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;gBACvB,OAAO;aACV;YAED,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;SACvC;KACJ;AAED;;AAEG;AACI,IAAA,UAAU,CAAC,KAAoB,EAAA;AAClC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC5C,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;AACjD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AAE1B,QAAA,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,IAAI,CAAC,uBAAuB,EAAE,EAAE;YAChE,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,gBAAgB,KAAK,GAAG,IAAI,gBAAgB,KAAK,GAAG,EAAE;gBACtD,OAAO;aACV;SACJ;QAED,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,EAAE;YAC5B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACV;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,QAAA,MAAM,wBAAwB,GAAG,GAAG,KAAK,IAAI,CAAC,gBAAgB,CAAC;AAC/D,QAAA,MAAM,gBAAgB,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,CAAC,gBAAgB,CAAC;AACvF,QAAA,MAAM,oBAAoB,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,IAAI,CAAC,uBAAuB,EAAE,CAAC;AAC5F,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;AACpE,QAAA,MAAM,YAAY,GAAG;YACjB,WAAW;YACX,KAAK;YACL,OAAO;YACP,QAAQ;YACR,WAAW;YACX,YAAY;YACZ,QAAQ;YACR,MAAM;YACN,KAAK;AACR,SAAA,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEhB,IAAI,gBAAgB,EAAE;YAClB,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACV;QAED,IAAI,oBAAoB,EAAE;AACtB,YAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC5C,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;aACV;YAED,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;gBACxD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,OAAO;aACV;SACJ;AAED,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,wBAAwB,IAAI,CAAC,oBAAoB,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE;YAClG,KAAK,CAAC,cAAc,EAAE,CAAC;SAC1B;KACJ;AAED;;;AAGG;IACK,gBAAgB,GAAA;AACpB,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE3E,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;KACxC;AAED;;;AAGG;AACK,IAAA,iBAAiB,CAAC,KAAa,EAAA;QACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAC3B;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAEzE,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;;AAG5C,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAE3B,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAC7B;AAED;;;AAGG;IACK,YAAY,GAAA;AAChB,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAClF,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;KACpF;AAED;;;AAGG;AACK,IAAA,gBAAgB,CAAC,KAAa,EAAA;AAClC,QAAA,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;KAC3C;AAED;;;AAGG;AACK,IAAA,kBAAkB,CAAC,KAAa,EAAA;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACjD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACpB,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChD,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;SAC7F;AACD,QAAA,OAAO,KAAK,CAAC;KAChB;AAED;;;AAGG;AACK,IAAA,mBAAmB,CAAC,KAAa,EAAA;AACrC,QAAA,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAErC,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YAC/B,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SACrC;AAAM,aAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,EAAE;YACtC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SACpC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACjD,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAClB,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACtE;AAED,QAAA,OAAO,KAAK,CAAC;KAChB;AAED;;;AAGG;AACK,IAAA,WAAW,CAAC,GAAW,EAAA;QAC3B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;KACrD;AAED;;;AAGG;IACK,uBAAuB,CAAC,SAAoB,EAAE,aAAqB,EAAA;AACvE,QAAA,IAAI,aAAa,GAAG,CAAC,EAAE;AACnB,YAAA,OAAO,SAAS,CAAC;SACpB;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACxD,QAAA,OAAO,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;KACtG;AAED;;;;AAIG;AACK,IAAA,kBAAkB,CAAC,KAAa,EAAA;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,UAAU,GAAG,KAAK;AACjB,aAAA,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AACjB,aAAA,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,iBAAiB,CAAA,CAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AAC3D,aAAA,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAA,CAAE,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAEjE,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,EAAE,EAAE;YACzC,UAAU,GAAG,GAAG,CAAC;SACpB;AAAM,aAAA,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC;SACjC;AAED,QAAA,IAAI,SAAS,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC;AAC1C,QAAA,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE;AACnB,YAAA,SAAS,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;SAChC;AAED,QAAA,IAAI,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACpC,YAAA,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;SACnC;AAED,QAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC;KACnE;AAED;;;;AAIG;AACK,IAAA,aAAa,CAAC,OAA2B,EAAA;AAC7C,QAAA,IAAI,UAAU,GAAG,OAAO,YAAY,SAAS,GAAG,OAAO,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;AAEjF,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAEzF,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAEpG,QAAA,IAAI,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAElE,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC1D,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAEjC,QAAA,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CACrE,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,CACjC,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAElC,QAAA,MAAM,sBAAsB,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;QAErE,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAChC,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAC5D,CAAC;AAEF,QAAA,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;AAE7F,QAAA,OAAO,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,GAAG,WAAW,GAAG,gBAAgB,CAAC;KAClG;AAED;;;;;AAKG;AACK,IAAA,YAAY,CAAC,cAAsB,EAAA;QACvC,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AACjD,YAAA,OAAO,IAAI,CAAC;SACf;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAC9D,QAAA,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;KAC9B;AAED;;;AAGG;AACK,IAAA,cAAc,CAAC,UAAyB,EAAA;AAC5C,QAAA,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,EAAE,EAAE;AACtE,YAAA,OAAO,EAAE,CAAC;SACb;AACD,QAAA,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC;AAC5C,QAAA,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE;AACnB,YAAA,OAAO,EAAE,CAAC;SACb;AACD,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;KACxC;AAED;;;;AAIG;AACK,IAAA,mBAAmB,CAAC,IAAY,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACrD,YAAA,IAAI;AACA,gBAAA,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;AACvC,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE;AACrB,oBAAA,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;iBAC/B;aACJ;AAAC,YAAA,MAAM;AACJ,gBAAA,KAAK,CAAC,CAAC;aACV;SACJ;AACD,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;KACzC;AAED;;;AAGG;IACK,UAAU,CAAC,KAAa,EAAE,YAAqB,EAAA;AACnD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC5C,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,IAAI,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC3C,YAAA,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC;SAC7B;aAAM,IAAI,CAAC,YAAY,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAClD,YAAA,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SACpC;aAAM;YACH,OAAO;SACV;QAED,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KAC7B;AAEM,IAAA,UAAU,CAAC,KAAoB,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAC3B;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC1E,IAAI,QAAQ,EAAE;YACV,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAClD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAAC;AAChF,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;SAC/E;aAAM;YACH,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAClD,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;SACrF;KACJ;AAEM,IAAA,gBAAgB,CAAC,EAAkC,EAAA;AACtD,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;KACtB;AAEM,IAAA,iBAAiB,CAAC,EAAc,EAAA;AACnC,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;KACvB;AAEM,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;KACpF;AAEM,IAAA,QAAQ,CAAC,OAAwB,EAAA;AACpC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE5B,IAAI,CAAC,KAAK,EAAE;AACR,YAAA,OAAO,IAAI,CAAC;SACf;AAED,QAAA,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAEvC,QAAA,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC;SACf;QAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,YAAY,GAAG,CAAC,EAAE;AAC3C,YAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;SACvC;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,GAAG,QAAQ,EAAE;YACnD,OAAO;AACH,gBAAA,GAAG,EAAE;AACD,oBAAA,GAAG,EAAE,QAAQ;AACb,oBAAA,MAAM,EAAE,YAAY;AACvB,iBAAA;aACJ,CAAC;SACL;AAED,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,GAAG,QAAQ,EAAE;YACnD,OAAO;AACH,gBAAA,GAAG,EAAE;AACD,oBAAA,GAAG,EAAE,QAAQ;AACb,oBAAA,MAAM,EAAE,YAAY;AACvB,iBAAA;aACJ,CAAC;SACL;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAExC,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAC7D,OAAO;AACH,gBAAA,sBAAsB,EAAE;AACpB,oBAAA,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE;oBAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;AAC7B,iBAAA;aACJ,CAAC;SACL;AAED,QAAA,OAAO,IAAI,CAAC;KACf;wGArjBQ,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAblB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,EAAA,EAAA,SAAA,EAAA;AACP,YAAA;AACI,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACnD,gBAAA,KAAK,EAAE,IAAI;AACd,aAAA;AACD,YAAA;AACI,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACnD,gBAAA,KAAK,EAAE,IAAI;AACd,aAAA;AACJ,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAEQ,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAzBhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACF,wBAAA,SAAS,EAAE,iBAAiB;AAC5B,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,QAAQ,EAAE,UAAU;AACpB,wBAAA,SAAS,EAAE,iBAAiB;AAC5B,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,YAAY,EAAE,oBAAoB;AAClC,wBAAA,oBAAoB,EAAE,SAAS;AAClC,qBAAA;AACD,oBAAA,SAAS,EAAE;AACP,wBAAA;AACI,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,0BAA0B,CAAC;AACnD,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;AACD,wBAAA;AACI,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAE,UAAU,CAAC,0BAA0B,CAAC;AACnD,4BAAA,KAAK,EAAE,IAAI;AACd,yBAAA;AACJ,qBAAA;AACJ,iBAAA,CAAA;;;MCjDY,kBAAkB,CAAA;wGAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;yGAAlB,kBAAkB,EAAA,OAAA,EAAA,CAHjB,oBAAoB,CAAA,EAAA,OAAA,EAAA,CACpB,oBAAoB,CAAA,EAAA,CAAA,CAAA;yGAErB,kBAAkB,EAAA,CAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACN,OAAO,EAAE,CAAC,oBAAoB,CAAC;oBAC/B,OAAO,EAAE,CAAC,oBAAoB,CAAC;AAClC,iBAAA,CAAA;;;ACPD;;AAEG;;;;"}
|