@unifylib/ui-lib 1.1.3 → 1.1.5
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/iq-ui-lib.mjs +5 -0
- package/esm2022/lib/base-model/SearchStrConfig.mjs +11 -0
- package/esm2022/lib/base-model/api-response.mjs +2 -0
- package/esm2022/lib/base-model/audit-log-entry.mjs +3 -0
- package/esm2022/lib/base-model/button-action-settings.mjs +16 -0
- package/esm2022/lib/base-model/column-def.model.mjs +28 -0
- package/esm2022/lib/base-model/do-action-request.mjs +8 -0
- package/esm2022/lib/base-model/field-action.mjs +6 -0
- package/esm2022/lib/base-model/field-filter.model.mjs +3 -0
- package/esm2022/lib/base-model/field-info.mjs +57 -0
- package/esm2022/lib/base-model/field-predicate.model.mjs +10 -0
- package/esm2022/lib/base-model/filter-request.mjs +13 -0
- package/esm2022/lib/base-model/filter.model.mjs +25 -0
- package/esm2022/lib/base-model/get-items-list.mjs +10 -0
- package/esm2022/lib/base-model/index.mjs +12 -0
- package/esm2022/lib/base-model/items-total.model.mjs +8 -0
- package/esm2022/lib/base-model/line-item.model.mjs +11 -0
- package/esm2022/lib/base-model/lookupItem.mjs +16 -0
- package/esm2022/lib/base-model/page-info.mjs +17 -0
- package/esm2022/lib/base-model/report-request.model.mjs +17 -0
- package/esm2022/lib/base-model/response-envelop.model.mjs +10 -0
- package/esm2022/lib/base-model/snack-message.model.mjs +11 -0
- package/esm2022/lib/base-model/table-column.interface.mjs +2 -0
- package/esm2022/lib/base-model/table-page-user-action.interface.mjs +21 -0
- package/esm2022/lib/base-model/workflow/workflow-steps.model.mjs +9 -0
- package/esm2022/lib/base-model/workflow/workflow.model.mjs +42 -0
- package/esm2022/lib/components/action-comment/action-comment.component.mjs +101 -0
- package/esm2022/lib/components/action-confirmation/action-confirmation.component.mjs +55 -0
- package/esm2022/lib/components/activity-report-form/activity-report-form.component.mjs +499 -0
- package/esm2022/lib/components/advanced-filter/field-filter/field-filter.component.mjs +41 -0
- package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +162 -0
- package/esm2022/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.mjs +70 -0
- package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +99 -0
- package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +292 -0
- package/esm2022/lib/components/base-form/base-form.component.mjs +297 -0
- package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +591 -0
- package/esm2022/lib/components/base-input-dialog/base-input-dialog.component.mjs +72 -0
- package/esm2022/lib/components/base-table/base-table.component.mjs +514 -0
- package/esm2022/lib/components/button-actions/button-actions.component.mjs +70 -0
- package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +496 -0
- package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +112 -0
- package/esm2022/lib/components/item-line-editor/item-line-editor.component.mjs +299 -0
- package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +278 -0
- package/esm2022/lib/components/paginator/paginator.component.mjs +91 -0
- package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +102 -0
- package/esm2022/lib/components/report-form/report-form.component.mjs +498 -0
- package/esm2022/lib/components/search-bar/search-bar.component.mjs +62 -0
- package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +81 -0
- package/esm2022/lib/components/shared/action-button/action-button.component.mjs +59 -0
- package/esm2022/lib/components/shared/action-card/action-card.component.mjs +93 -0
- package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +70 -0
- package/esm2022/lib/components/shared-list/shared-list.component.mjs +47 -0
- package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +43 -0
- package/esm2022/lib/components/title-bar/title-bar.component.mjs +119 -0
- package/esm2022/lib/services/backend-service.mjs +240 -0
- package/esm2022/lib/services/index.mjs +4 -0
- package/esm2022/lib/services/top-panel.mjs +22 -0
- package/esm2022/lib/services/trigger-form.service.mjs +17 -0
- package/esm2022/lib/utils/base-utils.mjs +97 -0
- package/esm2022/lib/validators/date-range-validator.mjs +27 -0
- package/esm2022/lib/validators/index.mjs +4 -0
- package/esm2022/lib/validators/match-list.validator.mjs +9 -0
- package/esm2022/lib/validators/multi-email-validator.mjs +13 -0
- package/esm2022/public-api.mjs +29 -0
- package/esm2022/q-btech-ui-lib.mjs +5 -0
- package/esm2022/unifylib-ui-lib.mjs +5 -0
- package/fesm2022/iq-ui-lib.mjs +5625 -0
- package/fesm2022/iq-ui-lib.mjs.map +1 -0
- package/fesm2022/q-btech-ui-lib.mjs +5619 -0
- package/fesm2022/q-btech-ui-lib.mjs.map +1 -0
- package/fesm2022/unifylib-ui-lib.mjs +5625 -0
- package/fesm2022/unifylib-ui-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/base-model/SearchStrConfig.d.ts +8 -0
- package/{src/lib/base-model/api-response.ts → lib/base-model/api-response.d.ts} +21 -23
- package/lib/base-model/audit-log-entry.d.ts +7 -0
- package/lib/base-model/button-action-settings.d.ts +15 -0
- package/lib/base-model/column-def.model.d.ts +11 -0
- package/lib/base-model/do-action-request.d.ts +10 -0
- package/lib/base-model/field-action.d.ts +6 -0
- package/lib/base-model/field-filter.model.d.ts +7 -0
- package/lib/base-model/field-info.d.ts +53 -0
- package/lib/base-model/field-predicate.model.d.ts +7 -0
- package/lib/base-model/filter-request.d.ts +15 -0
- package/lib/base-model/filter.model.d.ts +22 -0
- package/lib/base-model/get-items-list.d.ts +21 -0
- package/lib/base-model/index.d.ts +11 -0
- package/lib/base-model/items-total.model.d.ts +6 -0
- package/lib/base-model/line-item.model.d.ts +9 -0
- package/lib/base-model/lookupItem.d.ts +13 -0
- package/lib/base-model/page-info.d.ts +52 -0
- package/lib/base-model/report-request.model.d.ts +18 -0
- package/lib/base-model/response-envelop.model.d.ts +8 -0
- package/lib/base-model/snack-message.model.d.ts +7 -0
- package/lib/base-model/table-column.interface.d.ts +28 -0
- package/lib/base-model/table-page-user-action.interface.d.ts +14 -0
- package/lib/base-model/workflow/workflow-steps.model.d.ts +7 -0
- package/lib/base-model/workflow/workflow.model.d.ts +13 -0
- package/lib/components/action-comment/action-comment.component.d.ts +32 -0
- package/lib/components/action-confirmation/action-confirmation.component.d.ts +19 -0
- package/lib/components/activity-report-form/activity-report-form.component.d.ts +93 -0
- package/lib/components/advanced-filter/field-filter/field-filter.component.d.ts +20 -0
- package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +28 -0
- package/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.d.ts +25 -0
- package/lib/components/audit-log-list/audit-log.component.d.ts +36 -0
- package/lib/components/auto-complete/auto-complete.component.d.ts +51 -0
- package/lib/components/base-form/base-form.component.d.ts +59 -0
- package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +124 -0
- package/lib/components/base-input-dialog/base-input-dialog.component.d.ts +23 -0
- package/lib/components/base-table/base-table.component.d.ts +128 -0
- package/lib/components/button-actions/button-actions.component.d.ts +17 -0
- package/lib/components/editable-base-table/editable-base-table.component.d.ts +106 -0
- package/lib/components/equation-builder/equation-builder.component.d.ts +23 -0
- package/lib/components/item-line-editor/item-line-editor.component.d.ts +64 -0
- package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +51 -0
- package/lib/components/paginator/paginator.component.d.ts +26 -0
- package/lib/components/report-details-dialog/report-details-dialog.component.d.ts +34 -0
- package/lib/components/report-form/report-form.component.d.ts +92 -0
- package/lib/components/search-bar/search-bar.component.d.ts +29 -0
- package/lib/components/section-form-canvas/section-form-canvas.component.d.ts +27 -0
- package/lib/components/shared/action-button/action-button.component.d.ts +17 -0
- package/lib/components/shared/action-card/action-card.component.d.ts +37 -0
- package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +16 -0
- package/lib/components/shared-list/shared-list.component.d.ts +21 -0
- package/lib/components/snackbar-static/snackbar-static.component.d.ts +15 -0
- package/lib/components/title-bar/title-bar.component.d.ts +42 -0
- package/lib/services/backend-service.d.ts +59 -0
- package/{src/lib/services/index.ts → lib/services/index.d.ts} +3 -3
- package/lib/services/top-panel.d.ts +8 -0
- package/lib/services/trigger-form.service.d.ts +7 -0
- package/lib/utils/base-utils.d.ts +13 -0
- package/lib/validators/date-range-validator.d.ts +2 -0
- package/{src/lib/validators/index.ts → lib/validators/index.d.ts} +3 -3
- package/lib/validators/match-list.validator.d.ts +4 -0
- package/lib/validators/multi-email-validator.d.ts +6 -0
- package/package.json +27 -14
- package/{src/public-api.ts → public-api.d.ts} +25 -29
- package/ng-package.json +0 -7
- package/src/lib/base-model/SearchStrConfig.ts +0 -12
- package/src/lib/base-model/audit-log-entry.ts +0 -7
- package/src/lib/base-model/button-action-settings.ts +0 -29
- package/src/lib/base-model/column-def.model.ts +0 -34
- package/src/lib/base-model/do-action-request.ts +0 -11
- package/src/lib/base-model/feature-item.ts +0 -9
- package/src/lib/base-model/field-action.ts +0 -7
- package/src/lib/base-model/field-filter.model.ts +0 -7
- package/src/lib/base-model/field-info.ts +0 -102
- package/src/lib/base-model/field-predicate.model.ts +0 -7
- package/src/lib/base-model/filter-request.ts +0 -27
- package/src/lib/base-model/filter.model.ts +0 -49
- package/src/lib/base-model/get-items-list.ts +0 -24
- package/src/lib/base-model/index.ts +0 -11
- package/src/lib/base-model/items-total.model.ts +0 -12
- package/src/lib/base-model/line-item.model.ts +0 -18
- package/src/lib/base-model/lookupItem.ts +0 -21
- package/src/lib/base-model/null-snackmessage.ts +0 -9
- package/src/lib/base-model/page-info.ts +0 -54
- package/src/lib/base-model/report-request.model.ts +0 -33
- package/src/lib/base-model/response-envelop.model.ts +0 -15
- package/src/lib/base-model/snack-message.model.ts +0 -14
- package/src/lib/base-model/snackmessage-interface.ts +0 -7
- package/src/lib/base-model/table-column.interface.ts +0 -29
- package/src/lib/base-model/table-page-user-action.interface.ts +0 -33
- package/src/lib/base-model/workflow/workflow-steps.model.ts +0 -9
- package/src/lib/base-model/workflow/workflow.model.ts +0 -52
- package/src/lib/components/action-comment/action-comment.component.css +0 -52
- package/src/lib/components/action-comment/action-comment.component.html +0 -47
- package/src/lib/components/action-comment/action-comment.component.spec.ts +0 -23
- package/src/lib/components/action-comment/action-comment.component.ts +0 -102
- package/src/lib/components/action-confirmation/action-confirmation.component.css +0 -46
- package/src/lib/components/action-confirmation/action-confirmation.component.html +0 -32
- package/src/lib/components/action-confirmation/action-confirmation.component.spec.ts +0 -23
- package/src/lib/components/action-confirmation/action-confirmation.component.ts +0 -58
- package/src/lib/components/activity-report-form/activity-report-form.component.html +0 -110
- package/src/lib/components/activity-report-form/activity-report-form.component.scss +0 -69
- package/src/lib/components/activity-report-form/activity-report-form.component.spec.ts +0 -25
- package/src/lib/components/activity-report-form/activity-report-form.component.ts +0 -616
- package/src/lib/components/advanced-filter/field-filter/field-filter.component.html +0 -8
- package/src/lib/components/advanced-filter/field-filter/field-filter.component.scss +0 -0
- package/src/lib/components/advanced-filter/field-filter/field-filter.component.spec.ts +0 -25
- package/src/lib/components/advanced-filter/field-filter/field-filter.component.ts +0 -55
- package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.html +0 -36
- package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.scss +0 -130
- package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.spec.ts +0 -25
- package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.ts +0 -186
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.css +0 -51
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.html +0 -23
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.spec.ts +0 -23
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.ts +0 -69
- package/src/lib/components/audit-log-list/audit-log.component.html +0 -26
- package/src/lib/components/audit-log-list/audit-log.component.scss +0 -50
- package/src/lib/components/audit-log-list/audit-log.component.spec.ts +0 -25
- package/src/lib/components/audit-log-list/audit-log.component.ts +0 -114
- package/src/lib/components/auto-complete/auto-complete.component.css +0 -55
- package/src/lib/components/auto-complete/auto-complete.component.html +0 -45
- package/src/lib/components/auto-complete/auto-complete.component.spec.ts +0 -23
- package/src/lib/components/auto-complete/auto-complete.component.ts +0 -331
- package/src/lib/components/base-form/base-form.component.html +0 -59
- package/src/lib/components/base-form/base-form.component.scss +0 -68
- package/src/lib/components/base-form/base-form.component.spec.ts +0 -25
- package/src/lib/components/base-form/base-form.component.ts +0 -323
- package/src/lib/components/base-form-canvas/base-form-canvas.component.css +0 -196
- package/src/lib/components/base-form-canvas/base-form-canvas.component.html +0 -1095
- package/src/lib/components/base-form-canvas/base-form-canvas.component.spec.ts +0 -23
- package/src/lib/components/base-form-canvas/base-form-canvas.component.ts +0 -680
- package/src/lib/components/base-input-dialog/base-input-dialog.component.css +0 -67
- package/src/lib/components/base-input-dialog/base-input-dialog.component.html +0 -47
- package/src/lib/components/base-input-dialog/base-input-dialog.component.spec.ts +0 -23
- package/src/lib/components/base-input-dialog/base-input-dialog.component.ts +0 -77
- package/src/lib/components/base-table/base-table.component.html +0 -268
- package/src/lib/components/base-table/base-table.component.scss +0 -140
- package/src/lib/components/base-table/base-table.component.spec.ts +0 -25
- package/src/lib/components/base-table/base-table.component.ts +0 -621
- package/src/lib/components/button-actions/button-actions.component.html +0 -27
- package/src/lib/components/button-actions/button-actions.component.scss +0 -101
- package/src/lib/components/button-actions/button-actions.component.spec.ts +0 -23
- package/src/lib/components/button-actions/button-actions.component.ts +0 -70
- package/src/lib/components/editable-base-table/editable-base-table.component.html +0 -337
- package/src/lib/components/editable-base-table/editable-base-table.component.scss +0 -126
- package/src/lib/components/editable-base-table/editable-base-table.component.spec.ts +0 -25
- package/src/lib/components/editable-base-table/editable-base-table.component.ts +0 -579
- package/src/lib/components/equation-builder/equation-builder.component.css +0 -39
- package/src/lib/components/equation-builder/equation-builder.component.html +0 -31
- package/src/lib/components/equation-builder/equation-builder.component.spec.ts +0 -23
- package/src/lib/components/equation-builder/equation-builder.component.ts +0 -119
- package/src/lib/components/item-line-editor/item-line-editor.component.html +0 -102
- package/src/lib/components/item-line-editor/item-line-editor.component.scss +0 -152
- package/src/lib/components/item-line-editor/item-line-editor.component.spec.ts +0 -23
- package/src/lib/components/item-line-editor/item-line-editor.component.ts +0 -306
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.css +0 -19
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.html +0 -38
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.spec.ts +0 -23
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.ts +0 -315
- package/src/lib/components/paginator/paginator.component.css +0 -65
- package/src/lib/components/paginator/paginator.component.html +0 -30
- package/src/lib/components/paginator/paginator.component.ts +0 -87
- package/src/lib/components/report-details-dialog/report-details-dialog.component.css +0 -17
- package/src/lib/components/report-details-dialog/report-details-dialog.component.html +0 -16
- package/src/lib/components/report-details-dialog/report-details-dialog.component.spec.ts +0 -23
- package/src/lib/components/report-details-dialog/report-details-dialog.component.ts +0 -111
- package/src/lib/components/report-form/report-form.component.html +0 -92
- package/src/lib/components/report-form/report-form.component.scss +0 -51
- package/src/lib/components/report-form/report-form.component.spec.ts +0 -25
- package/src/lib/components/report-form/report-form.component.ts +0 -599
- package/src/lib/components/search-bar/search-bar.component.html +0 -51
- package/src/lib/components/search-bar/search-bar.component.scss +0 -63
- package/src/lib/components/search-bar/search-bar.component.spec.ts +0 -25
- package/src/lib/components/search-bar/search-bar.component.ts +0 -68
- package/src/lib/components/section-form-canvas/section-form-canvas.component.html +0 -43
- package/src/lib/components/section-form-canvas/section-form-canvas.component.scss +0 -81
- package/src/lib/components/section-form-canvas/section-form-canvas.component.spec.ts +0 -23
- package/src/lib/components/section-form-canvas/section-form-canvas.component.ts +0 -67
- package/src/lib/components/shared/action-button/action-button.component.html +0 -12
- package/src/lib/components/shared/action-button/action-button.component.scss +0 -45
- package/src/lib/components/shared/action-button/action-button.component.ts +0 -51
- package/src/lib/components/shared/action-card/action-card.component.html +0 -78
- package/src/lib/components/shared/action-card/action-card.component.scss +0 -238
- package/src/lib/components/shared/action-card/action-card.component.ts +0 -56
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.css +0 -135
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.html +0 -36
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.spec.ts +0 -23
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.ts +0 -71
- package/src/lib/components/shared-list/shared-list.component.css +0 -0
- package/src/lib/components/shared-list/shared-list.component.html +0 -17
- package/src/lib/components/shared-list/shared-list.component.spec.ts +0 -23
- package/src/lib/components/shared-list/shared-list.component.ts +0 -53
- package/src/lib/components/snackbar-static/snackbar-static.component.html +0 -20
- package/src/lib/components/snackbar-static/snackbar-static.component.scss +0 -135
- package/src/lib/components/snackbar-static/snackbar-static.component.ts +0 -26
- package/src/lib/components/title-bar/title-bar.component.css +0 -0
- package/src/lib/components/title-bar/title-bar.component.css.map +0 -1
- package/src/lib/components/title-bar/title-bar.component.html +0 -35
- package/src/lib/components/title-bar/title-bar.component.scss +0 -126
- package/src/lib/components/title-bar/title-bar.component.spec.ts +0 -23
- package/src/lib/components/title-bar/title-bar.component.ts +0 -126
- package/src/lib/services/backend-service.ts +0 -287
- package/src/lib/services/top-panel.ts +0 -17
- package/src/lib/services/trigger-form.service.ts +0 -11
- package/src/lib/share-module/shared-module.ts +0 -10
- package/src/lib/utils/base-utils.ts +0 -102
- package/src/lib/validators/date-range-validator.ts +0 -31
- package/src/lib/validators/match-list.validator.ts +0 -10
- package/src/lib/validators/multi-email-validator.ts +0 -15
- package/tsconfig.lib.json +0 -15
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.spec.json +0 -15
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { AutoCompleteComponent } from "../auto-complete/auto-complete.component";
|
|
3
|
+
import { MatFormField, MatOption, MatSelect } from "@angular/material/select";
|
|
4
|
+
import { NgForOf, NgIf, NgSwitch, NgSwitchCase } from "@angular/common";
|
|
5
|
+
import { MatIcon } from "@angular/material/icon";
|
|
6
|
+
import { MatIconButton } from "@angular/material/button";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class EquationBuilderComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.valueChanged = new EventEmitter();
|
|
11
|
+
this.operators = [
|
|
12
|
+
{ label: '+', value: '+' },
|
|
13
|
+
{ label: '-', value: '-' },
|
|
14
|
+
{ label: '=', value: '=' }
|
|
15
|
+
];
|
|
16
|
+
this.items = [];
|
|
17
|
+
}
|
|
18
|
+
ngOnInit() {
|
|
19
|
+
const fieldValues = this.form.get('fieldValue')?.value;
|
|
20
|
+
if (Array.isArray(fieldValues) && fieldValues.length > 0) {
|
|
21
|
+
this.items = fieldValues.map(val => {
|
|
22
|
+
if (this.operators.some(op => op.value === val)) {
|
|
23
|
+
return { type: 'dropdown', value: val };
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
return {
|
|
27
|
+
type: 'lookup',
|
|
28
|
+
value: this.getLookupByCode(val)
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.items = [{ type: 'lookup', value: null }];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
getLookupByCode(code) {
|
|
38
|
+
return { code: code, id: 1, englishName: code, arabicName: code };
|
|
39
|
+
}
|
|
40
|
+
onLookupChange(index, value) {
|
|
41
|
+
this.items[index].value = value;
|
|
42
|
+
if (index === this.items.length - 1) {
|
|
43
|
+
this.items.push({ type: 'dropdown', value: null });
|
|
44
|
+
}
|
|
45
|
+
this.emitChange();
|
|
46
|
+
}
|
|
47
|
+
onDropdownChange(index, value) {
|
|
48
|
+
this.items[index].value = value;
|
|
49
|
+
if (index !== this.items.length - 1) {
|
|
50
|
+
this.emitChange();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (value === '=') {
|
|
54
|
+
this.items = this.items.slice(0, index + 1);
|
|
55
|
+
}
|
|
56
|
+
else if (value != null && value !== '') {
|
|
57
|
+
const lastItem = this.items[this.items.length - 1];
|
|
58
|
+
if (lastItem.type !== 'lookup') {
|
|
59
|
+
this.items.push({ type: 'lookup', value: null });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
this.emitChange();
|
|
63
|
+
}
|
|
64
|
+
emitChange() {
|
|
65
|
+
const simplifiedItems = this.items.map(item => {
|
|
66
|
+
if (item?.type === 'lookup') {
|
|
67
|
+
return item.value?.code ?? null;
|
|
68
|
+
}
|
|
69
|
+
else if (item?.type === 'dropdown') {
|
|
70
|
+
return item.value ?? null;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
});
|
|
74
|
+
const isValid = simplifiedItems[simplifiedItems.length - 1] === '=';
|
|
75
|
+
this.valueChanged.emit({
|
|
76
|
+
value: simplifiedItems.filter(val => val !== '='),
|
|
77
|
+
valid: isValid
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
onClearAll() {
|
|
81
|
+
this.items = [{ type: 'lookup', value: null }];
|
|
82
|
+
this.emitChange();
|
|
83
|
+
}
|
|
84
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EquationBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
85
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EquationBuilderComponent, isStandalone: true, selector: "lib-equation-builder", inputs: { form: "form", field: "field", isPending: "isPending", readOnly: "readOnly" }, outputs: { valueChanged: "valueChanged" }, ngImport: i0, template: "<div class=\"flex-row gap-10 fill align-start-center\">\r\n <ng-container *ngFor=\"let item of items; let i = index\">\r\n <div class=\"flex-row align-start-center gap-5\">\r\n <ng-container [ngSwitch]=\"item.type\">\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <app-auto-complete\r\n class=\"flex-full\"\r\n [field]=\"field\"\r\n [form]=\"form\"\r\n [defaultValue]=\"item.value\"\r\n (selectedValue)=\"onLookupChange(i, $event)\">\r\n </app-auto-complete>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <mat-form-field class=\"flex-none\" appearance=\"outline\" style=\"width: 100px\">\r\n <mat-select [disabled]=\"readOnly\" [value]=\"item.value\" (selectionChange)=\"onDropdownChange(i, $event.value)\">\r\n <mat-option *ngFor=\"let opt of operators\" [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <button [disabled]=\"isPending\" mat-icon-button color=\"warn\" (click)=\"onClearAll()\" *ngIf=\"items.length > 0\" id=\"equation-clear-all-btn\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n</div>\r\n", styles: [".flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-full{flex:1 1 auto}.flex-none{flex:0 0 auto}.fill{width:100%}.align-start-center{align-items:center;justify-content:flex-start}.align-center-center{align-items:center;justify-content:center}.gap-5{gap:5px}.gap-10{gap:10px}\n"], dependencies: [{ kind: "component", type: AutoCompleteComponent, selector: "app-auto-complete", inputs: ["field", "form", "defaultValue", "readonly", "supportingAttributes"], outputs: ["selectedValue"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
86
|
+
}
|
|
87
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EquationBuilderComponent, decorators: [{
|
|
88
|
+
type: Component,
|
|
89
|
+
args: [{ selector: 'lib-equation-builder', standalone: true, imports: [
|
|
90
|
+
AutoCompleteComponent,
|
|
91
|
+
MatSelect,
|
|
92
|
+
MatOption,
|
|
93
|
+
MatFormField,
|
|
94
|
+
NgSwitch,
|
|
95
|
+
NgForOf,
|
|
96
|
+
NgSwitchCase,
|
|
97
|
+
MatIcon,
|
|
98
|
+
MatIconButton,
|
|
99
|
+
NgIf
|
|
100
|
+
], template: "<div class=\"flex-row gap-10 fill align-start-center\">\r\n <ng-container *ngFor=\"let item of items; let i = index\">\r\n <div class=\"flex-row align-start-center gap-5\">\r\n <ng-container [ngSwitch]=\"item.type\">\r\n <ng-container *ngSwitchCase=\"'lookup'\">\r\n <app-auto-complete\r\n class=\"flex-full\"\r\n [field]=\"field\"\r\n [form]=\"form\"\r\n [defaultValue]=\"item.value\"\r\n (selectedValue)=\"onLookupChange(i, $event)\">\r\n </app-auto-complete>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <mat-form-field class=\"flex-none\" appearance=\"outline\" style=\"width: 100px\">\r\n <mat-select [disabled]=\"readOnly\" [value]=\"item.value\" (selectionChange)=\"onDropdownChange(i, $event.value)\">\r\n <mat-option *ngFor=\"let opt of operators\" [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <button [disabled]=\"isPending\" mat-icon-button color=\"warn\" (click)=\"onClearAll()\" *ngIf=\"items.length > 0\" id=\"equation-clear-all-btn\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n</div>\r\n", styles: [".flex-row{display:flex;flex-direction:row}.flex-column{display:flex;flex-direction:column}.flex-full{flex:1 1 auto}.flex-none{flex:0 0 auto}.fill{width:100%}.align-start-center{align-items:center;justify-content:flex-start}.align-center-center{align-items:center;justify-content:center}.gap-5{gap:5px}.gap-10{gap:10px}\n"] }]
|
|
101
|
+
}], propDecorators: { form: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], field: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], isPending: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], valueChanged: [{
|
|
108
|
+
type: Output
|
|
109
|
+
}], readOnly: [{
|
|
110
|
+
type: Input
|
|
111
|
+
}] } });
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VxdWF0aW9uLWJ1aWxkZXIvZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VxdWF0aW9uLWJ1aWxkZXIvZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTdFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixDQUFDOztBQW9CdkQsTUFBTSxPQUFPLHdCQUF3QjtJQWxCckM7UUFzQlksaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRWpELGNBQVMsR0FBRztZQUNWLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQzFCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO1lBQzFCLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FB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QWxCcEMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQO3dCQUNQLHFCQUFxQjt3QkFDckIsU0FBUzt3QkFDVCxTQUFTO3dCQUNULFlBQVk7d0JBQ1osUUFBUTt3QkFDUixPQUFPO3dCQUNQLFlBQVk7d0JBQ1osT0FBTzt3QkFDUCxhQUFhO3dCQUNiLElBQUk7cUJBQ0w7OEJBS1EsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBU0UsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBBdXRvQ29tcGxldGVDb21wb25lbnQgfSBmcm9tIFwiLi4vYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGQsIE1hdE9wdGlvbiwgTWF0U2VsZWN0IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NlbGVjdFwiO1xyXG5pbXBvcnQge05nRm9yT2YsIE5nSWYsIE5nU3dpdGNoLCBOZ1N3aXRjaENhc2V9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge01hdEljb25CdXR0b259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWVxdWF0aW9uLWJ1aWxkZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQXV0b0NvbXBsZXRlQ29tcG9uZW50LFxyXG4gICAgTWF0U2VsZWN0LFxyXG4gICAgTWF0T3B0aW9uLFxyXG4gICAgTWF0Rm9ybUZpZWxkLFxyXG4gICAgTmdTd2l0Y2gsXHJcbiAgICBOZ0Zvck9mLFxyXG4gICAgTmdTd2l0Y2hDYXNlLFxyXG4gICAgTWF0SWNvbixcclxuICAgIE1hdEljb25CdXR0b24sXHJcbiAgICBOZ0lmXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZXF1YXRpb24tYnVpbGRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2VxdWF0aW9uLWJ1aWxkZXIuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEVxdWF0aW9uQnVpbGRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgZm9ybSE6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBmaWVsZCE6IGFueTtcclxuICBASW5wdXQoKSBpc1BlbmRpbmchOiBib29sZWFuO1xyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgb3BlcmF0b3JzID0gW1xyXG4gICAgeyBsYWJlbDogJysnLCB2YWx1ZTogJysnIH0sXHJcbiAgICB7IGxhYmVsOiAnLScsIHZhbHVlOiAnLScgfSxcclxuICAgIHsgbGFiZWw6ICc9JywgdmFsdWU6ICc9JyB9XHJcbiAgXTtcclxuXHJcbiAgaXRlbXM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgcmVhZE9ubHkhOiBib29sZWFuO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnN0IGZpZWxkVmFsdWVzOiBhbnlbXSA9IHRoaXMuZm9ybS5nZXQoJ2ZpZWxkVmFsdWUnKT8udmFsdWU7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZXMpICYmIGZpZWxkVmFsdWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5pdGVtcyA9IGZpZWxkVmFsdWVzLm1hcCh2YWwgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm9wZXJhdG9ycy5zb21lKG9wID0+IG9wLnZhbHVlID09PSB2YWwpKSB7XHJcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZHJvcGRvd24nLCB2YWx1ZTogdmFsIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdsb29rdXAnLFxyXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRMb29rdXBCeUNvZGUodmFsKVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pdGVtcyA9IFt7IHR5cGU6ICdsb29rdXAnLCB2YWx1ZTogbnVsbCB9XTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBnZXRMb29rdXBCeUNvZGUoY29kZTogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiAgeyBjb2RlOiBjb2RlLCBpZDogMSwgZW5nbGlzaE5hbWU6IGNvZGUsIGFyYWJpY05hbWU6IGNvZGUgfVxyXG4gIH1cclxuXHJcbiAgb25Mb29rdXBDaGFuZ2UoaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5pdGVtc1tpbmRleF0udmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAoaW5kZXggPT09IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkge1xyXG4gICAgICB0aGlzLml0ZW1zLnB1c2goeyB0eXBlOiAnZHJvcGRvd24nLCB2YWx1ZTogbnVsbH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgb25Ecm9wZG93bkNoYW5nZShpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLml0ZW1zW2luZGV4XS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIGlmIChpbmRleCAhPT0gdGhpcy5pdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlID09PSAnPScpIHtcclxuICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCwgaW5kZXggKyAxKTtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gJycpIHtcclxuICAgICAgY29uc3QgbGFzdEl0ZW0gPSB0aGlzLml0ZW1zW3RoaXMuaXRlbXMubGVuZ3RoIC0gMV07XHJcbiAgICAgIGlmIChsYXN0SXRlbS50eXBlICE9PSAnbG9va3VwJykge1xyXG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh7IHR5cGU6ICdsb29rdXAnLCB2YWx1ZTogbnVsbCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgZW1pdENoYW5nZSgpIHtcclxuICAgIGNvbnN0IHNpbXBsaWZpZWRJdGVtcyA9IHRoaXMuaXRlbXMubWFwKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAoaXRlbT8udHlwZSA9PT0gJ2xvb2t1cCcpIHtcclxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZT8uY29kZSA/PyBudWxsO1xyXG4gICAgICB9IGVsc2UgaWYgKGl0ZW0/LnR5cGUgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZSA/PyBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBpc1ZhbGlkID0gc2ltcGxpZmllZEl0ZW1zW3NpbXBsaWZpZWRJdGVtcy5sZW5ndGggLSAxXSA9PT0gJz0nO1xyXG5cclxuICAgIHRoaXMudmFsdWVDaGFuZ2VkLmVtaXQoe1xyXG4gICAgICB2YWx1ZTogc2ltcGxpZmllZEl0ZW1zLmZpbHRlcih2YWwgPT4gdmFsICE9PSAnPScpLFxyXG4gICAgICB2YWxpZDogaXNWYWxpZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNsZWFyQWxsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pdGVtcyA9IFt7IHR5cGU6ICdsb29rdXAnLCB2YWx1ZTogbnVsbCB9XTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmbGV4LXJvdyBnYXAtMTAgZmlsbCBhbGlnbi1zdGFydC1jZW50ZXJcIj5cclxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleC1yb3cgYWxpZ24tc3RhcnQtY2VudGVyIGdhcC01XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIml0ZW0udHlwZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb29rdXAnXCI+XHJcbiAgICAgICAgICA8YXBwLWF1dG8tY29tcGxldGVcclxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWZ1bGxcIlxyXG4gICAgICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxyXG4gICAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJpdGVtLnZhbHVlXCJcclxuICAgICAgICAgICAgKHNlbGVjdGVkVmFsdWUpPVwib25Mb29rdXBDaGFuZ2UoaSwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPC9hcHAtYXV0by1jb21wbGV0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZmxleC1ub25lXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiPlxyXG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25Ecm9wZG93bkNoYW5nZShpLCAkZXZlbnQudmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBvcGVyYXRvcnNcIiBbdmFsdWVdPVwib3B0LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBvcHQubGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxidXR0b24gW2Rpc2FibGVkXT1cImlzUGVuZGluZ1wiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAoY2xpY2spPVwib25DbGVhckFsbCgpXCIgKm5nSWY9XCJpdGVtcy5sZW5ndGggPiAwXCIgaWQ9XCJlcXVhdGlvbi1jbGVhci1hbGwtYnRuXCI+XHJcbiAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { FormsModule } from "@angular/forms";
|
|
3
|
+
import { CommonModule } from "@angular/common";
|
|
4
|
+
import { MatButtonModule } from "@angular/material/button";
|
|
5
|
+
import { MatIconModule } from "@angular/material/icon";
|
|
6
|
+
import { BaseFormCanvasComponent } from "../base-form-canvas/base-form-canvas.component";
|
|
7
|
+
import { TranslateModule } from "@ngx-translate/core";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common";
|
|
10
|
+
import * as i2 from "@angular/material/button";
|
|
11
|
+
import * as i3 from "@angular/material/icon";
|
|
12
|
+
import * as i4 from "@ngx-translate/core";
|
|
13
|
+
export class ItemLineEditorComponent {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.allowAdd = true;
|
|
16
|
+
this.allowDelete = true;
|
|
17
|
+
this.editable = true;
|
|
18
|
+
this.fields = [];
|
|
19
|
+
this.items = [this.blankItem()];
|
|
20
|
+
this.itemsChange = new EventEmitter();
|
|
21
|
+
this.itemSaved = new EventEmitter();
|
|
22
|
+
this.itemDeleted = new EventEmitter();
|
|
23
|
+
this.totalsChange = new EventEmitter();
|
|
24
|
+
this.editStateChange = new EventEmitter();
|
|
25
|
+
this.formRefs = [];
|
|
26
|
+
this.editing = [true];
|
|
27
|
+
this.noDataFound = false;
|
|
28
|
+
}
|
|
29
|
+
get headerFields() {
|
|
30
|
+
return (this.fields || []).filter(f => f.visible && f.row === 1 && f.type !== 'spacer');
|
|
31
|
+
}
|
|
32
|
+
get hasInvalidEditingForm() {
|
|
33
|
+
if (!this.formRefs || !this.editing)
|
|
34
|
+
return false;
|
|
35
|
+
for (let i = 0; i < this.formRefs.length; i++) {
|
|
36
|
+
const frm = this.formRefs[i];
|
|
37
|
+
if (this.editing[i] && frm && frm.invalid) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
get canAddNew() {
|
|
44
|
+
return !this.hasInvalidEditingForm;
|
|
45
|
+
}
|
|
46
|
+
canSave(index) {
|
|
47
|
+
const frm = this.formRefs?.[index];
|
|
48
|
+
if (!this.editing?.[index])
|
|
49
|
+
return true;
|
|
50
|
+
return !!frm && frm.valid;
|
|
51
|
+
}
|
|
52
|
+
labelOf(field) {
|
|
53
|
+
const configuredKey = field.label ? field.label : field.property;
|
|
54
|
+
return configuredKey.startsWith(this.pageInfo.labelsSection)
|
|
55
|
+
? configuredKey
|
|
56
|
+
: `${this.pageInfo.labelsSection}.${configuredKey}`;
|
|
57
|
+
}
|
|
58
|
+
blankItem() {
|
|
59
|
+
return { gtinCode: '', description: '', unitPrice: 0, qty: 1, discount: 0, total: 0 };
|
|
60
|
+
}
|
|
61
|
+
ngOnChanges(changes) {
|
|
62
|
+
if (changes['items'] && changes['items'].currentValue) {
|
|
63
|
+
const len = (this.items || []).length;
|
|
64
|
+
this.noDataFound = len <= 0;
|
|
65
|
+
if (changes['items'].firstChange) {
|
|
66
|
+
this.formRefs = new Array(len).fill(undefined);
|
|
67
|
+
this.editing = len > 0 ? new Array(len).fill(false) : [true];
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const oldLen = this.editing?.length || 0;
|
|
71
|
+
if (!this.formRefs)
|
|
72
|
+
this.formRefs = [];
|
|
73
|
+
if (this.formRefs.length > len) {
|
|
74
|
+
this.formRefs = this.formRefs.slice(0, len);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
while (this.formRefs.length < len)
|
|
78
|
+
this.formRefs.push(undefined);
|
|
79
|
+
}
|
|
80
|
+
if (!this.editing)
|
|
81
|
+
this.editing = [];
|
|
82
|
+
if (this.editing.length > len) {
|
|
83
|
+
this.editing = this.editing.slice(0, len);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
for (let i = this.editing.length; i < len; i++) {
|
|
87
|
+
this.editing[i] = true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (oldLen === 0 && len > 0 && this.editing[0] === undefined) {
|
|
91
|
+
this.editing[0] = true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.emitTotals();
|
|
95
|
+
}
|
|
96
|
+
if (changes['fields'] && changes['fields'].currentValue) {
|
|
97
|
+
this.baseFieldsSnapshot = (this.fields || []).map(f => ({ ...f }));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
onFormUpdated(form, index) {
|
|
101
|
+
const discountCtrl = form.get('discount');
|
|
102
|
+
if (discountCtrl) {
|
|
103
|
+
const existing = discountCtrl.validator ? [discountCtrl.validator] : [];
|
|
104
|
+
discountCtrl.setValidators([
|
|
105
|
+
...existing,
|
|
106
|
+
this.discountValidator(index)
|
|
107
|
+
]);
|
|
108
|
+
discountCtrl.updateValueAndValidity({ emitEvent: false });
|
|
109
|
+
}
|
|
110
|
+
this.formRefs[index] = form;
|
|
111
|
+
try {
|
|
112
|
+
const emittedItems = this.items.map((it, i) => {
|
|
113
|
+
if (i !== index)
|
|
114
|
+
return it;
|
|
115
|
+
const v = this.getCurrentValues(i) || it || {};
|
|
116
|
+
const up = Number(v?.unitPrice || 0);
|
|
117
|
+
const q = Number(v?.qty || 0);
|
|
118
|
+
const disc = Number(v?.discount || 0);
|
|
119
|
+
const total = Math.max(0, up * q - disc);
|
|
120
|
+
return { ...it, ...v, total };
|
|
121
|
+
});
|
|
122
|
+
this.itemsChange.emit(emittedItems);
|
|
123
|
+
}
|
|
124
|
+
catch (_e) {
|
|
125
|
+
}
|
|
126
|
+
this.emitTotals();
|
|
127
|
+
}
|
|
128
|
+
addNewItem() {
|
|
129
|
+
this.items.push(this.blankItem());
|
|
130
|
+
this.formRefs.push(undefined);
|
|
131
|
+
this.editing.push(true);
|
|
132
|
+
this.restoreFieldsFromSnapshot();
|
|
133
|
+
this.itemsChange.emit([...this.items]);
|
|
134
|
+
this.editStateChange.emit({ index: this.items.length - 1, editing: true });
|
|
135
|
+
this.emitTotals();
|
|
136
|
+
}
|
|
137
|
+
saveRow(index) {
|
|
138
|
+
const frm = this.formRefs?.[index];
|
|
139
|
+
if (this.editing[index] && frm && frm.invalid) {
|
|
140
|
+
Object.values(frm.controls).forEach(c => c.markAsTouched());
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const v = this.getCurrentValues(index);
|
|
144
|
+
if (!v)
|
|
145
|
+
return;
|
|
146
|
+
this.items[index] = { ...v, total: this.calcLineTotal(index) };
|
|
147
|
+
this.editing[index] = false;
|
|
148
|
+
this.setFieldsReadonly(true);
|
|
149
|
+
this.itemsChange.emit([...this.items]);
|
|
150
|
+
this.itemSaved.emit({ index, item: this.items[index] });
|
|
151
|
+
this.editStateChange.emit({ index, editing: false });
|
|
152
|
+
this.emitTotals();
|
|
153
|
+
}
|
|
154
|
+
deleteItem(index) {
|
|
155
|
+
if (index < 0 || index >= this.items.length)
|
|
156
|
+
return;
|
|
157
|
+
this.items.splice(index, 1);
|
|
158
|
+
this.formRefs.splice(index, 1);
|
|
159
|
+
this.editing.splice(index, 1);
|
|
160
|
+
this.itemsChange.emit([...this.items]);
|
|
161
|
+
this.itemDeleted.emit({ index });
|
|
162
|
+
this.emitTotals();
|
|
163
|
+
}
|
|
164
|
+
clearAll() {
|
|
165
|
+
this.items = [this.blankItem()];
|
|
166
|
+
this.formRefs = [undefined];
|
|
167
|
+
this.editing = [true];
|
|
168
|
+
this.itemsChange.emit([...this.items]);
|
|
169
|
+
this.emitTotals();
|
|
170
|
+
}
|
|
171
|
+
getCurrentValues(index) {
|
|
172
|
+
const isEditing = this.editing[index];
|
|
173
|
+
const frm = this.formRefs[index];
|
|
174
|
+
const base = this.items[index] || {};
|
|
175
|
+
const src = (isEditing && frm) ? { ...base, ...frm.value } : { ...base };
|
|
176
|
+
if (!src)
|
|
177
|
+
return null;
|
|
178
|
+
const val = { ...src };
|
|
179
|
+
val.unitPrice = val.unitPrice === null || val.unitPrice === '' ? null : Number(val.unitPrice);
|
|
180
|
+
val.qty = val.qty === null || val.qty === '' ? null : Number(val.qty);
|
|
181
|
+
val.discount = val.discount === null || val.discount === '' ? null : Number(val.discount);
|
|
182
|
+
return val;
|
|
183
|
+
}
|
|
184
|
+
calcLineTotal(index) {
|
|
185
|
+
const val = this.getCurrentValues(index);
|
|
186
|
+
if (!val)
|
|
187
|
+
return Number(this.items[index]?.total || 0);
|
|
188
|
+
return Math.max(0, (val.unitPrice || 0) * (val.qty || 0) - (val.discount || 0));
|
|
189
|
+
}
|
|
190
|
+
get subtotal() {
|
|
191
|
+
return this.items.reduce((s, _it, i) => {
|
|
192
|
+
const v = this.getCurrentValues(i);
|
|
193
|
+
const up = Number(v?.unitPrice || 0);
|
|
194
|
+
const q = Number(v?.qty || 0);
|
|
195
|
+
return s + (up * q);
|
|
196
|
+
}, 0);
|
|
197
|
+
}
|
|
198
|
+
get discountTotal() {
|
|
199
|
+
return this.items.reduce((s, _it, i) => {
|
|
200
|
+
const v = this.getCurrentValues(i);
|
|
201
|
+
return s + Number(v?.discount || 0);
|
|
202
|
+
}, 0);
|
|
203
|
+
}
|
|
204
|
+
get grandTotal() {
|
|
205
|
+
return this.items.reduce((s, _it, i) => s + this.calcLineTotal(i), 0);
|
|
206
|
+
}
|
|
207
|
+
trackByIndex(index, _item) {
|
|
208
|
+
return index;
|
|
209
|
+
}
|
|
210
|
+
editRow(index) {
|
|
211
|
+
this.editing[index] = true;
|
|
212
|
+
this.restoreFieldsFromSnapshot();
|
|
213
|
+
this.editStateChange.emit({ index, editing: true });
|
|
214
|
+
}
|
|
215
|
+
emitTotals() {
|
|
216
|
+
this.totalsChange.emit({
|
|
217
|
+
subtotal: this.subtotal,
|
|
218
|
+
discount: this.discountTotal,
|
|
219
|
+
grandTotal: this.grandTotal
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
setFieldsReadonly(state) {
|
|
223
|
+
this.fields = (this.fields || []).map(f => ({ ...f, readonly: state }));
|
|
224
|
+
}
|
|
225
|
+
restoreFieldsFromSnapshot() {
|
|
226
|
+
if (this.baseFieldsSnapshot && this.baseFieldsSnapshot.length) {
|
|
227
|
+
this.fields = this.baseFieldsSnapshot.map(f => ({ ...f }));
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.setFieldsReadonly(false);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
get gridTemplate() {
|
|
234
|
+
return this.columnHeaderWidths.join(' ');
|
|
235
|
+
}
|
|
236
|
+
discountValidator(index) {
|
|
237
|
+
return (control) => {
|
|
238
|
+
const val = this.getCurrentValues(index);
|
|
239
|
+
if (!val)
|
|
240
|
+
return null;
|
|
241
|
+
const totalBeforeDiscount = (val.unitPrice ?? 0) * (val.qty ?? 0);
|
|
242
|
+
const discount = val.discount ?? null;
|
|
243
|
+
if (discount != null && discount > totalBeforeDiscount) {
|
|
244
|
+
return { discountTooHigh: true };
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ItemLineEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
250
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ItemLineEditorComponent, isStandalone: true, selector: "app-item-line-editor", inputs: { noDataFoundIcon: "noDataFoundIcon", noDataFoundTitle: "noDataFoundTitle", noDataFoundSubtitle: "noDataFoundSubtitle", pageInfo: "pageInfo", columnHeaderWidths: "columnHeaderWidths", title: "title", subtitle: "subtitle", allowAdd: "allowAdd", allowDelete: "allowDelete", editable: "editable", currency: "currency", fields: "fields", items: "items" }, outputs: { itemsChange: "itemsChange", itemSaved: "itemSaved", itemDeleted: "itemDeleted", totalsChange: "totalsChange", editStateChange: "editStateChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"item-line-editor\">\r\n\r\n <h3 class=\"title\">{{ title | translate }}</h3>\r\n <p class=\"subtitle\">{{ subtitle | translate }}</p>\r\n\r\n <div class=\"table-header\" [ngStyle]=\"{ 'grid-template-columns': gridTemplate }\">\r\n <ng-container *ngFor=\"let f of headerFields; let idx = index\">\r\n <div class=\"col\">\r\n {{ labelOf(f) | translate }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n @if (!noDataFound) {\r\n <div class=\"table-body\" *ngFor=\"let it of items; let i = index; trackBy: trackByIndex\">\r\n\r\n <div class=\"table-row\">\r\n\r\n <div class=\"row-inputs\">\r\n <app-base-form-canvas\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"fields\"\r\n [editable]=\"editing[i]\"\r\n [emitOnValueChanges]=\"true\"\r\n [item]=\"it\"\r\n [currency]=\"currency\"\r\n (formUpdated)=\"onFormUpdated($event, i)\">\r\n </app-base-form-canvas>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"row-actions\">\r\n\r\n <button *ngIf=\"editing[i]\" mat-stroked-button class=\"btn-none-background-primary save-btn\" (click)=\"saveRow(i)\"\r\n [disabled]=\"!canSave(i)\">\r\n <div class=\"button-text\">\r\n <mat-icon>check</mat-icon>\r\n <span>{{ 'item-line.save' | translate }}</span>\r\n </div>\r\n </button>\r\n\r\n <button *ngIf=\"!editing[i] && editable\" mat-stroked-button class=\"btn-none-background-primary edit-btn\"\r\n (click)=\"editRow(i)\">\r\n <div class=\"button-text\">\r\n <mat-icon>edit</mat-icon>\r\n <span>{{ 'item-line.edit' | translate }}</span>\r\n </div>\r\n </button>\r\n\r\n <button *ngIf=\"allowDelete && editable\" mat-stroked-button class=\"btn-none-background-primary delete-btn\"\r\n (click)=\"deleteItem(i)\" type=\"button\">\r\n <div class=\"button-text\">\r\n <mat-icon>delete</mat-icon>\r\n <span>{{ 'item-line.delete' | translate }}</span>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n @if (noDataFound) {\r\n <div class=\"dataNotFound flex-column\">\r\n <mat-icon class=\"dataNotFound__icon\">{{ noDataFoundIcon }}</mat-icon>\r\n <span class=\"dataNotFound__title\">{{ noDataFoundTitle | translate }}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ noDataFoundSubtitle | translate }}</span>\r\n </div>\r\n\r\n }\r\n <div class=\"add-item\" *ngIf=\"allowAdd && editable\">\r\n <div class=\"divider\" style=\"border-top: 1px solid var(--primary-color-3nd)\"></div>\r\n <button mat-stroked-button color=\"primary\" class=\"btn-none-background-primary\" (click)=\"addNewItem()\"\r\n [disabled]=\"!canAddNew\">\r\n <div class=\"button-text\">\r\n <mat-icon>add</mat-icon>\r\n <span> {{ 'item-line.addNewItem' | translate }}</span>\r\n </div>\r\n </button>\r\n\r\n </div>\r\n\r\n @if (!noDataFound) {\r\n <div class=\"totals-box\">\r\n\r\n <div class=\"total-row\">\r\n <span class=\"label\">{{ 'item-line.discount' | translate }}</span>\r\n <span class=\"value red\">{{ discountTotal | currency:currency }}</span>\r\n </div>\r\n\r\n <div class=\"total-row\">\r\n <span class=\"label\">{{ 'item-line.amount' | translate }}</span>\r\n <span class=\"value\">{{ subtotal | currency:currency }}</span>\r\n </div>\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <div class=\"total-row grand\">\r\n <span class=\"label\">{{ 'item-line.grandTotal' | translate }}</span>\r\n <span class=\"value strong green\">{{ grandTotal | currency:currency }}</span>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>\r\n", styles: [".item-line-editor{background:#fff;border-radius:8px;padding:20px}.title{font-size:20px;margin-bottom:4px;font-weight:600}.subtitle{color:#777;font-size:13px;margin-bottom:16px}.table-header{display:grid;grid-template-columns:20% 25% 15% 10% 15% 15%;font-weight:600;font-size:13px;padding-bottom:8px;border-bottom:2px solid var(--primary-color-3nd);margin-bottom:12px}.col{padding-left:4px}.table-body .table-row{display:grid;padding:10px 0;border-bottom:1px solid #e6e6e6}.row-inputs{padding-right:10px}.row-actions{display:flex;flex-direction:row;align-items:center;justify-content:flex-end;gap:6px;margin-top:24px}.line-total{font-weight:600;font-size:14px}.save-btn,.edit-btn,.delete-btn{width:114px!important;height:32px!important;border-radius:9999px!important;border:1px solid var(--primary-color-3nd);background:#fff}.delete-btn{color:#ce3b3a!important;border:1px solid #ce3b3a!important}.add-item{margin-top:16px}.totals-box{margin-top:20px;width:400px}.total-row{display:flex;justify-content:space-between;font-size:15px;margin:6px 0}.grand{font-family:lusail-bold,sans-serif!important}.total-row .label{font-weight:500;color:#333}.total-row .value{font-weight:600}.divider{border-top:1px solid #e0e0e0;margin:10px 0}.red{color:#d9534f}.green{color:#0c7d5e;font-weight:700}.grand .value,.button-text span{font-size:16px}.button-text mat-icon{font-size:16px!important}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;text-align:center}.dataNotFound__icon{color:var(--primary-color-3nd);font-size:24px;height:24px;width:24px;margin-bottom:8px}.dataNotFound__title{color:#6a6a6a;font-size:18px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:16px;font-weight:400}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i1.CurrencyPipe, name: "currency" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "emitOnValueChanges", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] }); }
|
|
251
|
+
}
|
|
252
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ItemLineEditorComponent, decorators: [{
|
|
253
|
+
type: Component,
|
|
254
|
+
args: [{ selector: 'app-item-line-editor', standalone: true, imports: [
|
|
255
|
+
CommonModule,
|
|
256
|
+
FormsModule,
|
|
257
|
+
MatButtonModule,
|
|
258
|
+
MatIconModule,
|
|
259
|
+
BaseFormCanvasComponent,
|
|
260
|
+
TranslateModule
|
|
261
|
+
], template: "<div class=\"item-line-editor\">\r\n\r\n <h3 class=\"title\">{{ title | translate }}</h3>\r\n <p class=\"subtitle\">{{ subtitle | translate }}</p>\r\n\r\n <div class=\"table-header\" [ngStyle]=\"{ 'grid-template-columns': gridTemplate }\">\r\n <ng-container *ngFor=\"let f of headerFields; let idx = index\">\r\n <div class=\"col\">\r\n {{ labelOf(f) | translate }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n @if (!noDataFound) {\r\n <div class=\"table-body\" *ngFor=\"let it of items; let i = index; trackBy: trackByIndex\">\r\n\r\n <div class=\"table-row\">\r\n\r\n <div class=\"row-inputs\">\r\n <app-base-form-canvas\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"fields\"\r\n [editable]=\"editing[i]\"\r\n [emitOnValueChanges]=\"true\"\r\n [item]=\"it\"\r\n [currency]=\"currency\"\r\n (formUpdated)=\"onFormUpdated($event, i)\">\r\n </app-base-form-canvas>\r\n </div>\r\n\r\n\r\n </div>\r\n <div class=\"row-actions\">\r\n\r\n <button *ngIf=\"editing[i]\" mat-stroked-button class=\"btn-none-background-primary save-btn\" (click)=\"saveRow(i)\"\r\n [disabled]=\"!canSave(i)\">\r\n <div class=\"button-text\">\r\n <mat-icon>check</mat-icon>\r\n <span>{{ 'item-line.save' | translate }}</span>\r\n </div>\r\n </button>\r\n\r\n <button *ngIf=\"!editing[i] && editable\" mat-stroked-button class=\"btn-none-background-primary edit-btn\"\r\n (click)=\"editRow(i)\">\r\n <div class=\"button-text\">\r\n <mat-icon>edit</mat-icon>\r\n <span>{{ 'item-line.edit' | translate }}</span>\r\n </div>\r\n </button>\r\n\r\n <button *ngIf=\"allowDelete && editable\" mat-stroked-button class=\"btn-none-background-primary delete-btn\"\r\n (click)=\"deleteItem(i)\" type=\"button\">\r\n <div class=\"button-text\">\r\n <mat-icon>delete</mat-icon>\r\n <span>{{ 'item-line.delete' | translate }}</span>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n @if (noDataFound) {\r\n <div class=\"dataNotFound flex-column\">\r\n <mat-icon class=\"dataNotFound__icon\">{{ noDataFoundIcon }}</mat-icon>\r\n <span class=\"dataNotFound__title\">{{ noDataFoundTitle | translate }}</span>\r\n <span class=\"dataNotFound__subtitle\">{{ noDataFoundSubtitle | translate }}</span>\r\n </div>\r\n\r\n }\r\n <div class=\"add-item\" *ngIf=\"allowAdd && editable\">\r\n <div class=\"divider\" style=\"border-top: 1px solid var(--primary-color-3nd)\"></div>\r\n <button mat-stroked-button color=\"primary\" class=\"btn-none-background-primary\" (click)=\"addNewItem()\"\r\n [disabled]=\"!canAddNew\">\r\n <div class=\"button-text\">\r\n <mat-icon>add</mat-icon>\r\n <span> {{ 'item-line.addNewItem' | translate }}</span>\r\n </div>\r\n </button>\r\n\r\n </div>\r\n\r\n @if (!noDataFound) {\r\n <div class=\"totals-box\">\r\n\r\n <div class=\"total-row\">\r\n <span class=\"label\">{{ 'item-line.discount' | translate }}</span>\r\n <span class=\"value red\">{{ discountTotal | currency:currency }}</span>\r\n </div>\r\n\r\n <div class=\"total-row\">\r\n <span class=\"label\">{{ 'item-line.amount' | translate }}</span>\r\n <span class=\"value\">{{ subtotal | currency:currency }}</span>\r\n </div>\r\n\r\n <div class=\"divider\"></div>\r\n\r\n <div class=\"total-row grand\">\r\n <span class=\"label\">{{ 'item-line.grandTotal' | translate }}</span>\r\n <span class=\"value strong green\">{{ grandTotal | currency:currency }}</span>\r\n </div>\r\n </div>\r\n }\r\n\r\n</div>\r\n", styles: [".item-line-editor{background:#fff;border-radius:8px;padding:20px}.title{font-size:20px;margin-bottom:4px;font-weight:600}.subtitle{color:#777;font-size:13px;margin-bottom:16px}.table-header{display:grid;grid-template-columns:20% 25% 15% 10% 15% 15%;font-weight:600;font-size:13px;padding-bottom:8px;border-bottom:2px solid var(--primary-color-3nd);margin-bottom:12px}.col{padding-left:4px}.table-body .table-row{display:grid;padding:10px 0;border-bottom:1px solid #e6e6e6}.row-inputs{padding-right:10px}.row-actions{display:flex;flex-direction:row;align-items:center;justify-content:flex-end;gap:6px;margin-top:24px}.line-total{font-weight:600;font-size:14px}.save-btn,.edit-btn,.delete-btn{width:114px!important;height:32px!important;border-radius:9999px!important;border:1px solid var(--primary-color-3nd);background:#fff}.delete-btn{color:#ce3b3a!important;border:1px solid #ce3b3a!important}.add-item{margin-top:16px}.totals-box{margin-top:20px;width:400px}.total-row{display:flex;justify-content:space-between;font-size:15px;margin:6px 0}.grand{font-family:lusail-bold,sans-serif!important}.total-row .label{font-weight:500;color:#333}.total-row .value{font-weight:600}.divider{border-top:1px solid #e0e0e0;margin:10px 0}.red{color:#d9534f}.green{color:#0c7d5e;font-weight:700}.grand .value,.button-text span{font-size:16px}.button-text mat-icon{font-size:16px!important}.dataNotFound{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;text-align:center}.dataNotFound__icon{color:var(--primary-color-3nd);font-size:24px;height:24px;width:24px;margin-bottom:8px}.dataNotFound__title{color:#6a6a6a;font-size:18px;font-weight:700;margin-bottom:4px}.dataNotFound__subtitle{color:#6a6a6a;font-size:16px;font-weight:400}\n"] }]
|
|
262
|
+
}], propDecorators: { noDataFoundIcon: [{
|
|
263
|
+
type: Input
|
|
264
|
+
}], noDataFoundTitle: [{
|
|
265
|
+
type: Input
|
|
266
|
+
}], noDataFoundSubtitle: [{
|
|
267
|
+
type: Input
|
|
268
|
+
}], pageInfo: [{
|
|
269
|
+
type: Input
|
|
270
|
+
}], columnHeaderWidths: [{
|
|
271
|
+
type: Input
|
|
272
|
+
}], title: [{
|
|
273
|
+
type: Input
|
|
274
|
+
}], subtitle: [{
|
|
275
|
+
type: Input
|
|
276
|
+
}], allowAdd: [{
|
|
277
|
+
type: Input
|
|
278
|
+
}], allowDelete: [{
|
|
279
|
+
type: Input
|
|
280
|
+
}], editable: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], currency: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], fields: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], items: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], itemsChange: [{
|
|
289
|
+
type: Output
|
|
290
|
+
}], itemSaved: [{
|
|
291
|
+
type: Output
|
|
292
|
+
}], itemDeleted: [{
|
|
293
|
+
type: Output
|
|
294
|
+
}], totalsChange: [{
|
|
295
|
+
type: Output
|
|
296
|
+
}], editStateChange: [{
|
|
297
|
+
type: Output
|
|
298
|
+
}] } });
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1saW5lLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2l0ZW0tbGluZS1lZGl0b3IvaXRlbS1saW5lLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2l0ZW0tbGluZS1lZGl0b3IvaXRlbS1saW5lLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQWtCLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBR3ZGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBbUJwRCxNQUFNLE9BQU8sdUJBQXVCO0lBaEJwQztRQXlCVyxhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIsV0FBTSxHQUFnQixFQUFFLENBQUM7UUFLekIsVUFBSyxHQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFdEMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQzdD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IE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1zTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcclxuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xyXG5pbXBvcnQge0Jhc2VGb3JtQ2FudmFzQ29tcG9uZW50fSBmcm9tIFwiLi4vYmFzZS1mb3JtLWNhbnZhcy9iYXNlLWZvcm0tY2FudmFzLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0ZpZWxkSW5mbywgRU1QVFlfUEFHRV9JTkZPLCBQYWdlSW5mb30gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtGb3JtR3JvdXB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHtMaW5lSXRlbX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvbGluZS1pdGVtLm1vZGVsXCI7XHJcbmltcG9ydCB7SXRlbXNUb3RhbH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvaXRlbXMtdG90YWwubW9kZWxcIjtcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtaXRlbS1saW5lLWVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2l0ZW0tbGluZS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgQmFzZUZvcm1DYW52YXNDb21wb25lbnQsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGVcclxuICBdLFxyXG4gIHN0eWxlVXJsczogWycuL2l0ZW0tbGluZS1lZGl0b3IuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBJdGVtTGluZUVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgbm9EYXRhRm91bmRJY29uOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbm9EYXRhRm91bmRUaXRsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG5vRGF0YUZvdW5kU3VidGl0bGU6IHN0cmluZztcclxuXHJcbiAgQElucHV0KCkgcGFnZUluZm86IFBhZ2VJbmZvO1xyXG4gIEBJbnB1dCgpIGNvbHVtbkhlYWRlcldpZHRoczogc3RyaW5nW107XHJcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcclxuICBASW5wdXQoKSBzdWJ0aXRsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGFsbG93QWRkOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBhbGxvd0RlbGV0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgZWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGN1cnJlbmN5OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZmllbGRzOiBGaWVsZEluZm9bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGJhc2VGaWVsZHNTbmFwc2hvdDogRmllbGRJbmZvW10gfCB1bmRlZmluZWQ7XHJcblxyXG5cclxuICBASW5wdXQoKSBpdGVtczogTGluZUl0ZW1bXSA9IFt0aGlzLmJsYW5rSXRlbSgpXTtcclxuXHJcbiAgQE91dHB1dCgpIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMaW5lSXRlbVtdPigpO1xyXG4gIEBPdXRwdXQoKSBpdGVtU2F2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaW5kZXg6IG51bWJlciwgaXRlbTogYW55IH0+KCk7XHJcbiAgQE91dHB1dCgpIGl0ZW1EZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGluZGV4OiBudW1iZXIgfT4oKTtcclxuICBAT3V0cHV0KCkgdG90YWxzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJdGVtc1RvdGFsPigpO1xyXG4gIEBPdXRwdXQoKSBlZGl0U3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaW5kZXg6IG51bWJlciwgZWRpdGluZzogYm9vbGVhbiB9PigpO1xyXG4gIGZvcm1SZWZzOiAoRm9ybUdyb3VwIHwgdW5kZWZpbmVkKVtdID0gW107XHJcblxyXG4gIGVkaXRpbmc6IGJvb2xlYW5bXSA9IFt0cnVlXTtcclxuICBub0RhdGFGb3VuZDogYm9vbGVhbiA9IGZhbHNlXHJcblxyXG4gIGdldCBoZWFkZXJGaWVsZHMoKTogRmllbGRJbmZvW10ge1xyXG4gICAgcmV0dXJuICh0aGlzLmZpZWxkcyB8fCBbXSkuZmlsdGVyKGYgPT4gZi52aXNpYmxlICYmIGYucm93ID09PSAxICYmIGYudHlwZSAhPT0gJ3NwYWNlcicpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0ludmFsaWRFZGl0aW5nRm9ybSgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5mb3JtUmVmcyB8fCAhdGhpcy5lZGl0aW5nKSByZXR1cm4gZmFsc2U7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZm9ybVJlZnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZnJtID0gdGhpcy5mb3JtUmVmc1tpXTtcclxuICAgICAgaWYgKHRoaXMuZWRpdGluZ1tpXSAmJiBmcm0gJiYgZnJtLmludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhbkFkZE5ldygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5oYXNJbnZhbGlkRWRpdGluZ0Zvcm07XHJcbiAgfVxyXG5cclxuICBjYW5TYXZlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZybSA9IHRoaXMuZm9ybVJlZnM/LltpbmRleF07XHJcbiAgICBpZiAoIXRoaXMuZWRpdGluZz8uW2luZGV4XSkgcmV0dXJuIHRydWU7XHJcbiAgICByZXR1cm4gISFmcm0gJiYgZnJtLnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgbGFiZWxPZihmaWVsZDogRmllbGRJbmZvKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNvbmZpZ3VyZWRLZXkgPSBmaWVsZC5sYWJlbCA/IGZpZWxkLmxhYmVsIDogZmllbGQucHJvcGVydHk7XHJcbiAgICByZXR1cm4gY29uZmlndXJlZEtleS5zdGFydHNXaXRoKHRoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbilcclxuICAgICAgPyBjb25maWd1cmVkS2V5XHJcbiAgICAgIDogYCR7dGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9ufS4ke2NvbmZpZ3VyZWRLZXl9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmxhbmtJdGVtKCkge1xyXG4gICAgcmV0dXJuIHsgZ3RpbkNvZGU6ICcnLCBkZXNjcmlwdGlvbjogJycsIHVuaXRQcmljZTogMCwgcXR5OiAxLCBkaXNjb3VudDogMCwgdG90YWw6IDAgfTtcclxuICB9XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10gJiYgY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgY29uc3QgbGVuID0gKHRoaXMuaXRlbXMgfHwgW10pLmxlbmd0aDtcclxuICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IGxlbiA8PSAwO1xyXG4gICAgICBpZiAoY2hhbmdlc1snaXRlbXMnXS5maXJzdENoYW5nZSkge1xyXG4gICAgICAgIHRoaXMuZm9ybVJlZnMgPSBuZXcgQXJyYXkobGVuKS5maWxsKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nID0gbGVuID4gMCA/IG5ldyBBcnJheShsZW4pLmZpbGwoZmFsc2UpIDogW3RydWVdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG9sZExlbiA9IHRoaXMuZWRpdGluZz8ubGVuZ3RoIHx8IDA7XHJcblxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZm9ybVJlZnMpIHRoaXMuZm9ybVJlZnMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5mb3JtUmVmcy5sZW5ndGggPiBsZW4pIHtcclxuICAgICAgICAgIHRoaXMuZm9ybVJlZnMgPSB0aGlzLmZvcm1SZWZzLnNsaWNlKDAsIGxlbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHdoaWxlICh0aGlzLmZvcm1SZWZzLmxlbmd0aCA8IGxlbikgdGhpcy5mb3JtUmVmcy5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmVkaXRpbmcpIHRoaXMuZWRpdGluZyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRpbmcubGVuZ3RoID4gbGVuKSB7XHJcbiAgICAgICAgICB0aGlzLmVkaXRpbmcgPSB0aGlzLmVkaXRpbmcuc2xpY2UoMCwgbGVuKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZWRpdGluZy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRpbmdbaV0gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChvbGRMZW4gPT09IDAgJiYgbGVuID4gMCAmJiB0aGlzLmVkaXRpbmdbMF0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5lZGl0aW5nWzBdID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lbWl0VG90YWxzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snZmllbGRzJ10gJiYgY2hhbmdlc1snZmllbGRzJ10uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMuYmFzZUZpZWxkc1NuYXBzaG90ID0gKHRoaXMuZmllbGRzIHx8IFtdKS5tYXAoZiA9PiAoey4uLmZ9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZvcm1VcGRhdGVkKGZvcm06IEZvcm1Hcm91cCwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgZGlzY291bnRDdHJsID0gZm9ybS5nZXQoJ2Rpc2NvdW50Jyk7XHJcblxyXG4gICAgaWYgKGRpc2NvdW50Q3RybCkge1xyXG5cclxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBkaXNjb3VudEN0cmwudmFsaWRhdG9yID8gW2Rpc2NvdW50Q3RybC52YWxpZGF0b3JdIDogW107XHJcbiAgICAgIGRpc2NvdW50Q3RybC5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAuLi5leGlzdGluZyxcclxuICAgICAgICB0aGlzLmRpc2NvdW50VmFsaWRhdG9yKGluZGV4KVxyXG4gICAgICBdKTtcclxuXHJcbiAgICAgIGRpc2NvdW50Q3RybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZvcm1SZWZzW2luZGV4XSA9IGZvcm07XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBlbWl0dGVkSXRlbXMgPSB0aGlzLml0ZW1zLm1hcCgoaXQsIGkpID0+IHtcclxuICAgICAgICBpZiAoaSAhPT0gaW5kZXgpIHJldHVybiBpdDtcclxuICAgICAgICBjb25zdCB2ID0gdGhpcy5nZXRDdXJyZW50VmFsdWVzKGkpIHx8IGl0IHx8IHt9O1xyXG4gICAgICAgIGNvbnN0IHVwID0gTnVtYmVyKHY/LnVuaXRQcmljZSB8fCAwKTtcclxuICAgICAgICBjb25zdCBxID0gTnVtYmVyKHY/LnF0eSB8fCAwKTtcclxuICAgICAgICBjb25zdCBkaXNjID0gTnVtYmVyKHY/LmRpc2NvdW50IHx8IDApO1xyXG4gICAgICAgIGNvbnN0IHRvdGFsID0gTWF0aC5tYXgoMCwgdXAgKiBxIC0gZGlzYyk7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uaXQsIC4uLnYsIHRvdGFsIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLml0ZW1zQ2hhbmdlLmVtaXQoZW1pdHRlZEl0ZW1zKTtcclxuICAgIH0gY2F0Y2ggKF9lKSB7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy5lbWl0VG90YWxzKCk7XHJcbiAgfVxyXG5cclxuICBhZGROZXdJdGVtKCkge1xyXG4gICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuYmxhbmtJdGVtKCkpO1xyXG4gICAgdGhpcy5mb3JtUmVmcy5wdXNoKHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmVkaXRpbmcucHVzaCh0cnVlKTtcclxuXHJcbiAgICB0aGlzLnJlc3RvcmVGaWVsZHNGcm9tU25hcHNob3QoKTtcclxuICAgIHRoaXMuaXRlbXNDaGFuZ2UuZW1pdChbLi4udGhpcy5pdGVtc10pO1xyXG4gICAgdGhpcy5lZGl0U3RhdGVDaGFuZ2UuZW1pdCh7IGluZGV4OiB0aGlzLml0ZW1zLmxlbmd0aCAtIDEsIGVkaXRpbmc6IHRydWUgfSk7XHJcbiAgICB0aGlzLmVtaXRUb3RhbHMoKTtcclxuICB9XHJcblxyXG4gIHNhdmVSb3coaW5kZXg6IG51bWJlcikge1xyXG5cclxuICAgIGNvbnN0IGZybSA9IHRoaXMuZm9ybVJlZnM/LltpbmRleF07XHJcbiAgICBpZiAodGhpcy5lZGl0aW5nW2luZGV4XSAmJiBmcm0gJiYgZnJtLmludmFsaWQpIHtcclxuXHJcbiAgICAgIE9iamVjdC52YWx1ZXMoZnJtLmNvbnRyb2xzKS5mb3JFYWNoKGMgPT4gYy5tYXJrQXNUb3VjaGVkKCkpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB2ID0gdGhpcy5nZXRDdXJyZW50VmFsdWVzKGluZGV4KTtcclxuICAgIGlmICghdikgcmV0dXJuO1xyXG4gICAgdGhpcy5pdGVtc1tpbmRleF0gPSB7IC4uLnYsIHRvdGFsOiB0aGlzLmNhbGNMaW5lVG90YWwoaW5kZXgpIH07XHJcblxyXG4gICAgdGhpcy5lZGl0aW5nW2luZGV4XSA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuc2V0RmllbGRzUmVhZG9ubHkodHJ1ZSk7XHJcbiAgICB0aGlzLml0ZW1zQ2hhbmdlLmVtaXQoWy4uLnRoaXMuaXRlbXNdKTtcclxuICAgIHRoaXMuaXRlbVNhdmVkLmVtaXQoeyBpbmRleCwgaXRlbTogdGhpcy5pdGVtc1tpbmRleF0gfSk7XHJcbiAgICB0aGlzLmVkaXRTdGF0ZUNoYW5nZS5lbWl0KHsgaW5kZXgsIGVkaXRpbmc6IGZhbHNlIH0pO1xyXG4gICAgdGhpcy5lbWl0VG90YWxzKCk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVJdGVtKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5pdGVtcy5sZW5ndGgpIHJldHVybjtcclxuICAgIHRoaXMuaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuZm9ybVJlZnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuZWRpdGluZy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgIHRoaXMuaXRlbXNDaGFuZ2UuZW1pdChbLi4udGhpcy5pdGVtc10pO1xyXG4gICAgdGhpcy5pdGVtRGVsZXRlZC5lbWl0KHsgaW5kZXggfSk7XHJcbiAgICB0aGlzLmVtaXRUb3RhbHMoKTtcclxuICB9XHJcblxyXG4gIGNsZWFyQWxsKCkge1xyXG4gICAgdGhpcy5pdGVtcyA9IFt0aGlzLmJsYW5rSXRlbSgpXTtcclxuICAgIHRoaXMuZm9ybVJlZnMgPSBbdW5kZWZpbmVkXTtcclxuICAgIHRoaXMuZWRpdGluZyA9IFt0cnVlXTtcclxuICAgIHRoaXMuaXRlbXNDaGFuZ2UuZW1pdChbLi4udGhpcy5pdGVtc10pO1xyXG4gICAgdGhpcy5lbWl0VG90YWxzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50VmFsdWVzKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGlzRWRpdGluZyA9IHRoaXMuZWRpdGluZ1tpbmRleF07XHJcbiAgICBjb25zdCBmcm0gPSB0aGlzLmZvcm1SZWZzW2luZGV4XTtcclxuXHJcbiAgICBjb25zdCBiYXNlID0gdGhpcy5pdGVtc1tpbmRleF0gfHwge307XHJcbiAgICBjb25zdCBzcmMgPSAoaXNFZGl0aW5nICYmIGZybSkgPyB7IC4uLmJhc2UsIC4uLmZybS52YWx1ZSB9IDogeyAuLi5iYXNlIH07XHJcbiAgICBpZiAoIXNyYykgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCB2YWw6IGFueSA9IHsgLi4uc3JjIH07XHJcbiAgICB2YWwudW5pdFByaWNlID0gdmFsLnVuaXRQcmljZSA9PT0gbnVsbCB8fCB2YWwudW5pdFByaWNlID09PSAnJyA/IG51bGwgOiBOdW1iZXIodmFsLnVuaXRQcmljZSk7XHJcbiAgICB2YWwucXR5ID0gdmFsLnF0eSA9PT0gbnVsbCB8fCB2YWwucXR5ID09PSAnJyA/IG51bGwgOiBOdW1iZXIodmFsLnF0eSk7XHJcbiAgICB2YWwuZGlzY291bnQgPSB2YWwuZGlzY291bnQgPT09IG51bGwgfHwgdmFsLmRpc2NvdW50ID09PSAnJyA/IG51bGwgOiBOdW1iZXIodmFsLmRpc2NvdW50KTtcclxuICAgIHJldHVybiB2YWw7XHJcbiAgfVxyXG5cclxuICBjYWxjTGluZVRvdGFsKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXRDdXJyZW50VmFsdWVzKGluZGV4KTtcclxuICAgIGlmICghdmFsKSByZXR1cm4gTnVtYmVyKHRoaXMuaXRlbXNbaW5kZXhdPy50b3RhbCB8fCAwKTtcclxuICAgIHJldHVybiBNYXRoLm1heCgwLCAodmFsLnVuaXRQcmljZSB8fCAwKSAqICh2YWwucXR5IHx8IDApIC0gKHZhbC5kaXNjb3VudCB8fCAwKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3VidG90YWwoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zLnJlZHVjZSgocywgX2l0LCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHYgPSB0aGlzLmdldEN1cnJlbnRWYWx1ZXMoaSk7XHJcbiAgICAgIGNvbnN0IHVwID0gTnVtYmVyKHY/LnVuaXRQcmljZSB8fCAwKTtcclxuICAgICAgY29uc3QgcSA9IE51bWJlcih2Py5xdHkgfHwgMCk7XHJcbiAgICAgIHJldHVybiBzICsgKHVwICogcSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGdldCBkaXNjb3VudFRvdGFsKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5yZWR1Y2UoKHMsIF9pdCwgaSkgPT4ge1xyXG4gICAgICBjb25zdCB2ID0gdGhpcy5nZXRDdXJyZW50VmFsdWVzKGkpO1xyXG4gICAgICByZXR1cm4gcyArIE51bWJlcih2Py5kaXNjb3VudCB8fCAwKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGdyYW5kVG90YWwoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLml0ZW1zLnJlZHVjZSgocywgX2l0LCBpKSA9PiBzICsgdGhpcy5jYWxjTGluZVRvdGFsKGkpLCAwKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyLCBfaXRlbTogYW55KSB7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBlZGl0Um93KGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZWRpdGluZ1tpbmRleF0gPSB0cnVlO1xyXG4gICAgdGhpcy5yZXN0b3JlRmllbGRzRnJvbVNuYXBzaG90KCk7XHJcbiAgICB0aGlzLmVkaXRTdGF0ZUNoYW5nZS5lbWl0KHsgaW5kZXgsIGVkaXRpbmc6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRUb3RhbHMoKSB7XHJcbiAgICB0aGlzLnRvdGFsc0NoYW5nZS5lbWl0KHtcclxuICAgICAgc3VidG90YWw6IHRoaXMuc3VidG90YWwsXHJcbiAgICAgIGRpc2NvdW50OiB0aGlzLmRpc2NvdW50VG90YWwsXHJcbiAgICAgIGdyYW5kVG90YWw6IHRoaXMuZ3JhbmRUb3RhbFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpZWxkc1JlYWRvbmx5KHN0YXRlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpZWxkcyA9ICh0aGlzLmZpZWxkcyB8fCBbXSkubWFwKGYgPT4gKHsgLi4uZiwgcmVhZG9ubHk6IHN0YXRlIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzdG9yZUZpZWxkc0Zyb21TbmFwc2hvdCgpIHtcclxuICAgIGlmICh0aGlzLmJhc2VGaWVsZHNTbmFwc2hvdCAmJiB0aGlzLmJhc2VGaWVsZHNTbmFwc2hvdC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5maWVsZHMgPSB0aGlzLmJhc2VGaWVsZHNTbmFwc2hvdC5tYXAoZiA9PiAoey4uLmZ9KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldEZpZWxkc1JlYWRvbmx5KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBncmlkVGVtcGxhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5IZWFkZXJXaWR0aHMuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNjb3VudFZhbGlkYXRvcihpbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEN1cnJlbnRWYWx1ZXMoaW5kZXgpO1xyXG4gICAgICBpZiAoIXZhbCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCB0b3RhbEJlZm9yZURpc2NvdW50ID0gKHZhbC51bml0UHJpY2UgPz8gMCkgKiAodmFsLnF0eSA/PyAwKTtcclxuICAgICAgY29uc3QgZGlzY291bnQgPSB2YWwuZGlzY291bnQgPz8gbnVsbDtcclxuXHJcbiAgICAgIGlmIChkaXNjb3VudCAhPSBudWxsICYmIGRpc2NvdW50ID4gdG90YWxCZWZvcmVEaXNjb3VudCkge1xyXG4gICAgICAgIHJldHVybiB7IGRpc2NvdW50VG9vSGlnaDogdHJ1ZSB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiaXRlbS1saW5lLWVkaXRvclwiPlxyXG5cclxuICA8aDMgY2xhc3M9XCJ0aXRsZVwiPnt7IHRpdGxlIHwgdHJhbnNsYXRlIH19PC9oMz5cclxuICA8cCBjbGFzcz1cInN1YnRpdGxlXCI+e3sgc3VidGl0bGUgfCB0cmFuc2xhdGUgfX08L3A+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIiBbbmdTdHlsZV09XCJ7ICdncmlkLXRlbXBsYXRlLWNvbHVtbnMnOiBncmlkVGVtcGxhdGUgfVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZiBvZiBoZWFkZXJGaWVsZHM7IGxldCBpZHggPSBpbmRleFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAge3sgbGFiZWxPZihmKSAgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuICBAaWYgKCFub0RhdGFGb3VuZCkge1xyXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHlcIiAqbmdGb3I9XCJsZXQgaXQgb2YgaXRlbXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWlucHV0c1wiPlxyXG4gICAgICAgICAgPGFwcC1iYXNlLWZvcm0tY2FudmFzXHJcbiAgICAgICAgICAgIFtwYWdlSW5mb109XCJwYWdlSW5mb1wiXHJcbiAgICAgICAgICAgIFtmaWVsZHNdPVwiZmllbGRzXCJcclxuICAgICAgICAgICAgW2VkaXRhYmxlXT1cImVkaXRpbmdbaV1cIlxyXG4gICAgICAgICAgICBbZW1pdE9uVmFsdWVDaGFuZ2VzXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbaXRlbV09XCJpdFwiXHJcbiAgICAgICAgICAgIFtjdXJyZW5jeV09XCJjdXJyZW5jeVwiXHJcbiAgICAgICAgICAgIChmb3JtVXBkYXRlZCk9XCJvbkZvcm1VcGRhdGVkKCRldmVudCwgaSlcIj5cclxuICAgICAgICAgIDwvYXBwLWJhc2UtZm9ybS1jYW52YXM+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3ctYWN0aW9uc1wiPlxyXG5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1tpXVwiIG1hdC1zdHJva2VkLWJ1dHRvbiBjbGFzcz1cImJ0bi1ub25lLWJhY2tncm91bmQtcHJpbWFyeSBzYXZlLWJ0blwiIChjbGljayk9XCJzYXZlUm93KGkpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuU2F2ZShpKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7ICdpdGVtLWxpbmUuc2F2ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nW2ldICYmIGVkaXRhYmxlXCIgbWF0LXN0cm9rZWQtYnV0dG9uIGNsYXNzPVwiYnRuLW5vbmUtYmFja2dyb3VuZC1wcmltYXJ5IGVkaXQtYnRuXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0Um93KGkpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLXRleHRcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyAnaXRlbS1saW5lLmVkaXQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJhbGxvd0RlbGV0ZSAmJiBlZGl0YWJsZVwiIG1hdC1zdHJva2VkLWJ1dHRvbiBjbGFzcz1cImJ0bi1ub25lLWJhY2tncm91bmQtcHJpbWFyeSBkZWxldGUtYnRuXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVJdGVtKGkpXCIgdHlwZT1cImJ1dHRvblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8c3Bhbj57eyAnaXRlbS1saW5lLmRlbGV0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcbiAgQGlmIChub0RhdGFGb3VuZCkge1xyXG4gICAgPGRpdiBjbGFzcz1cImRhdGFOb3RGb3VuZCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJkYXRhTm90Rm91bmRfX2ljb25cIj57eyBub0RhdGFGb3VuZEljb24gfX08L21hdC1pY29uPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fdGl0bGVcIj57eyBub0RhdGFGb3VuZFRpdGxlIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRhdGFOb3RGb3VuZF9fc3VidGl0bGVcIj57eyBub0RhdGFGb3VuZFN1YnRpdGxlIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIH1cclxuICA8ZGl2IGNsYXNzPVwiYWRkLWl0ZW1cIiAqbmdJZj1cImFsbG93QWRkICYmIGVkaXRhYmxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXByaW1hcnktY29sb3ItM25kKVwiPjwvZGl2PlxyXG4gICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJidG4tbm9uZS1iYWNrZ3JvdW5kLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkTmV3SXRlbSgpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5BZGROZXdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XHJcbiAgICAgICAgPHNwYW4+ICB7eyAnaXRlbS1saW5lLmFkZE5ld0l0ZW0nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiAgQGlmICghbm9EYXRhRm91bmQpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ0b3RhbHMtYm94XCI+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidG90YWwtcm93XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdpdGVtLWxpbmUuZGlzY291bnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmFsdWUgcmVkXCI+e3sgZGlzY291bnRUb3RhbCB8IGN1cnJlbmN5OmN1cnJlbmN5IH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b3RhbC1yb3dcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ2l0ZW0tbGluZS5hbW91bnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmFsdWVcIj57eyBzdWJ0b3RhbCB8IGN1cnJlbmN5OmN1cnJlbmN5IH19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidG90YWwtcm93IGdyYW5kXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdpdGVtLWxpbmUuZ3JhbmRUb3RhbCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZSBzdHJvbmcgZ3JlZW5cIj57eyBncmFuZFRvdGFsIHwgY3VycmVuY3k6Y3VycmVuY3kgfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
|