@gnggln/ng-ui-system 1.0.0-alpha.0
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/esm2022/gnggln-ng-ui-system.mjs +5 -0
- package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
- package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
- package/esm2022/lib/components/accordion/index.mjs +2 -0
- package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
- package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
- package/esm2022/lib/components/base-layout/index.mjs +14 -0
- package/esm2022/lib/components/button/button-area.component.mjs +196 -0
- package/esm2022/lib/components/button/button.component.mjs +164 -0
- package/esm2022/lib/components/button/button.types.mjs +6 -0
- package/esm2022/lib/components/button/index.mjs +16 -0
- package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
- package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
- package/esm2022/lib/components/crud-table/index.mjs +16 -0
- package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
- package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
- package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
- package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
- package/esm2022/lib/components/form-builder/index.mjs +19 -0
- package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
- package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
- package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
- package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
- package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
- package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
- package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
- package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
- package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
- package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
- package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
- package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
- package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
- package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
- package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
- package/esm2022/lib/components/layout-builder/index.mjs +18 -0
- package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
- package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
- package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
- package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
- package/esm2022/lib/components/modal/index.mjs +4 -0
- package/esm2022/lib/components/modal/modal.component.mjs +139 -0
- package/esm2022/lib/components/modal/modal.service.mjs +194 -0
- package/esm2022/lib/components/modal/modal.types.mjs +6 -0
- package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
- package/esm2022/lib/components/page-header/index.mjs +20 -0
- package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
- package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
- package/esm2022/lib/components/table/index.mjs +2 -0
- package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
- package/esm2022/lib/components/table/table.types.mjs +6 -0
- package/esm2022/lib/core/types/index.mjs +6 -0
- package/esm2022/lib/core/utils/index.mjs +53 -0
- package/esm2022/lib/sources/location-data.opt.json +8942 -0
- package/esm2022/lib/sources/nazioni.opt.json +215 -0
- package/esm2022/public-api.mjs +34 -0
- package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
- package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/accordion/accordion.component.d.ts +118 -0
- package/lib/components/accordion/accordion.types.d.ts +62 -0
- package/lib/components/accordion/index.d.ts +2 -0
- package/lib/components/base-layout/base-layout.component.d.ts +83 -0
- package/lib/components/base-layout/base-layout.types.d.ts +26 -0
- package/lib/components/base-layout/index.d.ts +13 -0
- package/lib/components/button/button-area.component.d.ts +88 -0
- package/lib/components/button/button.component.d.ts +55 -0
- package/lib/components/button/button.types.d.ts +70 -0
- package/lib/components/button/index.d.ts +15 -0
- package/lib/components/crud-table/crud-table.component.d.ts +143 -0
- package/lib/components/crud-table/crud-table.types.d.ts +207 -0
- package/lib/components/crud-table/index.d.ts +15 -0
- package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
- package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
- package/lib/components/form-builder/form-builder.component.d.ts +183 -0
- package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
- package/lib/components/form-builder/index.d.ts +13 -0
- package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
- package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
- package/lib/components/form-builder/services/location.service.d.ts +83 -0
- package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
- package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
- package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
- package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
- package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
- package/lib/components/form-builder/types/condition.types.d.ts +51 -0
- package/lib/components/form-builder/types/field.types.d.ts +288 -0
- package/lib/components/form-builder/types/index.d.ts +5 -0
- package/lib/components/form-builder/types/schema.types.d.ts +227 -0
- package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
- package/lib/components/form-builder/types/validation.types.d.ts +174 -0
- package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
- package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
- package/lib/components/form-builder-editor/index.d.ts +15 -0
- package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
- package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
- package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
- package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
- package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
- package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
- package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
- package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
- package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
- package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
- package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
- package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
- package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
- package/lib/components/layout-builder/index.d.ts +16 -0
- package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
- package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
- package/lib/components/layout-builder/layout.service.d.ts +100 -0
- package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
- package/lib/components/modal/index.d.ts +4 -0
- package/lib/components/modal/modal.component.d.ts +44 -0
- package/lib/components/modal/modal.service.d.ts +93 -0
- package/lib/components/modal/modal.types.d.ts +110 -0
- package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
- package/lib/components/page-header/index.d.ts +16 -0
- package/lib/components/page-header/page-header.component.d.ts +59 -0
- package/lib/components/page-header/page-header.types.d.ts +96 -0
- package/lib/components/table/index.d.ts +2 -0
- package/lib/components/table/paginated-table.component.d.ts +85 -0
- package/lib/components/table/table.types.d.ts +81 -0
- package/lib/core/types/index.d.ts +57 -0
- package/lib/core/utils/index.d.ts +29 -0
- package/package.json +44 -0
- package/public-api.d.ts +22 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module ng-ui-system/crud-table
|
|
3
|
+
* Tipi e interfacce per UiCrudTable.
|
|
4
|
+
*/
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC10YWJsZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC10YWJsZS9jcnVkLXRhYmxlLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBuZy11aS1zeXN0ZW0vY3J1ZC10YWJsZVxuICogVGlwaSBlIGludGVyZmFjY2UgcGVyIFVpQ3J1ZFRhYmxlLlxuICovXG5cbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVaUljb25OYW1lIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcyc7XG5pbXBvcnQgeyBVaUZvcm1TY2hlbWEgfSBmcm9tICcuLi9mb3JtLWJ1aWxkZXIvdHlwZXMvc2NoZW1hLnR5cGVzJztcblxuLy8gUmUtZXhwb3J0IHBlciBjb21vZGl0YSBkZWwgY29uc3VtYXRvcmVcbmV4cG9ydCB7IFVpSWNvbk5hbWUgfTtcblxuLy8g4pSA4pSA4pSAIE1vZGFsaXRhIENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogTW9kYWxpdGEgb3BlcmF0aXZlIGRlbGxhIENSVUQgdGFibGUuXG4gKlxuICogfCBNb2RhbGl0YSAgICB8IERlc2NyaXppb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IGB2aWV3YCAgICAgIHwgVmlzdWFsaXp6YXppb25lIHRhYmVsbGEgKHN0YXRvIGluaXppYWxlKSAgICAgIHxcbiAqIHwgYGluc2VydGAgICAgfCBJbnNlcmltZW50byBudW92byBlbGVtZW50byB0cmFtaXRlIGZvcm0gICAgICAgfFxuICogfCBgZWRpdGAgICAgICB8IE1vZGlmaWNhIGVsZW1lbnRvIGVzaXN0ZW50ZSAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGBkdXBsaWNhdGVgIHwgRHVwbGljYXppb25lIGRpIHVuIGVsZW1lbnRvICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgYHJlYWRvbmx5YCAgfCBWaXN1YWxpenphemlvbmUgZGV0dGFnbGlvIGluIHNvbGEgbGV0dHVyYSAgICAgIHxcbiAqL1xuZXhwb3J0IHR5cGUgVWlDcnVkTW9kZSA9ICd2aWV3JyB8ICdpbnNlcnQnIHwgJ2VkaXQnIHwgJ2R1cGxpY2F0ZScgfCAncmVhZG9ubHknO1xuXG4vLyDilIDilIDilIAgQ29sb25uYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBEZWZpbml6aW9uZSBkaSB1bmEgY29sb25uYSBkZWxsYSBDUlVEIHRhYmxlLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgQ29sb25uYSB0ZXN0dWFsZSBzZW1wbGljZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29sOiBVaUNydWRUYWJsZUNvbHVtbiA9IHtcbiAqICAga2V5OiAnbmFtZScsXG4gKiAgIGhlYWRlcjogJ05vbWUnLFxuICogICB3aWR0aDogJzIwMHB4JyxcbiAqIH07XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ29sb25uYSBjb24gdGVtcGxhdGUgcGVyc29uYWxpenphdG9cbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbDogVWlDcnVkVGFibGVDb2x1bW4gPSB7XG4gKiAgIGtleTogJ3N0YXR1cycsXG4gKiAgIGhlYWRlcjogJ1N0YXRvJyxcbiAqICAgdGVtcGxhdGU6IG15U3RhdHVzVGVtcGxhdGUsXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVWlDcnVkVGFibGVDb2x1bW4ge1xuICAvKiogQ2hpYXZlIGRlbGxhIHByb3ByaWV0YSBuZWxsJ29nZ2V0dG8gcmlnYSAodXNhdGEgcGVyIGFjY2VkZXJlIGFsIHZhbG9yZSkuICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKiBUZXN0byBkZWxsJ2ludGVzdGF6aW9uZSBkZWxsYSBjb2xvbm5hLiAqL1xuICBoZWFkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGVtcGxhdGUgcGVyc29uYWxpenphdG8gcGVyIGxhIGNlbGxhLlxuICAgKiBJbCBjb250ZXN0byBmb3JuaXNjZTogYCRpbXBsaWNpdGAgKHJpZ2EpLCBgY29sdW1uYCAoZGVmaW5pemlvbmUpLCBgaW5kZXhgIChpbmRpY2UgcmlnYSksIGB2YWx1ZWAgKHZhbG9yZSBjZWxsYSkuXG4gICAqL1xuICB0ZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLyoqXG4gICAqIFRlbXBsYXRlIHBlcnNvbmFsaXp6YXRvIHBlciBsJ2ludGVzdGF6aW9uZS5cbiAgICogSWwgY29udGVzdG8gZm9ybmlzY2U6IGAkaW1wbGljaXRgIChjb2xvbm5hKSwgYGNvbHVtbmAgKGRlZmluaXppb25lKS5cbiAgICovXG4gIGhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKiogTGFyZ2hlenphIENTUyBkZWxsYSBjb2xvbm5hIChlcy4gJzEyMHB4JywgJzIwJScpLiAqL1xuICB3aWR0aD86IHN0cmluZztcblxuICAvKiogQWxsaW5lYW1lbnRvIGRlbCB0ZXN0byBuZWxsYSBjb2xvbm5hLiBAZGVmYXVsdCAnbGVmdCcgKi9cbiAgYWxpZ24/OiAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCc7XG5cbiAgLyoqXG4gICAqIFRyb25jYSBpbCB0ZXN0byBvbHRyZSBtYXhMZW5ndGggY2FyYXR0ZXJpIGNvbiBlbGxpcHNpcyBlIHRvb2x0aXAgYXV0b21hdGljby5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGVsbGlwc2lzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTnVtZXJvIG1hc3NpbW8gZGkgY2FyYXR0ZXJpIHByaW1hIGRlbCB0cm9uY2FtZW50by5cbiAgICogQXR0aXZvIHNvbG8gcXVhbmRvIGBlbGxpcHNpc2AgZSBgdHJ1ZWAuXG4gICAqIEBkZWZhdWx0IDUwXG4gICAqL1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgOKUgCBDb25maWd1cmF6aW9uZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBDb25maWd1cmF6aW9uZSBjb21wbGV0YSBkZWxsYSBDUlVEIHRhYmxlLlxuICpcbiAqIENvbnRyb2xsYSBsbyBzY2hlbWEgZGVsIGZvcm0sIGxlIGxhYmVsIGRlaSBwdWxzYW50aSwgaSBwZXJtZXNzaVxuICogcGVyIGF6aW9uZSAoZ2xvYmFsaSBlIHBlci1yaWdhKSBlIGkgY2FsbGJhY2sgcHJlLWFwZXJ0dXJhIGZvcm0uXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBDb25maWd1cmF6aW9uZSBiYXNlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb25maWc6IFVpQ3J1ZFRhYmxlQ29uZmlnID0ge1xuICogICBmb3JtU2NoZW1hOiBteUZvcm1TY2hlbWEsXG4gKiAgIHRhYmxlTGFiZWw6ICdVdGVudGknLFxuICogICBlbXB0eU1lc3NhZ2U6ICdOZXNzdW4gdXRlbnRlIHByZXNlbnRlJyxcbiAqIH07XG4gKiBgYGBcbiAqXG4gKiAjIyMgVGFiZWxsYSBjb24gcGVybWVzc2kgZ3JhbnVsYXJpXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb25maWc6IFVpQ3J1ZFRhYmxlQ29uZmlnID0ge1xuICogICBmb3JtU2NoZW1hOiBteVNjaGVtYSxcbiAqICAgYWxsb3dFZGl0OiB0cnVlLFxuICogICBhbGxvd0RlbGV0ZTogdHJ1ZSxcbiAqICAgYWxsb3dEdXBsaWNhdGU6IHRydWUsXG4gKiAgIGNhbkVkaXQ6IChpdGVtKSA9PiBpdGVtLnN0YXR1cyAhPT0gJ2xvY2tlZCcsXG4gKiAgIGNhbkRlbGV0ZTogKGl0ZW0pID0+IGl0ZW0ucm9sZSAhPT0gJ2FkbWluJyxcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVaUNydWRUYWJsZUNvbmZpZyB7XG4gIC8qKiBTY2hlbWEgcGVyIGlsIGZvcm0gYnVpbGRlciAoaW5zZXJpbWVudG8vbW9kaWZpY2EpLiAqL1xuICBmb3JtU2NoZW1hOiBVaUZvcm1TY2hlbWE7XG5cbiAgLyoqIEV0aWNoZXR0YSBkZWxsYSB0YWJlbGxhIChwZXIgYWNjZXNzaWJpbGl0YSkuICovXG4gIHRhYmxlTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqIE1lc3NhZ2dpbyB2aXN1YWxpenphdG8gcXVhbmRvIG5vbiBjaSBzb25vIGRhdGkuIEBkZWZhdWx0ICdOZXNzdW4gZWxlbWVudG8gcHJlc2VudGUnICovXG4gIGVtcHR5TWVzc2FnZT86IHN0cmluZztcblxuICAvLyDilIDilIAgTGFiZWwgcHVsc2FudGkg4pSA4pSAXG5cbiAgLyoqIExhYmVsIGRlbCBwdWxzYW50ZSBcIkFnZ2l1bmdpXCIuIEBkZWZhdWx0ICdBZ2dpdW5naScgKi9cbiAgYWRkQnV0dG9uTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqIExhYmVsIGRlbCBwdWxzYW50ZSBcIlNhbHZhXCIgKGluc2VydCkuIEBkZWZhdWx0ICdTYWx2YScgKi9cbiAgc2F2ZUJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCBkZWwgcHVsc2FudGUgXCJBbm51bGxhXCIuIEBkZWZhdWx0ICdBbm51bGxhJyAqL1xuICBjYW5jZWxCdXR0b25MYWJlbD86IHN0cmluZztcblxuICAvKiogTGFiZWwgZGVsIHB1bHNhbnRlIFwiQWdnaW9ybmFcIiAoZWRpdCkuIEBkZWZhdWx0ICdBZ2dpb3JuYScgKi9cbiAgdXBkYXRlQnV0dG9uTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqIExhYmVsIGRlbCBwdWxzYW50ZSBcIkR1cGxpY2FcIiAoZHVwbGljYXRlKS4gQGRlZmF1bHQgJ0R1cGxpY2EnICovXG4gIGR1cGxpY2F0ZUJ1dHRvbkxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKiBNZXNzYWdnaW8gcGVyIGlsIGRpYWxvZ28gZGkgY29uZmVybWEgZWxpbWluYXppb25lLiAqL1xuICBkZWxldGVDb25maXJtTWVzc2FnZT86IHN0cmluZztcblxuICAvLyDilIDilIAgUGVybWVzc2kgZ2xvYmFsaSDilIDilIBcblxuICAvKipcbiAgICogQWJpbGl0YSBpbCBwdWxzYW50ZSBcIkFnZ2l1bmdpXCIgaW4gbW9kYWxpdGEgdmlldy5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYWxsb3dBZGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYmlsaXRhIGxhIG1vZGlmaWNhIGRlZ2xpIGVsZW1lbnRpLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBhbGxvd0VkaXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYmlsaXRhIGwnZWxpbWluYXppb25lIGRlZ2xpIGVsZW1lbnRpLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBhbGxvd0RlbGV0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFiaWxpdGEgbGEgZHVwbGljYXppb25lIGRlZ2xpIGVsZW1lbnRpLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYWxsb3dEdXBsaWNhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYmlsaXRhIGxhIHZpc3VhbGl6emF6aW9uZSBpbiBzb2xhIGxldHR1cmEuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBhbGxvd1ZpZXc/OiBib29sZWFuO1xuXG4gIC8vIOKUgOKUgCBQZXJtZXNzaSBwZXItcmlnYSAoY2FsbGJhY2spIOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmEgc2UgdW5hIHNwZWNpZmljYSByaWdhIHB1byBlc3NlcmUgbW9kaWZpY2F0YS5cbiAgICogU2Ugbm9uIHNwZWNpZmljYXRhLCB1c2EgYGFsbG93RWRpdGAgZ2xvYmFsZS5cbiAgICovXG4gIGNhbkVkaXQ/OiAoaXRlbTogYW55LCByZWFkb25seTogYm9vbGVhbikgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5hIHNlIHVuYSBzcGVjaWZpY2EgcmlnYSBwdW8gZXNzZXJlIGVsaW1pbmF0YS5cbiAgICogU2Ugbm9uIHNwZWNpZmljYXRhLCB1c2EgYGFsbG93RGVsZXRlYCBnbG9iYWxlLlxuICAgKi9cbiAgY2FuRGVsZXRlPzogKGl0ZW06IGFueSwgcmVhZG9ubHk6IGJvb2xlYW4pID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERldGVybWluYSBzZSB1bmEgc3BlY2lmaWNhIHJpZ2EgcHVvIGVzc2VyZSBkdXBsaWNhdGEuXG4gICAqIFNlIG5vbiBzcGVjaWZpY2F0YSwgdXNhIGBhbGxvd0R1cGxpY2F0ZWAgZ2xvYmFsZS5cbiAgICovXG4gIGNhbkR1cGxpY2F0ZT86IChpdGVtOiBhbnksIHJlYWRvbmx5OiBib29sZWFuKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmEgc2UgdW5hIHNwZWNpZmljYSByaWdhIHB1byBlc3NlcmUgdmlzdWFsaXp6YXRhIGluIHJlYWRvbmx5LlxuICAgKiBTZSBub24gc3BlY2lmaWNhdGEsIHVzYSBgYWxsb3dWaWV3YCBnbG9iYWxlLlxuICAgKi9cbiAgY2FuVmlldz86IChpdGVtOiBhbnkpID0+IGJvb2xlYW47XG5cbiAgLy8g4pSA4pSAIENsYXNzaSBDU1MgcGVyLXJpZ2Eg4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc3RpdHVpc2NlIGNsYXNzaSBDU1MgYWdnaXVudGl2ZSBwZXIgdW5hIHNwZWNpZmljYSByaWdhLlxuICAgKiBVdGlsZSBwZXIgZXZpZGVuemlhcmUgcmlnaGUgaW4gYmFzZSBhbGxvIHN0YXRvLlxuICAgKi9cbiAgZ2V0Um93Q2xhc3M/OiAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvLyDilIDilIAgVG9vbHRpcCBwZXJzb25hbGl6emF0aSDilIDilIBcblxuICAvKiogVG9vbHRpcCBwZXJzb25hbGl6emF0byBwZXIgbCdhemlvbmUgRWRpdC4gKi9cbiAgZ2V0RWRpdFRvb2x0aXA/OiAoaXRlbTogYW55KSA9PiBzdHJpbmc7XG5cbiAgLyoqIFRvb2x0aXAgcGVyc29uYWxpenphdG8gcGVyIGwnYXppb25lIERlbGV0ZS4gKi9cbiAgZ2V0RGVsZXRlVG9vbHRpcD86IChpdGVtOiBhbnkpID0+IHN0cmluZztcblxuICAvKiogVG9vbHRpcCBwZXJzb25hbGl6emF0byBwZXIgbCdhemlvbmUgRHVwbGljYXRlLiAqL1xuICBnZXREdXBsaWNhdGVUb29sdGlwPzogKGl0ZW06IGFueSkgPT4gc3RyaW5nO1xuXG4gIC8qKiBUb29sdGlwIHBlcnNvbmFsaXp6YXRvIHBlciBsJ2F6aW9uZSBWaWV3LiAqL1xuICBnZXRWaWV3VG9vbHRpcD86IChpdGVtOiBhbnkpID0+IHN0cmluZztcblxuICAvLyDilIDilIAgVHJhY2tpbmcg4pSA4pSAXG5cbiAgLyoqIFByb3ByaWV0YSB1c2F0YSBjb21lIGNoaWF2ZSBkaSB0cmFja2luZyBwZXIgbGUgcmlnaGUuIEBkZWZhdWx0ICdpZCcgKi9cbiAgdHJhY2tCeVByb3BlcnR5Pzogc3RyaW5nO1xuXG4gIC8vIOKUgOKUgCBDYWxsYmFjayBwcmUtYXBlcnR1cmEgZm9ybSDilIDilIBcblxuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2NhdG8gcHJpbWEgZGVsbCdhcGVydHVyYSBkZWwgZm9ybS5cbiAgICogUGVybWV0dGUgYWwgY29tcG9uZW50ZSBnZW5pdG9yZSBkaSBtb2RpZmljYXJlIGxvIHNjaGVtYVxuICAgKiAoZXMuIGRpc2FiaWxpdGFyZSBvcHppb25pIGdpYSB1dGlsaXp6YXRlKS5cbiAgICovXG4gIG9uQmVmb3JlRm9ybU9wZW4/OiAobW9kZTogVWlDcnVkTW9kZSwgZWRpdGluZ0l0ZW06IGFueSwgYWxsRGF0YTogYW55W10pID0+IHZvaWQ7XG59XG5cbi8vIOKUgOKUgOKUgCBFdmVudGkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRXZlbnRvIGVtZXNzbyBhbGxhIG1vZGlmaWNhIGRpIHVuIGVsZW1lbnRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVpQ3J1ZEVkaXRFdmVudDxUID0gYW55PiB7XG4gIC8qKiBFbGVtZW50byBtb2RpZmljYXRvLiAqL1xuICBpdGVtOiBUO1xuICAvKiogSW5kaWNlIGRlbGwnZWxlbWVudG8gbmVsbGEgbGlzdGEuICovXG4gIGluZGV4OiBudW1iZXI7XG4gIC8qKiBEYXRpIG9yaWdpbmFsaSBwcmltYSBkZWxsYSBtb2RpZmljYS4gKi9cbiAgb3JpZ2luYWxEYXRhOiBhbnk7XG59XG5cbi8qKlxuICogRXZlbnRvIGVtZXNzbyBhbGwnZWxpbWluYXppb25lIGRpIHVuIGVsZW1lbnRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVpQ3J1ZERlbGV0ZUV2ZW50PFQgPSBhbnk+IHtcbiAgLyoqIEVsZW1lbnRvIGVsaW1pbmF0by4gKi9cbiAgaXRlbTogVDtcbiAgLyoqIEluZGljZSBkZWxsJ2VsZW1lbnRvIG5lbGxhIGxpc3RhLiAqL1xuICBpbmRleDogbnVtYmVyO1xufVxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ng-ui-system — CRUD Table entry point.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```typescript
|
|
6
|
+
* import {
|
|
7
|
+
* UiCrudTableComponent,
|
|
8
|
+
* UiCrudTableColumn,
|
|
9
|
+
* UiCrudTableConfig,
|
|
10
|
+
* UiCrudMode,
|
|
11
|
+
* } from 'ng-ui-system';
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
// Componente
|
|
15
|
+
export { UiCrudTableComponent } from './crud-table.component';
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2NydWQtdGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsYUFBYTtBQUNiLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIG5nLXVpLXN5c3RlbSDigJQgQ1JVRCBUYWJsZSBlbnRyeSBwb2ludC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQge1xyXG4gKiAgIFVpQ3J1ZFRhYmxlQ29tcG9uZW50LFxyXG4gKiAgIFVpQ3J1ZFRhYmxlQ29sdW1uLFxyXG4gKiAgIFVpQ3J1ZFRhYmxlQ29uZmlnLFxyXG4gKiAgIFVpQ3J1ZE1vZGUsXHJcbiAqIH0gZnJvbSAnbmctdWktc3lzdGVtJztcclxuICogYGBgXHJcbiAqL1xyXG5cclxuLy8gQ29tcG9uZW50ZVxyXG5leHBvcnQgeyBVaUNydWRUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4vY3J1ZC10YWJsZS5jb21wb25lbnQnO1xyXG5cclxuLy8gVGlwaVxyXG5leHBvcnQge1xyXG4gIFVpQ3J1ZFRhYmxlQ29sdW1uLFxyXG4gIFVpQ3J1ZFRhYmxlQ29uZmlnLFxyXG4gIFVpQ3J1ZE1vZGUsXHJcbiAgVWlDcnVkRWRpdEV2ZW50LFxyXG4gIFVpQ3J1ZERlbGV0ZUV2ZW50LFxyXG59IGZyb20gJy4vY3J1ZC10YWJsZS50eXBlcyc7XHJcbiJdfQ==
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module ng-ui-system/form-builder
|
|
3
|
+
* Adapter e formati per il datepicker italiano (DD/MM/YYYY).
|
|
4
|
+
*/
|
|
5
|
+
import { Injectable } from '@angular/core';
|
|
6
|
+
import { NativeDateAdapter } from '@angular/material/core';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
/**
|
|
9
|
+
* Adapter personalizzato per il parsing delle date in formato italiano DD/MM/YYYY.
|
|
10
|
+
*
|
|
11
|
+
* Estende il NativeDateAdapter di Angular Material per gestire:
|
|
12
|
+
* - Parsing: converte stringhe DD/MM/YYYY in oggetti Date
|
|
13
|
+
* - Formattazione: visualizza le date nel formato italiano
|
|
14
|
+
* - Primo giorno della settimana: Lunedi (1)
|
|
15
|
+
*/
|
|
16
|
+
export class UiItalianDateAdapter extends NativeDateAdapter {
|
|
17
|
+
/**
|
|
18
|
+
* Il primo giorno della settimana e Lunedi (1).
|
|
19
|
+
*/
|
|
20
|
+
getFirstDayOfWeek() {
|
|
21
|
+
return 1;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parsing di una stringa di data in formato DD/MM/YYYY.
|
|
25
|
+
* Supporta sia il formato con separatore `/` che `-`.
|
|
26
|
+
*/
|
|
27
|
+
parse(value) {
|
|
28
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
29
|
+
// Gestisci formato DD/MM/YYYY o DD-MM-YYYY
|
|
30
|
+
const parts = value.split(/[\/\-]/);
|
|
31
|
+
if (parts.length === 3) {
|
|
32
|
+
const day = parseInt(parts[0], 10);
|
|
33
|
+
const month = parseInt(parts[1], 10) - 1; // Mesi 0-based
|
|
34
|
+
const year = parseInt(parts[2], 10);
|
|
35
|
+
if (!isNaN(day) && !isNaN(month) && !isNaN(year)) {
|
|
36
|
+
// Validazione base
|
|
37
|
+
if (day >= 1 && day <= 31 && month >= 0 && month <= 11 && year >= 1900 && year <= 2100) {
|
|
38
|
+
return new Date(year, month, day);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return super.parse(value);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Formatta una data in formato DD/MM/YYYY per la visualizzazione.
|
|
47
|
+
*/
|
|
48
|
+
format(date, displayFormat) {
|
|
49
|
+
if (displayFormat === 'input') {
|
|
50
|
+
const day = date.getDate().toString().padStart(2, '0');
|
|
51
|
+
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
|
52
|
+
const year = date.getFullYear();
|
|
53
|
+
return `${day}/${month}/${year}`;
|
|
54
|
+
}
|
|
55
|
+
return date.toLocaleDateString('it-IT', {
|
|
56
|
+
year: 'numeric',
|
|
57
|
+
month: 'long',
|
|
58
|
+
day: 'numeric',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiItalianDateAdapter, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
62
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiItalianDateAdapter }); }
|
|
63
|
+
}
|
|
64
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiItalianDateAdapter, decorators: [{
|
|
65
|
+
type: Injectable
|
|
66
|
+
}] });
|
|
67
|
+
/**
|
|
68
|
+
* Formati data italiani per Angular Material.
|
|
69
|
+
* Configura il datepicker per usare DD/MM/YYYY.
|
|
70
|
+
*/
|
|
71
|
+
export const UI_IT_DATE_FORMATS = {
|
|
72
|
+
parse: {
|
|
73
|
+
dateInput: 'input',
|
|
74
|
+
},
|
|
75
|
+
display: {
|
|
76
|
+
dateInput: 'input',
|
|
77
|
+
monthYearLabel: { year: 'numeric', month: 'short' },
|
|
78
|
+
dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },
|
|
79
|
+
monthYearA11yLabel: { year: 'numeric', month: 'long' },
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXQtZGF0ZS1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvYWRhcHRlcnMvaXQtZGF0ZS1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFrQixNQUFNLHdCQUF3QixDQUFDOztBQUUzRTs7Ozs7OztHQU9HO0FBRUgsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGlCQUFpQjtJQUN6RDs7T0FFRztJQUNNLGlCQUFpQjtRQUN4QixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRDs7O09BR0c7SUFDTSxLQUFLLENBQUMsS0FBVTtRQUN2QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xELDJDQUEyQztZQUMzQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlO2dCQUN6RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUVwQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2pELG1CQUFtQjtvQkFDbkIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUN2RixPQUFPLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3BDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNNLE1BQU0sQ0FBQyxJQUFVLEVBQUUsYUFBcUI7UUFDL0MsSUFBSyxhQUFxQixLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7WUFDdEMsSUFBSSxFQUFFLFNBQVM7WUFDZixLQUFLLEVBQUUsTUFBTTtZQUNiLEdBQUcsRUFBRSxTQUFTO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0EvQ1Usb0JBQW9CO21IQUFwQixvQkFBb0I7OzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7O0FBbURYOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFtQjtJQUNoRCxLQUFLLEVBQUU7UUFDTCxTQUFTLEVBQUUsT0FBTztLQUNuQjtJQUNELE9BQU8sRUFBRTtRQUNQLFNBQVMsRUFBRSxPQUFPO1FBQ2xCLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtRQUNuRCxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtRQUNqRSxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtLQUN2RDtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQG1vZHVsZSBuZy11aS1zeXN0ZW0vZm9ybS1idWlsZGVyXHJcbiAqIEFkYXB0ZXIgZSBmb3JtYXRpIHBlciBpbCBkYXRlcGlja2VyIGl0YWxpYW5vIChERC9NTS9ZWVlZKS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyLCBNYXREYXRlRm9ybWF0cyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5cclxuLyoqXHJcbiAqIEFkYXB0ZXIgcGVyc29uYWxpenphdG8gcGVyIGlsIHBhcnNpbmcgZGVsbGUgZGF0ZSBpbiBmb3JtYXRvIGl0YWxpYW5vIEREL01NL1lZWVkuXHJcbiAqXHJcbiAqIEVzdGVuZGUgaWwgTmF0aXZlRGF0ZUFkYXB0ZXIgZGkgQW5ndWxhciBNYXRlcmlhbCBwZXIgZ2VzdGlyZTpcclxuICogLSBQYXJzaW5nOiBjb252ZXJ0ZSBzdHJpbmdoZSBERC9NTS9ZWVlZIGluIG9nZ2V0dGkgRGF0ZVxyXG4gKiAtIEZvcm1hdHRhemlvbmU6IHZpc3VhbGl6emEgbGUgZGF0ZSBuZWwgZm9ybWF0byBpdGFsaWFub1xyXG4gKiAtIFByaW1vIGdpb3JubyBkZWxsYSBzZXR0aW1hbmE6IEx1bmVkaSAoMSlcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVpSXRhbGlhbkRhdGVBZGFwdGVyIGV4dGVuZHMgTmF0aXZlRGF0ZUFkYXB0ZXIge1xyXG4gIC8qKlxyXG4gICAqIElsIHByaW1vIGdpb3JubyBkZWxsYSBzZXR0aW1hbmEgZSBMdW5lZGkgKDEpLlxyXG4gICAqL1xyXG4gIG92ZXJyaWRlIGdldEZpcnN0RGF5T2ZXZWVrKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhcnNpbmcgZGkgdW5hIHN0cmluZ2EgZGkgZGF0YSBpbiBmb3JtYXRvIEREL01NL1lZWVkuXHJcbiAgICogU3VwcG9ydGEgc2lhIGlsIGZvcm1hdG8gY29uIHNlcGFyYXRvcmUgYC9gIGNoZSBgLWAuXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgcGFyc2UodmFsdWU6IGFueSk6IERhdGUgfCBudWxsIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gR2VzdGlzY2kgZm9ybWF0byBERC9NTS9ZWVlZIG8gREQtTU0tWVlZWVxyXG4gICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KC9bXFwvXFwtXS8pO1xyXG4gICAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XHJcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcclxuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KHBhcnRzWzFdLCAxMCkgLSAxOyAvLyBNZXNpIDAtYmFzZWRcclxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQocGFydHNbMl0sIDEwKTtcclxuXHJcbiAgICAgICAgaWYgKCFpc05hTihkYXkpICYmICFpc05hTihtb250aCkgJiYgIWlzTmFOKHllYXIpKSB7XHJcbiAgICAgICAgICAvLyBWYWxpZGF6aW9uZSBiYXNlXHJcbiAgICAgICAgICBpZiAoZGF5ID49IDEgJiYgZGF5IDw9IDMxICYmIG1vbnRoID49IDAgJiYgbW9udGggPD0gMTEgJiYgeWVhciA+PSAxOTAwICYmIHllYXIgPD0gMjEwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIucGFyc2UodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0dGEgdW5hIGRhdGEgaW4gZm9ybWF0byBERC9NTS9ZWVlZIHBlciBsYSB2aXN1YWxpenphemlvbmUuXHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgZm9ybWF0KGRhdGU6IERhdGUsIGRpc3BsYXlGb3JtYXQ6IG9iamVjdCk6IHN0cmluZyB7XHJcbiAgICBpZiAoKGRpc3BsYXlGb3JtYXQgYXMgYW55KSA9PT0gJ2lucHV0Jykge1xyXG4gICAgICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2l0LUlUJywge1xyXG4gICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgIG1vbnRoOiAnbG9uZycsXHJcbiAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRm9ybWF0aSBkYXRhIGl0YWxpYW5pIHBlciBBbmd1bGFyIE1hdGVyaWFsLlxyXG4gKiBDb25maWd1cmEgaWwgZGF0ZXBpY2tlciBwZXIgdXNhcmUgREQvTU0vWVlZWS5cclxuICovXHJcbmV4cG9ydCBjb25zdCBVSV9JVF9EQVRFX0ZPUk1BVFM6IE1hdERhdGVGb3JtYXRzID0ge1xyXG4gIHBhcnNlOiB7XHJcbiAgICBkYXRlSW5wdXQ6ICdpbnB1dCcsXHJcbiAgfSxcclxuICBkaXNwbGF5OiB7XHJcbiAgICBkYXRlSW5wdXQ6ICdpbnB1dCcsXHJcbiAgICBtb250aFllYXJMYWJlbDogeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnIH0sXHJcbiAgICBkYXRlQTExeUxhYmVsOiB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSxcclxuICAgIG1vbnRoWWVhckExMXlMYWJlbDogeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycgfSxcclxuICB9LFxyXG59O1xyXG4iXX0=
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { Directive, HostListener, Input, forwardRef } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Direttiva per formattazione input valuta.
|
|
6
|
+
*
|
|
7
|
+
* Formatta il valore numerico con separatori italiani (1.234,56)
|
|
8
|
+
* e simbolo valuta opzionale. In fase di focus l'utente modifica
|
|
9
|
+
* il valore raw, al blur viene riformattato.
|
|
10
|
+
*
|
|
11
|
+
* Implementa `ControlValueAccessor` per integrazione con Reactive Forms.
|
|
12
|
+
*
|
|
13
|
+
* @selector [uiCurrencyInput]
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```html
|
|
17
|
+
* <input uiCurrencyInput currencySymbol="EUR" [decimalPlaces]="2" />
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class UiCurrencyInputDirective {
|
|
21
|
+
constructor(el, renderer) {
|
|
22
|
+
this.el = el;
|
|
23
|
+
this.renderer = renderer;
|
|
24
|
+
/** Simbolo valuta visualizzato. @default 'EUR' */
|
|
25
|
+
this.currencySymbol = 'EUR';
|
|
26
|
+
/** Numero di decimali. @default 2 */
|
|
27
|
+
this.decimalPlaces = 2;
|
|
28
|
+
this.rawValue = null;
|
|
29
|
+
this.onChange = () => { };
|
|
30
|
+
this.onTouched = () => { };
|
|
31
|
+
this.isFocused = false;
|
|
32
|
+
}
|
|
33
|
+
ngOnInit() {
|
|
34
|
+
this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');
|
|
35
|
+
}
|
|
36
|
+
// ── ControlValueAccessor ──
|
|
37
|
+
writeValue(value) {
|
|
38
|
+
this.rawValue = value != null ? Number(value) : null;
|
|
39
|
+
if (!this.isFocused) {
|
|
40
|
+
this.displayFormatted();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
registerOnChange(fn) {
|
|
44
|
+
this.onChange = fn;
|
|
45
|
+
}
|
|
46
|
+
registerOnTouched(fn) {
|
|
47
|
+
this.onTouched = fn;
|
|
48
|
+
}
|
|
49
|
+
setDisabledState(isDisabled) {
|
|
50
|
+
this.renderer.setProperty(this.el.nativeElement, 'disabled', isDisabled);
|
|
51
|
+
}
|
|
52
|
+
// ── Gestione eventi ──
|
|
53
|
+
onFocus() {
|
|
54
|
+
this.isFocused = true;
|
|
55
|
+
this.renderer.setStyle(this.el.nativeElement, 'text-align', 'left');
|
|
56
|
+
// Mostra valore raw per editing
|
|
57
|
+
if (this.rawValue != null) {
|
|
58
|
+
this.el.nativeElement.value = this.rawValue.toString().replace('.', ',');
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.el.nativeElement.value = '';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
onBlur() {
|
|
65
|
+
this.isFocused = false;
|
|
66
|
+
this.onTouched();
|
|
67
|
+
this.parseInput();
|
|
68
|
+
this.displayFormatted();
|
|
69
|
+
this.renderer.setStyle(this.el.nativeElement, 'text-align', 'right');
|
|
70
|
+
}
|
|
71
|
+
onInput(value) {
|
|
72
|
+
// Permetti solo cifre, virgola e punto (come separatore decimale)
|
|
73
|
+
const sanitized = value.replace(/[^0-9,.\-]/g, '');
|
|
74
|
+
if (sanitized !== value) {
|
|
75
|
+
this.el.nativeElement.value = sanitized;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
onKeyDown(event) {
|
|
79
|
+
const allowed = [
|
|
80
|
+
'Backspace',
|
|
81
|
+
'Delete',
|
|
82
|
+
'Tab',
|
|
83
|
+
'Escape',
|
|
84
|
+
'Enter',
|
|
85
|
+
'ArrowLeft',
|
|
86
|
+
'ArrowRight',
|
|
87
|
+
'ArrowUp',
|
|
88
|
+
'ArrowDown',
|
|
89
|
+
'Home',
|
|
90
|
+
'End',
|
|
91
|
+
];
|
|
92
|
+
if (allowed.includes(event.key))
|
|
93
|
+
return;
|
|
94
|
+
// Permetti Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X
|
|
95
|
+
if (event.ctrlKey || event.metaKey)
|
|
96
|
+
return;
|
|
97
|
+
// Permetti cifre
|
|
98
|
+
if (/^\d$/.test(event.key))
|
|
99
|
+
return;
|
|
100
|
+
// Permetti virgola e punto (un solo separatore decimale)
|
|
101
|
+
if ((event.key === ',' || event.key === '.') && !this.el.nativeElement.value.includes(',')) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
// Permetti segno meno solo all'inizio
|
|
105
|
+
if (event.key === '-' && this.el.nativeElement.selectionStart === 0) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
}
|
|
110
|
+
// ── Utilita interne ──
|
|
111
|
+
parseInput() {
|
|
112
|
+
const input = this.el.nativeElement.value.trim();
|
|
113
|
+
if (!input) {
|
|
114
|
+
this.rawValue = null;
|
|
115
|
+
this.onChange(null);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Normalizza: rimuovi punti migliaia, sostituisci virgola con punto
|
|
119
|
+
const normalized = input.replace(/\./g, '').replace(',', '.');
|
|
120
|
+
const num = parseFloat(normalized);
|
|
121
|
+
if (isNaN(num)) {
|
|
122
|
+
this.rawValue = null;
|
|
123
|
+
this.onChange(null);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.rawValue = num;
|
|
127
|
+
this.onChange(num);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Mostra il valore formattato con separatori italiani e simbolo. */
|
|
131
|
+
displayFormatted() {
|
|
132
|
+
if (this.rawValue == null) {
|
|
133
|
+
this.el.nativeElement.value = '';
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const formatted = this.formatItalian(this.rawValue, this.decimalPlaces);
|
|
137
|
+
this.el.nativeElement.value = this.currencySymbol ? `${formatted} ${this.currencySymbol}` : formatted;
|
|
138
|
+
}
|
|
139
|
+
/** Formattazione italiana: 1.234,56 */
|
|
140
|
+
formatItalian(value, decimals) {
|
|
141
|
+
const parts = value.toFixed(decimals).split('.');
|
|
142
|
+
const intPart = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, '.'); // NOSONAR - Used on controlled number strings from toFixed(), low ReDoS risk
|
|
143
|
+
return decimals > 0 ? `${intPart},${parts[1]}` : intPart;
|
|
144
|
+
}
|
|
145
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiCurrencyInputDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
146
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: UiCurrencyInputDirective, isStandalone: true, selector: "[uiCurrencyInput]", inputs: { currencySymbol: "currencySymbol", decimalPlaces: "decimalPlaces" }, host: { listeners: { "focus": "onFocus()", "blur": "onBlur()", "input": "onInput($event.target.value)", "keydown": "onKeyDown($event)" } }, providers: [
|
|
147
|
+
{
|
|
148
|
+
provide: NG_VALUE_ACCESSOR,
|
|
149
|
+
useExisting: forwardRef(() => UiCurrencyInputDirective),
|
|
150
|
+
multi: true,
|
|
151
|
+
},
|
|
152
|
+
], ngImport: i0 }); }
|
|
153
|
+
}
|
|
154
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiCurrencyInputDirective, decorators: [{
|
|
155
|
+
type: Directive,
|
|
156
|
+
args: [{
|
|
157
|
+
selector: '[uiCurrencyInput]',
|
|
158
|
+
standalone: true,
|
|
159
|
+
providers: [
|
|
160
|
+
{
|
|
161
|
+
provide: NG_VALUE_ACCESSOR,
|
|
162
|
+
useExisting: forwardRef(() => UiCurrencyInputDirective),
|
|
163
|
+
multi: true,
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
}]
|
|
167
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { currencySymbol: [{
|
|
168
|
+
type: Input
|
|
169
|
+
}], decimalPlaces: [{
|
|
170
|
+
type: Input
|
|
171
|
+
}], onFocus: [{
|
|
172
|
+
type: HostListener,
|
|
173
|
+
args: ['focus']
|
|
174
|
+
}], onBlur: [{
|
|
175
|
+
type: HostListener,
|
|
176
|
+
args: ['blur']
|
|
177
|
+
}], onInput: [{
|
|
178
|
+
type: HostListener,
|
|
179
|
+
args: ['input', ['$event.target.value']]
|
|
180
|
+
}], onKeyDown: [{
|
|
181
|
+
type: HostListener,
|
|
182
|
+
args: ['keydown', ['$event']]
|
|
183
|
+
}] } });
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZGlyZWN0aXZlcy9jdXJyZW5jeS1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUV6RTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFZSCxNQUFNLE9BQU8sd0JBQXdCO0lBWW5DLFlBQ1UsRUFBZ0MsRUFDaEMsUUFBbUI7UUFEbkIsT0FBRSxHQUFGLEVBQUUsQ0FBOEI7UUFDaEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWI3QixrREFBa0Q7UUFDekMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFaEMscUNBQXFDO1FBQzVCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQy9CLGFBQVEsR0FBbUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQ3BELGNBQVMsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDakMsY0FBUyxHQUFHLEtBQUssQ0FBQztJQUt2QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsNkJBQTZCO0lBRTdCLFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFD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QWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx5QkFBeUIsQ0FBQzs0QkFDdkQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7dUdBR1UsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQXVDTixPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTztnQkFhckIsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU07Z0JBVXBCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFVOUMsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBSZW5kZXJlcjIsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLyoqXHJcbiAqIERpcmV0dGl2YSBwZXIgZm9ybWF0dGF6aW9uZSBpbnB1dCB2YWx1dGEuXHJcbiAqXHJcbiAqIEZvcm1hdHRhIGlsIHZhbG9yZSBudW1lcmljbyBjb24gc2VwYXJhdG9yaSBpdGFsaWFuaSAoMS4yMzQsNTYpXHJcbiAqIGUgc2ltYm9sbyB2YWx1dGEgb3B6aW9uYWxlLiBJbiBmYXNlIGRpIGZvY3VzIGwndXRlbnRlIG1vZGlmaWNhXHJcbiAqIGlsIHZhbG9yZSByYXcsIGFsIGJsdXIgdmllbmUgcmlmb3JtYXR0YXRvLlxyXG4gKlxyXG4gKiBJbXBsZW1lbnRhIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgcGVyIGludGVncmF6aW9uZSBjb24gUmVhY3RpdmUgRm9ybXMuXHJcbiAqXHJcbiAqIEBzZWxlY3RvciBbdWlDdXJyZW5jeUlucHV0XVxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxpbnB1dCB1aUN1cnJlbmN5SW5wdXQgY3VycmVuY3lTeW1ib2w9XCJFVVJcIiBbZGVjaW1hbFBsYWNlc109XCIyXCIgLz5cclxuICogYGBgXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1t1aUN1cnJlbmN5SW5wdXRdJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVWlDdXJyZW5jeUlucHV0RGlyZWN0aXZlKSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaUN1cnJlbmN5SW5wdXREaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcclxuICAvKiogU2ltYm9sbyB2YWx1dGEgdmlzdWFsaXp6YXRvLiBAZGVmYXVsdCAnRVVSJyAqL1xyXG4gIEBJbnB1dCgpIGN1cnJlbmN5U3ltYm9sID0gJ0VVUic7XHJcblxyXG4gIC8qKiBOdW1lcm8gZGkgZGVjaW1hbGkuIEBkZWZhdWx0IDIgKi9cclxuICBASW5wdXQoKSBkZWNpbWFsUGxhY2VzID0gMjtcclxuXHJcbiAgcHJpdmF0ZSByYXdWYWx1ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBudW1iZXIgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBwcml2YXRlIGlzRm9jdXNlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndGV4dC1hbGlnbicsICdyaWdodCcpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSAIENvbnRyb2xWYWx1ZUFjY2Vzc29yIOKUgOKUgFxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucmF3VmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gTnVtYmVyKHZhbHVlKSA6IG51bGw7XHJcbiAgICBpZiAoIXRoaXMuaXNGb2N1c2VkKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheUZvcm1hdHRlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgCBHZXN0aW9uZSBldmVudGkg4pSA4pSAXHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcclxuICBvbkZvY3VzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0ZXh0LWFsaWduJywgJ2xlZnQnKTtcclxuICAgIC8vIE1vc3RyYSB2YWxvcmUgcmF3IHBlciBlZGl0aW5nXHJcbiAgICBpZiAodGhpcy5yYXdWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMucmF3VmFsdWUudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJywnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLnBhcnNlSW5wdXQoKTtcclxuICAgIHRoaXMuZGlzcGxheUZvcm1hdHRlZCgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0ZXh0LWFsaWduJywgJ3JpZ2h0Jyk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50LnRhcmdldC52YWx1ZSddKVxyXG4gIG9uSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gUGVybWV0dGkgc29sbyBjaWZyZSwgdmlyZ29sYSBlIHB1bnRvIChjb21lIHNlcGFyYXRvcmUgZGVjaW1hbGUpXHJcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9bXjAtOSwuXFwtXS9nLCAnJyk7XHJcbiAgICBpZiAoc2FuaXRpemVkICE9PSB2YWx1ZSkge1xyXG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBzYW5pdGl6ZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFsbG93ZWQgPSBbXHJcbiAgICAgICdCYWNrc3BhY2UnLFxyXG4gICAgICAnRGVsZXRlJyxcclxuICAgICAgJ1RhYicsXHJcbiAgICAgICdFc2NhcGUnLFxyXG4gICAgICAnRW50ZXInLFxyXG4gICAgICAnQXJyb3dMZWZ0JyxcclxuICAgICAgJ0Fycm93UmlnaHQnLFxyXG4gICAgICAnQXJyb3dVcCcsXHJcbiAgICAgICdBcnJvd0Rvd24nLFxyXG4gICAgICAnSG9tZScsXHJcbiAgICAgICdFbmQnLFxyXG4gICAgXTtcclxuICAgIGlmIChhbGxvd2VkLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcclxuXHJcbiAgICAvLyBQZXJtZXR0aSBDdHJsK0EsIEN0cmwrQywgQ3RybCtWLCBDdHJsK1hcclxuICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHJldHVybjtcclxuXHJcbiAgICAvLyBQZXJtZXR0aSBjaWZyZVxyXG4gICAgaWYgKC9eXFxkJC8udGVzdChldmVudC5rZXkpKSByZXR1cm47XHJcblxyXG4gICAgLy8gUGVybWV0dGkgdmlyZ29sYSBlIHB1bnRvICh1biBzb2xvIHNlcGFyYXRvcmUgZGVjaW1hbGUpXHJcbiAgICBpZiAoKGV2ZW50LmtleSA9PT0gJywnIHx8IGV2ZW50LmtleSA9PT0gJy4nKSAmJiAhdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlLmluY2x1ZGVzKCcsJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlcm1ldHRpIHNlZ25vIG1lbm8gc29sbyBhbGwnaW5pemlvXHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnLScgJiYgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSAIFV0aWxpdGEgaW50ZXJuZSDilIDilIBcclxuXHJcbiAgcHJpdmF0ZSBwYXJzZUlucHV0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUudHJpbSgpO1xyXG4gICAgaWYgKCFpbnB1dCkge1xyXG4gICAgICB0aGlzLnJhd1ZhbHVlID0gbnVsbDtcclxuICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vcm1hbGl6emE6IHJpbXVvdmkgcHVudGkgbWlnbGlhaWEsIHNvc3RpdHVpc2NpIHZpcmdvbGEgY29uIHB1bnRvXHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gaW5wdXQucmVwbGFjZSgvXFwuL2csICcnKS5yZXBsYWNlKCcsJywgJy4nKTtcclxuICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQobm9ybWFsaXplZCk7XHJcblxyXG4gICAgaWYgKGlzTmFOKG51bSkpIHtcclxuICAgICAgdGhpcy5yYXdWYWx1ZSA9IG51bGw7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJhd1ZhbHVlID0gbnVtO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKG51bSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTW9zdHJhIGlsIHZhbG9yZSBmb3JtYXR0YXRvIGNvbiBzZXBhcmF0b3JpIGl0YWxpYW5pIGUgc2ltYm9sby4gKi9cclxuICBwcml2YXRlIGRpc3BsYXlGb3JtYXR0ZWQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yYXdWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5mb3JtYXRJdGFsaWFuKHRoaXMucmF3VmFsdWUsIHRoaXMuZGVjaW1hbFBsYWNlcyk7XHJcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmN1cnJlbmN5U3ltYm9sID8gYCR7Zm9ybWF0dGVkfSAke3RoaXMuY3VycmVuY3lTeW1ib2x9YCA6IGZvcm1hdHRlZDtcclxuICB9XHJcblxyXG4gIC8qKiBGb3JtYXR0YXppb25lIGl0YWxpYW5hOiAxLjIzNCw1NiAqL1xyXG4gIHByaXZhdGUgZm9ybWF0SXRhbGlhbih2YWx1ZTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhcnRzID0gdmFsdWUudG9GaXhlZChkZWNpbWFscykuc3BsaXQoJy4nKTtcclxuICAgIGNvbnN0IGludFBhcnQgPSBwYXJ0c1swXS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLicpOyAvLyBOT1NPTkFSIC0gVXNlZCBvbiBjb250cm9sbGVkIG51bWJlciBzdHJpbmdzIGZyb20gdG9GaXhlZCgpLCBsb3cgUmVEb1Mgcmlza1xyXG4gICAgcmV0dXJuIGRlY2ltYWxzID4gMCA/IGAke2ludFBhcnR9LCR7cGFydHNbMV19YCA6IGludFBhcnQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|