@mediusinc/mng-commons 1.4.0 → 1.5.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/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
- package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
- package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
- package/esm2020/lib/api/models/index.mjs +8 -8
- package/esm2020/lib/api/models/mappers.mjs +12 -12
- package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
- package/esm2020/lib/api/models/query-param.model.mjs +67 -67
- package/esm2020/lib/api/models/query-result.model.mjs +23 -23
- package/esm2020/lib/api/models/serialization.model.mjs +1 -1
- package/esm2020/lib/api/services/api.abstract.service.mjs +57 -57
- package/esm2020/lib/api/services/crud-api.abstract.service.mjs +74 -74
- package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +29 -29
- package/esm2020/lib/api/services/index.mjs +3 -3
- package/esm2020/lib/api/utils/index.mjs +2 -2
- package/esm2020/lib/api/utils/medius-rest.util.mjs +212 -212
- package/esm2020/lib/api/utils/object-serializer.util.mjs +247 -247
- package/esm2020/lib/components/action/action.component.mjs +277 -275
- package/esm2020/lib/components/action/editor/action-editor.component.mjs +302 -302
- package/esm2020/lib/components/action/index.mjs +4 -4
- package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +44 -44
- package/esm2020/lib/components/action/models/action-component.model.mjs +1 -1
- package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
- package/esm2020/lib/components/action/models/action-execution.model.mjs +248 -248
- package/esm2020/lib/components/action/models/index.mjs +4 -4
- package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +10 -10
- package/esm2020/lib/components/action/route/action-route.component.mjs +129 -129
- package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +299 -299
- package/esm2020/lib/components/form/date-range/date-range.component.mjs +108 -108
- package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +193 -193
- package/esm2020/lib/components/form/editor/form-editor.component.mjs +242 -242
- package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +38 -38
- package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +49 -49
- package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +44 -44
- package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +25 -25
- package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +149 -149
- package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +23 -23
- package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +185 -185
- package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +196 -196
- package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +153 -153
- package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
- package/esm2020/lib/components/form/formly/fields/index.mjs +10 -10
- package/esm2020/lib/components/form/formly/formly.config.mjs +211 -211
- package/esm2020/lib/components/form/formly/index.mjs +1 -1
- package/esm2020/lib/components/form/formly/models/formly-config.model.mjs +1 -1
- package/esm2020/lib/components/form/formly/models/formly-field.model.mjs +1 -1
- package/esm2020/lib/components/form/formly/models/index.mjs +2 -2
- package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +14 -14
- package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +82 -82
- package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
- package/esm2020/lib/components/form/index.mjs +4 -4
- package/esm2020/lib/components/form/models/field-action-context.model.mjs +1 -1
- package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
- package/esm2020/lib/components/form/models/form-editor.interface.mjs +1 -1
- package/esm2020/lib/components/form/models/index.mjs +2 -2
- package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
- package/esm2020/lib/components/layout/footer.component.mjs +16 -16
- package/esm2020/lib/components/layout/index.mjs +7 -7
- package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
- package/esm2020/lib/components/layout/menu-item.component.mjs +271 -271
- package/esm2020/lib/components/layout/menu.component.mjs +20 -20
- package/esm2020/lib/components/layout/services/index.mjs +1 -1
- package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +194 -194
- package/esm2020/lib/components/layout/topbar.component.mjs +64 -64
- package/esm2020/lib/components/layout/version.component.mjs +57 -57
- package/esm2020/lib/components/tableview/index.mjs +6 -6
- package/esm2020/lib/components/tableview/models/index.mjs +1 -1
- package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
- package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +146 -146
- package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +52 -52
- package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +119 -119
- package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +83 -83
- package/esm2020/lib/components/tableview/table/table.component.mjs +594 -594
- package/esm2020/lib/components/tableview/tableview.component.mjs +112 -112
- package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
- package/esm2020/lib/data-providers/editor.data-provider.mjs +36 -36
- package/esm2020/lib/data-providers/index.mjs +6 -6
- package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
- package/esm2020/lib/data-providers/table.data-provider.mjs +37 -37
- package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +23 -23
- package/esm2020/lib/data-providers/tableview.data-provider.mjs +44 -44
- package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +76 -76
- package/esm2020/lib/descriptors/action-button.descriptor.mjs +59 -59
- package/esm2020/lib/descriptors/action.descriptor.mjs +576 -576
- package/esm2020/lib/descriptors/column.descriptor.mjs +404 -404
- package/esm2020/lib/descriptors/editor.descriptor.mjs +289 -289
- package/esm2020/lib/descriptors/field-validation.descriptor.mjs +24 -24
- package/esm2020/lib/descriptors/field.descriptor.mjs +986 -986
- package/esm2020/lib/descriptors/filter.descriptor.mjs +367 -367
- package/esm2020/lib/descriptors/index.mjs +11 -11
- package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
- package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
- package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
- package/esm2020/lib/descriptors/model.descriptor.mjs +44 -44
- package/esm2020/lib/descriptors/table.descriptor.mjs +496 -496
- package/esm2020/lib/descriptors/tableview.descriptor.mjs +343 -343
- package/esm2020/lib/descriptors/types/action.type.mjs +25 -25
- package/esm2020/lib/descriptors/types/column.type.mjs +20 -20
- package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
- package/esm2020/lib/descriptors/types/field.type.mjs +55 -55
- package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
- package/esm2020/lib/descriptors/types/index.mjs +6 -6
- package/esm2020/lib/descriptors/types/table.type.mjs +26 -26
- package/esm2020/lib/directives/component.directive.mjs +43 -43
- package/esm2020/lib/directives/index.mjs +2 -2
- package/esm2020/lib/directives/template.directive.mjs +27 -27
- package/esm2020/lib/mng-commons.module.mjs +484 -484
- package/esm2020/lib/models/column-value.model.mjs +1 -1
- package/esm2020/lib/models/config.model.mjs +1 -1
- package/esm2020/lib/models/enum.model.mjs +1 -1
- package/esm2020/lib/models/error.model.mjs +1 -1
- package/esm2020/lib/models/index.mjs +9 -9
- package/esm2020/lib/models/menu.model.mjs +1 -1
- package/esm2020/lib/models/tableview-attr.model.mjs +1 -1
- package/esm2020/lib/models/user.model.mjs +1 -1
- package/esm2020/lib/models/version.model.mjs +1 -1
- package/esm2020/lib/models/view-container.model.mjs +1 -1
- package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
- package/esm2020/lib/pipes/class-map.pipe.mjs +21 -21
- package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
- package/esm2020/lib/pipes/enumerate-async.pipe.mjs +37 -37
- package/esm2020/lib/pipes/enumerate.pipe.mjs +54 -54
- package/esm2020/lib/pipes/getter.pipe.mjs +19 -19
- package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
- package/esm2020/lib/pipes/index.mjs +11 -11
- package/esm2020/lib/pipes/json-path.pipe.mjs +78 -78
- package/esm2020/lib/pipes/locale-default-row-class.pipe.mjs +25 -25
- package/esm2020/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +1 -1
- package/esm2020/lib/pipes/models/internal/index.mjs +1 -1
- package/esm2020/lib/pipes/parametrize.pipe.mjs +84 -84
- package/esm2020/lib/pipes/template.pipe.mjs +23 -23
- package/esm2020/lib/router/index.mjs +2 -2
- package/esm2020/lib/router/models/index.mjs +1 -1
- package/esm2020/lib/router/models/router.model.mjs +1 -1
- package/esm2020/lib/router/route-builder.mjs +425 -425
- package/esm2020/lib/router/tableview-route-builder.mjs +186 -186
- package/esm2020/lib/security/authorization.guard.mjs +25 -25
- package/esm2020/lib/security/authorization.service.mjs +46 -46
- package/esm2020/lib/security/authorization.util.mjs +15 -15
- package/esm2020/lib/security/index.mjs +3 -3
- package/esm2020/lib/security/model/authorization.type.mjs +7 -7
- package/esm2020/lib/security/model/index.mjs +3 -3
- package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
- package/esm2020/lib/security/model/permissions.model.mjs +86 -86
- package/esm2020/lib/services/action-executor.service.mjs +554 -554
- package/esm2020/lib/services/commons.service.mjs +460 -460
- package/esm2020/lib/services/configuration.service.mjs +141 -141
- package/esm2020/lib/services/error-mapper.service.mjs +13 -13
- package/esm2020/lib/services/index.mjs +6 -6
- package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
- package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
- package/esm2020/lib/services/internal/index.mjs +2 -2
- package/esm2020/lib/services/navigation.service.mjs +47 -47
- package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
- package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
- package/esm2020/lib/services/providers/index.mjs +2 -2
- package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
- package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
- package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
- package/esm2020/lib/services/tokens/index.mjs +4 -4
- package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
- package/esm2020/lib/services/version.service.mjs +38 -38
- package/esm2020/lib/services/view-container.component.service.mjs +54 -54
- package/esm2020/lib/styles/button-style.builder.mjs +164 -164
- package/esm2020/lib/styles/index.mjs +2 -2
- package/esm2020/lib/styles/models/index.mjs +2 -2
- package/esm2020/lib/styles/models/style-level.enum.mjs +11 -11
- package/esm2020/lib/styles/models/style-size.enum.mjs +8 -8
- package/esm2020/lib/styles/styles.util.mjs +41 -41
- package/esm2020/lib/types/i18n.type.mjs +2 -0
- package/esm2020/lib/types/index.mjs +4 -3
- package/esm2020/lib/types/type.decorator.mjs +21 -21
- package/esm2020/lib/types/type.model.mjs +1 -1
- package/esm2020/lib/utils/action-data-provider.util.mjs +144 -144
- package/esm2020/lib/utils/date.util.mjs +117 -117
- package/esm2020/lib/utils/editor-formly.util.mjs +287 -287
- package/esm2020/lib/utils/enum.util.mjs +81 -81
- package/esm2020/lib/utils/export.util.mjs +19 -19
- package/esm2020/lib/utils/i18n.util.mjs +276 -233
- package/esm2020/lib/utils/index.mjs +10 -10
- package/esm2020/lib/utils/model.util.mjs +68 -68
- package/esm2020/lib/utils/notification.util.mjs +50 -50
- package/esm2020/lib/utils/route.util.mjs +23 -23
- package/esm2020/lib/utils/string.util.mjs +26 -26
- package/esm2020/lib/utils/tableview.util.mjs +159 -159
- package/esm2020/lib/utils/type.util.mjs +92 -92
- package/esm2020/mediusinc-mng-commons.mjs +4 -4
- package/esm2020/public-api.mjs +54 -54
- package/fesm2015/mediusinc-mng-commons.mjs +13908 -13863
- package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
- package/fesm2020/mediusinc-mng-commons.mjs +13745 -13700
- package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/api/models/builders/query-param.builder.d.ts +13 -13
- package/lib/api/models/filter-match-type.model.d.ts +23 -23
- package/lib/api/models/filter-param.model.d.ts +23 -23
- package/lib/api/models/index.d.ts +8 -8
- package/lib/api/models/mappers.d.ts +6 -6
- package/lib/api/models/query-mode.model.d.ts +16 -16
- package/lib/api/models/query-param.model.d.ts +31 -31
- package/lib/api/models/query-result.model.d.ts +24 -24
- package/lib/api/models/serialization.model.d.ts +8 -8
- package/lib/api/services/api.abstract.service.d.ts +24 -24
- package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
- package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
- package/lib/api/services/index.d.ts +3 -3
- package/lib/api/utils/index.d.ts +2 -2
- package/lib/api/utils/medius-rest.util.d.ts +16 -16
- package/lib/api/utils/object-serializer.util.d.ts +33 -33
- package/lib/components/action/action.component.d.ts +79 -79
- package/lib/components/action/editor/action-editor.component.d.ts +69 -69
- package/lib/components/action/index.d.ts +4 -4
- package/lib/components/action/localization/data-language-dropdown.component.d.ts +25 -25
- package/lib/components/action/models/action-component.model.d.ts +15 -15
- package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
- package/lib/components/action/models/action-execution.model.d.ts +135 -135
- package/lib/components/action/models/index.d.ts +4 -4
- package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -10
- package/lib/components/action/route/action-route.component.d.ts +31 -31
- package/lib/components/form/autocomplete/autocomplete.component.d.ts +61 -61
- package/lib/components/form/date-range/date-range.component.d.ts +28 -28
- package/lib/components/form/dropdown/dropdown.component.d.ts +52 -52
- package/lib/components/form/editor/form-editor.component.d.ts +52 -52
- package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +13 -13
- package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +16 -16
- package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +15 -15
- package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +14 -14
- package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +29 -29
- package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +11 -11
- package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +46 -46
- package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +24 -24
- package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
- package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +7 -7
- package/lib/components/form/formly/fields/index.d.ts +10 -10
- package/lib/components/form/formly/formly.config.d.ts +14 -14
- package/lib/components/form/formly/index.d.ts +1 -1
- package/lib/components/form/formly/models/formly-config.model.d.ts +11 -11
- package/lib/components/form/formly/models/formly-field.model.d.ts +16 -16
- package/lib/components/form/formly/models/index.d.ts +2 -2
- package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +6 -6
- package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +11 -11
- package/lib/components/form/formly/wrappers/index.d.ts +2 -2
- package/lib/components/form/index.d.ts +4 -4
- package/lib/components/form/models/field-action-context.model.d.ts +17 -17
- package/lib/components/form/models/form-editor.event.d.ts +37 -37
- package/lib/components/form/models/form-editor.interface.d.ts +10 -10
- package/lib/components/form/models/index.d.ts +2 -2
- package/lib/components/layout/breadcrumb.component.d.ts +8 -8
- package/lib/components/layout/footer.component.d.ts +9 -9
- package/lib/components/layout/index.d.ts +7 -7
- package/lib/components/layout/main-layout.component.d.ts +20 -20
- package/lib/components/layout/menu-item.component.d.ts +52 -52
- package/lib/components/layout/menu.component.d.ts +10 -10
- package/lib/components/layout/services/index.d.ts +1 -1
- package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
- package/lib/components/layout/topbar.component.d.ts +28 -28
- package/lib/components/layout/version.component.d.ts +19 -19
- package/lib/components/tableview/index.d.ts +6 -6
- package/lib/components/tableview/models/index.d.ts +1 -1
- package/lib/components/tableview/models/table.event.d.ts +17 -17
- package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +33 -33
- package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
- package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +38 -38
- package/lib/components/tableview/table/column-value/column-value.component.d.ts +35 -35
- package/lib/components/tableview/table/table.component.d.ts +115 -115
- package/lib/components/tableview/tableview.component.d.ts +48 -48
- package/lib/data-providers/base.data-provider.d.ts +14 -14
- package/lib/data-providers/editor.data-provider.d.ts +25 -25
- package/lib/data-providers/index.d.ts +6 -6
- package/lib/data-providers/lookup.data-provider.d.ts +14 -14
- package/lib/data-providers/table.data-provider.d.ts +27 -27
- package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -8
- package/lib/data-providers/tableview.data-provider.d.ts +33 -33
- package/lib/descriptors/action/action-confirmation.descriptor.d.ts +36 -36
- package/lib/descriptors/action-button.descriptor.d.ts +22 -22
- package/lib/descriptors/action.descriptor.d.ts +223 -223
- package/lib/descriptors/column.descriptor.d.ts +130 -130
- package/lib/descriptors/editor.descriptor.d.ts +116 -116
- package/lib/descriptors/field-validation.descriptor.d.ts +19 -19
- package/lib/descriptors/field.descriptor.d.ts +345 -345
- package/lib/descriptors/filter.descriptor.d.ts +118 -118
- package/lib/descriptors/index.d.ts +11 -11
- package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
- package/lib/descriptors/interfaces/index.d.ts +2 -2
- package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
- package/lib/descriptors/model.descriptor.d.ts +18 -18
- package/lib/descriptors/table.descriptor.d.ts +193 -193
- package/lib/descriptors/tableview.descriptor.d.ts +129 -129
- package/lib/descriptors/types/action.type.d.ts +21 -21
- package/lib/descriptors/types/column.type.d.ts +18 -18
- package/lib/descriptors/types/editor.type.d.ts +6 -6
- package/lib/descriptors/types/field.type.d.ts +47 -47
- package/lib/descriptors/types/filter.type.d.ts +27 -27
- package/lib/descriptors/types/index.d.ts +6 -6
- package/lib/descriptors/types/table.type.d.ts +22 -22
- package/lib/directives/component.directive.d.ts +16 -16
- package/lib/directives/index.d.ts +2 -2
- package/lib/directives/template.directive.d.ts +13 -13
- package/lib/mng-commons.module.d.ts +99 -99
- package/lib/models/column-value.model.d.ts +4 -4
- package/lib/models/config.model.d.ts +40 -40
- package/lib/models/enum.model.d.ts +6 -6
- package/lib/models/error.model.d.ts +14 -14
- package/lib/models/index.d.ts +9 -9
- package/lib/models/menu.model.d.ts +30 -30
- package/lib/models/tableview-attr.model.d.ts +10 -10
- package/lib/models/user.model.d.ts +8 -8
- package/lib/models/version.model.d.ts +18 -18
- package/lib/models/view-container.model.d.ts +43 -43
- package/lib/pipes/boolean.pipe.d.ts +7 -7
- package/lib/pipes/class-map.pipe.d.ts +7 -7
- package/lib/pipes/enum.pipe.d.ts +8 -8
- package/lib/pipes/enumerate-async.pipe.d.ts +14 -14
- package/lib/pipes/enumerate.pipe.d.ts +21 -21
- package/lib/pipes/getter.pipe.d.ts +7 -7
- package/lib/pipes/i18n-property.pipe.d.ts +8 -8
- package/lib/pipes/index.d.ts +11 -11
- package/lib/pipes/json-path.pipe.d.ts +13 -13
- package/lib/pipes/locale-default-row-class.pipe.d.ts +10 -10
- package/lib/pipes/models/internal/enumrate-pipe-i18n.model.d.ts +5 -5
- package/lib/pipes/models/internal/index.d.ts +1 -1
- package/lib/pipes/parametrize.pipe.d.ts +13 -13
- package/lib/pipes/template.pipe.d.ts +10 -10
- package/lib/router/index.d.ts +2 -2
- package/lib/router/models/index.d.ts +1 -1
- package/lib/router/models/router.model.d.ts +33 -33
- package/lib/router/route-builder.d.ts +98 -98
- package/lib/router/tableview-route-builder.d.ts +37 -37
- package/lib/security/authorization.guard.d.ts +11 -11
- package/lib/security/authorization.service.d.ts +19 -19
- package/lib/security/authorization.util.d.ts +5 -5
- package/lib/security/index.d.ts +3 -3
- package/lib/security/model/authorization.type.d.ts +6 -6
- package/lib/security/model/index.d.ts +3 -3
- package/lib/security/model/permission-service.interface.d.ts +6 -6
- package/lib/security/model/permissions.model.d.ts +37 -37
- package/lib/services/action-executor.service.d.ts +149 -149
- package/lib/services/commons.service.d.ts +93 -93
- package/lib/services/configuration.service.d.ts +57 -57
- package/lib/services/error-mapper.service.d.ts +7 -7
- package/lib/services/index.d.ts +6 -6
- package/lib/services/internal/commons-init.provider.d.ts +3 -3
- package/lib/services/internal/commons-init.service.d.ts +16 -16
- package/lib/services/internal/index.d.ts +2 -2
- package/lib/services/navigation.service.d.ts +14 -14
- package/lib/services/providers/config-service.provider.d.ts +6 -6
- package/lib/services/providers/formly-config.provider.d.ts +4 -4
- package/lib/services/providers/index.d.ts +2 -2
- package/lib/services/tokens/browser-storage.token.d.ts +2 -2
- package/lib/services/tokens/commons-init.token.d.ts +3 -3
- package/lib/services/tokens/default-setting.token.d.ts +2 -2
- package/lib/services/tokens/index.d.ts +4 -4
- package/lib/services/tokens/module-config.token.d.ts +3 -3
- package/lib/services/version.service.d.ts +13 -13
- package/lib/services/view-container.component.service.d.ts +31 -31
- package/lib/styles/button-style.builder.d.ts +67 -67
- package/lib/styles/index.d.ts +2 -2
- package/lib/styles/models/index.d.ts +2 -2
- package/lib/styles/models/style-level.enum.d.ts +10 -10
- package/lib/styles/models/style-size.enum.d.ts +7 -7
- package/lib/styles/styles.util.d.ts +14 -14
- package/lib/types/i18n.type.d.ts +1 -0
- package/lib/types/index.d.ts +3 -2
- package/lib/types/type.decorator.d.ts +4 -4
- package/lib/types/type.model.d.ts +23 -23
- package/lib/utils/action-data-provider.util.d.ts +20 -20
- package/lib/utils/date.util.d.ts +7 -7
- package/lib/utils/editor-formly.util.d.ts +12 -12
- package/lib/utils/enum.util.d.ts +50 -50
- package/lib/utils/export.util.d.ts +5 -5
- package/lib/utils/i18n.util.d.ts +85 -56
- package/lib/utils/index.d.ts +10 -10
- package/lib/utils/model.util.d.ts +8 -8
- package/lib/utils/notification.util.d.ts +12 -12
- package/lib/utils/route.util.d.ts +4 -4
- package/lib/utils/string.util.d.ts +4 -4
- package/lib/utils/tableview.util.d.ts +40 -40
- package/lib/utils/type.util.d.ts +57 -57
- package/package.json +1 -1
- package/public-api.d.ts +34 -34
- package/version-info.json +5 -5
- package/mediusinc-mng-commons-1.4.0.tgz +0 -0
|
@@ -1,300 +1,300 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
|
|
2
|
-
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
-
import { AutoComplete } from 'primeng/autocomplete';
|
|
4
|
-
import { BehaviorSubject, of, switchMap } from 'rxjs';
|
|
5
|
-
import { first, map } from 'rxjs/operators';
|
|
6
|
-
import { MediusFilterMatchType, MediusQueryParamBuilder } from '../../../api/models';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@ngx-translate/core";
|
|
9
|
-
import * as i2 from "../formly/wrappers";
|
|
10
|
-
import * as i3 from "@angular/forms";
|
|
11
|
-
import * as i4 from "primeng/autocomplete";
|
|
12
|
-
import * as i5 from "@angular/common";
|
|
13
|
-
export const MNG_AUTOCOMPLETE_VALUE_ACCESSOR = {
|
|
14
|
-
provide: NG_VALUE_ACCESSOR,
|
|
15
|
-
useExisting: forwardRef(() => MngAutocompleteComponent),
|
|
16
|
-
multi: true
|
|
17
|
-
};
|
|
18
|
-
export class MngAutocompleteComponent {
|
|
19
|
-
constructor(injector, translate, formlyWrapper) {
|
|
20
|
-
this.injector = injector;
|
|
21
|
-
this.translate = translate;
|
|
22
|
-
this.formlyWrapper = formlyWrapper;
|
|
23
|
-
this.itemsLabelTranslate = false;
|
|
24
|
-
this.inlineSearch = false;
|
|
25
|
-
this.openOnFocus = false;
|
|
26
|
-
this.multiselect = false;
|
|
27
|
-
this.className = null;
|
|
28
|
-
this.dropdownClassName = null;
|
|
29
|
-
this.showClear = false;
|
|
30
|
-
this.autoClear = false;
|
|
31
|
-
this.selectFirst = false; //on every input field change return first given value (or null)
|
|
32
|
-
this.valueChangeEventEmitter = new EventEmitter();
|
|
33
|
-
this.isInited = false;
|
|
34
|
-
this.suggestionsSubject = new BehaviorSubject([]);
|
|
35
|
-
this.searchSubscription = null;
|
|
36
|
-
this.dataProviderService = null;
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
38
|
-
this.onChangeFn = () => { };
|
|
39
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
40
|
-
this.onTouchedFn = () => { };
|
|
41
|
-
this.autocompleteFormControl = new FormControl();
|
|
42
|
-
this.suggestions$ = this.suggestionsSubject.asObservable();
|
|
43
|
-
}
|
|
44
|
-
ngOnInit() {
|
|
45
|
-
this.setItemsAndDataProvider();
|
|
46
|
-
if (this.selectFirst) {
|
|
47
|
-
this.suggestionSubscription = this.suggestions$.subscribe(e => this.valueChangeEventEmitter.emit(e.length === 0 ? null : e[0]));
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
ngOnDestroy() {
|
|
51
|
-
this.searchSubscription?.unsubscribe();
|
|
52
|
-
this.suggestionSubscription?.unsubscribe();
|
|
53
|
-
}
|
|
54
|
-
onSearch(event) {
|
|
55
|
-
this.searchSubscription?.unsubscribe();
|
|
56
|
-
if (this.dataProvider) {
|
|
57
|
-
const queryParamBuilder = MediusQueryParamBuilder.create();
|
|
58
|
-
if (this.itemsLabelProperty) {
|
|
59
|
-
queryParamBuilder.withSort(this.itemsLabelProperty);
|
|
60
|
-
}
|
|
61
|
-
if (event.query && event.query.length > 0 && this.itemsLabelProperty) {
|
|
62
|
-
queryParamBuilder.withFilter(this.itemsLabelProperty, event.query, undefined, MediusFilterMatchType.StartsWith);
|
|
63
|
-
}
|
|
64
|
-
this.searchSubscription = this.getLookup(queryParamBuilder.build(), event.query).subscribe({
|
|
65
|
-
next: items => {
|
|
66
|
-
this.setSuggestionsFromItems(items, event.query);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
onSelect(value) {
|
|
72
|
-
let outputValue = value;
|
|
73
|
-
if (this.itemsValueProperty && typeof value === 'object') {
|
|
74
|
-
outputValue = value[this.itemsValueProperty];
|
|
75
|
-
}
|
|
76
|
-
this.onChangeFn(outputValue);
|
|
77
|
-
this.valueChangeEventEmitter.next(outputValue);
|
|
78
|
-
}
|
|
79
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
80
|
-
onFocus(event) {
|
|
81
|
-
if (this.openOnFocus) {
|
|
82
|
-
this.primeAutocomplete?.show();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
86
|
-
onBlur(event) {
|
|
87
|
-
this.formlyWrapper?.formControl?.markAsTouched();
|
|
88
|
-
}
|
|
89
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
90
|
-
onClear(event) {
|
|
91
|
-
this.onChangeFn();
|
|
92
|
-
this.valueChangeEventEmitter.next(null);
|
|
93
|
-
}
|
|
94
|
-
registerOnChange(fn) {
|
|
95
|
-
this.onChangeFn = fn;
|
|
96
|
-
}
|
|
97
|
-
registerOnTouched(fn) {
|
|
98
|
-
this.onTouchedFn = fn;
|
|
99
|
-
}
|
|
100
|
-
setDisabledState(isDisabled) {
|
|
101
|
-
if (isDisabled) {
|
|
102
|
-
this.autocompleteFormControl.disable();
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
this.autocompleteFormControl.enable();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
writeValue(value) {
|
|
109
|
-
this.setItemsAndDataProvider();
|
|
110
|
-
if (this.itemsValuePropertyInit && value != null && typeof value !== 'object') {
|
|
111
|
-
const defaultItem = { [this.itemsValuePropertyInit]: value };
|
|
112
|
-
if (this.itemsLabelProperty) {
|
|
113
|
-
defaultItem[this.itemsLabelProperty] = value;
|
|
114
|
-
}
|
|
115
|
-
const matchedItem = this.suggestionsSubject.value.find(i => i[this.itemsValuePropertyInit] === value);
|
|
116
|
-
if (matchedItem) {
|
|
117
|
-
this.autocompleteFormControl.setValue(matchedItem, { emitEvent: false });
|
|
118
|
-
}
|
|
119
|
-
else if (this.dataProvider) {
|
|
120
|
-
const queryParamBuilder = MediusQueryParamBuilder.create();
|
|
121
|
-
queryParamBuilder.withFilter(this.itemsValuePropertyInit, value, undefined, MediusFilterMatchType.Equals);
|
|
122
|
-
this.getLookup(queryParamBuilder.build())
|
|
123
|
-
.pipe(first())
|
|
124
|
-
.subscribe({
|
|
125
|
-
next: items => {
|
|
126
|
-
let isMatch = false;
|
|
127
|
-
if (items.length === 1) {
|
|
128
|
-
this.autocompleteFormControl.setValue(items[0]);
|
|
129
|
-
isMatch = true;
|
|
130
|
-
}
|
|
131
|
-
else if (items.length > 1) {
|
|
132
|
-
// for lookup data providers not using query params
|
|
133
|
-
const matchedItem = items.find(i => i[this.itemsValuePropertyInit] === value);
|
|
134
|
-
if (matchedItem) {
|
|
135
|
-
this.setAutocompleteValueFromWrite(matchedItem);
|
|
136
|
-
isMatch = true;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
if (!isMatch) {
|
|
140
|
-
this.setAutocompleteValueFromWrite(defaultItem);
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
error: () => {
|
|
144
|
-
this.setAutocompleteValueFromWrite(defaultItem);
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
this.setAutocompleteValueFromWrite(defaultItem);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
this.setAutocompleteValueFromWrite(value);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
setItemsAndDataProvider() {
|
|
157
|
-
if (this.isInited) {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
this.itemsLabelProperty = this.itemsLabelPropertyInit;
|
|
161
|
-
this.itemsValueProperty = this.itemsValuePropertyInit;
|
|
162
|
-
if (this.dataProvider) {
|
|
163
|
-
this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
|
|
164
|
-
if (this.itemsLabelTranslate) {
|
|
165
|
-
// setup translation properties
|
|
166
|
-
if (this.itemsLabelPropertyInit) {
|
|
167
|
-
this.itemsLabelProperty = `${this.itemsLabelPropertyInit}_i18n`;
|
|
168
|
-
}
|
|
169
|
-
else if (!this.itemsLabelProperty && !this.itemsValuePropertyInit) {
|
|
170
|
-
this.itemsLabelProperty = 'title_i18n';
|
|
171
|
-
this.itemsValueProperty = 'value';
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
throw new Error(`Invalid use with value (${this.itemsLabelPropertyInit}) and label (${this.itemsLabelPropertyInit}) property setup.`);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
console.warn(`Data provider should be provided for MngAutocompleteComponent.`);
|
|
180
|
-
}
|
|
181
|
-
if (this.openOnFocus) {
|
|
182
|
-
this.onSearch({ query: '' });
|
|
183
|
-
}
|
|
184
|
-
this.isInited = true;
|
|
185
|
-
}
|
|
186
|
-
setAutocompleteValueFromWrite(value) {
|
|
187
|
-
if (value && this.itemsLabelTranslate) {
|
|
188
|
-
value = this.i18nPopulateItems([value], this.translate.instant(this.i18nGetItemsKeys([value])))[0];
|
|
189
|
-
}
|
|
190
|
-
this.autocompleteFormControl.setValue(value, { emitEvent: false });
|
|
191
|
-
}
|
|
192
|
-
getLookup(qp, query) {
|
|
193
|
-
if (this.dataProvider) {
|
|
194
|
-
return this.dataProvider.lookup(qp, this.dataProviderService, query).pipe(switchMap(items => {
|
|
195
|
-
if (this.itemsLabelTranslate) {
|
|
196
|
-
const translatedItems = this.i18nGetItemsKeys(items);
|
|
197
|
-
if (translatedItems.length === 0) {
|
|
198
|
-
return of([]);
|
|
199
|
-
}
|
|
200
|
-
return this.translate.stream(translatedItems).pipe(map(translations => this.i18nPopulateItems(items, translations)));
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
return of(items);
|
|
204
|
-
}
|
|
205
|
-
}));
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
return of([]);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
i18nGetItemsKeys(items) {
|
|
212
|
-
return items.map(item => (typeof item === 'object' && this.itemsLabelPropertyInit ? item[this.itemsLabelPropertyInit] : item));
|
|
213
|
-
}
|
|
214
|
-
i18nPopulateItems(items, i18nMap) {
|
|
215
|
-
return items.map(item => {
|
|
216
|
-
if (typeof item === 'object' && this.itemsLabelPropertyInit) {
|
|
217
|
-
const label = item[this.itemsLabelPropertyInit];
|
|
218
|
-
const translation = i18nMap[label];
|
|
219
|
-
if (translation) {
|
|
220
|
-
return { ...item, [this.itemsLabelProperty]: translation };
|
|
221
|
-
}
|
|
222
|
-
return { ...item };
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
const translation = i18nMap[item];
|
|
226
|
-
return {
|
|
227
|
-
[this.itemsLabelProperty]: translation ?? item,
|
|
228
|
-
[this.itemsValueProperty]: item
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
setSuggestionsFromItems(items, query) {
|
|
234
|
-
if (this.inlineSearch) {
|
|
235
|
-
const queryLowerCase = query?.toLowerCase() ?? '';
|
|
236
|
-
const filteredItems = items.filter(i => {
|
|
237
|
-
let itemLabel = i;
|
|
238
|
-
if (this.itemsLabelProperty && typeof i === 'object') {
|
|
239
|
-
itemLabel = i[this.itemsLabelProperty];
|
|
240
|
-
}
|
|
241
|
-
if (itemLabel == null) {
|
|
242
|
-
return queryLowerCase == null || !queryLowerCase.length;
|
|
243
|
-
}
|
|
244
|
-
if (typeof itemLabel !== 'string') {
|
|
245
|
-
itemLabel = itemLabel.toString();
|
|
246
|
-
}
|
|
247
|
-
return itemLabel.toLowerCase().startsWith(queryLowerCase);
|
|
248
|
-
});
|
|
249
|
-
this.suggestionsSubject.next([...filteredItems]);
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
this.suggestionsSubject.next([...items]);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
MngAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAutocompleteComponent, deps: [{ token: i0.Injector }, { token: i1.TranslateService }, { token: i2.MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
257
|
-
MngAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngAutocompleteComponent, selector: "mng-autocomplete", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", inlineSearch: "inlineSearch", openOnFocus: "openOnFocus", multiselect: "multiselect", placeholder: "placeholder", className: "className", dropdownClassName: "dropdownClassName", showClear: "showClear", autoClear: "autoClear", selectFirst: "selectFirst" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_AUTOCOMPLETE_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeAutocomplete", first: true, predicate: AutoComplete, descendants: true }], ngImport: i0, template: "<p-autoComplete\n (onFocus)=\"onFocus($event)\"\n [formControl]=\"autocompleteFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dropdown]=\"true\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [field]=\"$any(itemsLabelProperty)\"\n [suggestions]=\"(suggestions$ | async) ?? []\"\n [multiple]=\"multiselect\"\n [showEmptyMessage]=\"true\"\n [emptyMessage]=\"'mngAutocomplete.noMatches' | translate\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [minLength]=\"openOnFocus ? 0 : 1\"\n [showClear]=\"showClear\"\n [forceSelection]=\"autoClear\"\n (completeMethod)=\"onSearch($event)\"\n (onSelect)=\"onSelect($event)\"\n (onBlur)=\"onBlur($event)\"\n (onClear)=\"onClear($event)\"\n appendTo=\"body\"\n dropdownMode=\"current\">\n</p-autoComplete>\n", dependencies: [{ kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "itemSize", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
258
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAutocompleteComponent, decorators: [{
|
|
259
|
-
type: Component,
|
|
260
|
-
args: [{ selector: 'mng-autocomplete', providers: [MNG_AUTOCOMPLETE_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-autoComplete\n (onFocus)=\"onFocus($event)\"\n [formControl]=\"autocompleteFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dropdown]=\"true\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [field]=\"$any(itemsLabelProperty)\"\n [suggestions]=\"(suggestions$ | async) ?? []\"\n [multiple]=\"multiselect\"\n [showEmptyMessage]=\"true\"\n [emptyMessage]=\"'mngAutocomplete.noMatches' | translate\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [minLength]=\"openOnFocus ? 0 : 1\"\n [showClear]=\"showClear\"\n [forceSelection]=\"autoClear\"\n (completeMethod)=\"onSearch($event)\"\n (onSelect)=\"onSelect($event)\"\n (onBlur)=\"onBlur($event)\"\n (onClear)=\"onClear($event)\"\n appendTo=\"body\"\n dropdownMode=\"current\">\n</p-autoComplete>\n" }]
|
|
261
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.TranslateService }, { type: i2.MngFormlyFieldWrapperComponent, decorators: [{
|
|
262
|
-
type: Optional
|
|
263
|
-
}] }]; }, propDecorators: { dataProvider: [{
|
|
264
|
-
type: Input
|
|
265
|
-
}], dataKeyProperty: [{
|
|
266
|
-
type: Input
|
|
267
|
-
}], itemsValuePropertyInit: [{
|
|
268
|
-
type: Input,
|
|
269
|
-
args: ['itemsValueProperty']
|
|
270
|
-
}], itemsLabelPropertyInit: [{
|
|
271
|
-
type: Input,
|
|
272
|
-
args: ['itemsLabelProperty']
|
|
273
|
-
}], itemsLabelTranslate: [{
|
|
274
|
-
type: Input
|
|
275
|
-
}], inlineSearch: [{
|
|
276
|
-
type: Input
|
|
277
|
-
}], openOnFocus: [{
|
|
278
|
-
type: Input
|
|
279
|
-
}], multiselect: [{
|
|
280
|
-
type: Input
|
|
281
|
-
}], placeholder: [{
|
|
282
|
-
type: Input
|
|
283
|
-
}], className: [{
|
|
284
|
-
type: Input
|
|
285
|
-
}], dropdownClassName: [{
|
|
286
|
-
type: Input
|
|
287
|
-
}], showClear: [{
|
|
288
|
-
type: Input
|
|
289
|
-
}], autoClear: [{
|
|
290
|
-
type: Input
|
|
291
|
-
}], selectFirst: [{
|
|
292
|
-
type: Input
|
|
293
|
-
}], valueChangeEventEmitter: [{
|
|
294
|
-
type: Output,
|
|
295
|
-
args: ['valueChange']
|
|
296
|
-
}], primeAutocomplete: [{
|
|
297
|
-
type: ViewChild,
|
|
298
|
-
args: [AutoComplete]
|
|
299
|
-
}] } });
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, ViewChild, forwardRef } from '@angular/core';
|
|
2
|
+
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import { AutoComplete } from 'primeng/autocomplete';
|
|
4
|
+
import { BehaviorSubject, of, switchMap } from 'rxjs';
|
|
5
|
+
import { first, map } from 'rxjs/operators';
|
|
6
|
+
import { MediusFilterMatchType, MediusQueryParamBuilder } from '../../../api/models';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@ngx-translate/core";
|
|
9
|
+
import * as i2 from "../formly/wrappers";
|
|
10
|
+
import * as i3 from "@angular/forms";
|
|
11
|
+
import * as i4 from "primeng/autocomplete";
|
|
12
|
+
import * as i5 from "@angular/common";
|
|
13
|
+
export const MNG_AUTOCOMPLETE_VALUE_ACCESSOR = {
|
|
14
|
+
provide: NG_VALUE_ACCESSOR,
|
|
15
|
+
useExisting: forwardRef(() => MngAutocompleteComponent),
|
|
16
|
+
multi: true
|
|
17
|
+
};
|
|
18
|
+
export class MngAutocompleteComponent {
|
|
19
|
+
constructor(injector, translate, formlyWrapper) {
|
|
20
|
+
this.injector = injector;
|
|
21
|
+
this.translate = translate;
|
|
22
|
+
this.formlyWrapper = formlyWrapper;
|
|
23
|
+
this.itemsLabelTranslate = false;
|
|
24
|
+
this.inlineSearch = false;
|
|
25
|
+
this.openOnFocus = false;
|
|
26
|
+
this.multiselect = false;
|
|
27
|
+
this.className = null;
|
|
28
|
+
this.dropdownClassName = null;
|
|
29
|
+
this.showClear = false;
|
|
30
|
+
this.autoClear = false;
|
|
31
|
+
this.selectFirst = false; //on every input field change return first given value (or null)
|
|
32
|
+
this.valueChangeEventEmitter = new EventEmitter();
|
|
33
|
+
this.isInited = false;
|
|
34
|
+
this.suggestionsSubject = new BehaviorSubject([]);
|
|
35
|
+
this.searchSubscription = null;
|
|
36
|
+
this.dataProviderService = null;
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
38
|
+
this.onChangeFn = () => { };
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
40
|
+
this.onTouchedFn = () => { };
|
|
41
|
+
this.autocompleteFormControl = new FormControl();
|
|
42
|
+
this.suggestions$ = this.suggestionsSubject.asObservable();
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
this.setItemsAndDataProvider();
|
|
46
|
+
if (this.selectFirst) {
|
|
47
|
+
this.suggestionSubscription = this.suggestions$.subscribe(e => this.valueChangeEventEmitter.emit(e.length === 0 ? null : e[0]));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
ngOnDestroy() {
|
|
51
|
+
this.searchSubscription?.unsubscribe();
|
|
52
|
+
this.suggestionSubscription?.unsubscribe();
|
|
53
|
+
}
|
|
54
|
+
onSearch(event) {
|
|
55
|
+
this.searchSubscription?.unsubscribe();
|
|
56
|
+
if (this.dataProvider) {
|
|
57
|
+
const queryParamBuilder = MediusQueryParamBuilder.create();
|
|
58
|
+
if (this.itemsLabelProperty) {
|
|
59
|
+
queryParamBuilder.withSort(this.itemsLabelProperty);
|
|
60
|
+
}
|
|
61
|
+
if (event.query && event.query.length > 0 && this.itemsLabelProperty) {
|
|
62
|
+
queryParamBuilder.withFilter(this.itemsLabelProperty, event.query, undefined, MediusFilterMatchType.StartsWith);
|
|
63
|
+
}
|
|
64
|
+
this.searchSubscription = this.getLookup(queryParamBuilder.build(), event.query).subscribe({
|
|
65
|
+
next: items => {
|
|
66
|
+
this.setSuggestionsFromItems(items, event.query);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
onSelect(value) {
|
|
72
|
+
let outputValue = value;
|
|
73
|
+
if (this.itemsValueProperty && typeof value === 'object') {
|
|
74
|
+
outputValue = value[this.itemsValueProperty];
|
|
75
|
+
}
|
|
76
|
+
this.onChangeFn(outputValue);
|
|
77
|
+
this.valueChangeEventEmitter.next(outputValue);
|
|
78
|
+
}
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
80
|
+
onFocus(event) {
|
|
81
|
+
if (this.openOnFocus) {
|
|
82
|
+
this.primeAutocomplete?.show();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
86
|
+
onBlur(event) {
|
|
87
|
+
this.formlyWrapper?.formControl?.markAsTouched();
|
|
88
|
+
}
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
90
|
+
onClear(event) {
|
|
91
|
+
this.onChangeFn();
|
|
92
|
+
this.valueChangeEventEmitter.next(null);
|
|
93
|
+
}
|
|
94
|
+
registerOnChange(fn) {
|
|
95
|
+
this.onChangeFn = fn;
|
|
96
|
+
}
|
|
97
|
+
registerOnTouched(fn) {
|
|
98
|
+
this.onTouchedFn = fn;
|
|
99
|
+
}
|
|
100
|
+
setDisabledState(isDisabled) {
|
|
101
|
+
if (isDisabled) {
|
|
102
|
+
this.autocompleteFormControl.disable();
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.autocompleteFormControl.enable();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
writeValue(value) {
|
|
109
|
+
this.setItemsAndDataProvider();
|
|
110
|
+
if (this.itemsValuePropertyInit && value != null && typeof value !== 'object') {
|
|
111
|
+
const defaultItem = { [this.itemsValuePropertyInit]: value };
|
|
112
|
+
if (this.itemsLabelProperty) {
|
|
113
|
+
defaultItem[this.itemsLabelProperty] = value;
|
|
114
|
+
}
|
|
115
|
+
const matchedItem = this.suggestionsSubject.value.find(i => i[this.itemsValuePropertyInit] === value);
|
|
116
|
+
if (matchedItem) {
|
|
117
|
+
this.autocompleteFormControl.setValue(matchedItem, { emitEvent: false });
|
|
118
|
+
}
|
|
119
|
+
else if (this.dataProvider) {
|
|
120
|
+
const queryParamBuilder = MediusQueryParamBuilder.create();
|
|
121
|
+
queryParamBuilder.withFilter(this.itemsValuePropertyInit, value, undefined, MediusFilterMatchType.Equals);
|
|
122
|
+
this.getLookup(queryParamBuilder.build())
|
|
123
|
+
.pipe(first())
|
|
124
|
+
.subscribe({
|
|
125
|
+
next: items => {
|
|
126
|
+
let isMatch = false;
|
|
127
|
+
if (items.length === 1) {
|
|
128
|
+
this.autocompleteFormControl.setValue(items[0]);
|
|
129
|
+
isMatch = true;
|
|
130
|
+
}
|
|
131
|
+
else if (items.length > 1) {
|
|
132
|
+
// for lookup data providers not using query params
|
|
133
|
+
const matchedItem = items.find(i => i[this.itemsValuePropertyInit] === value);
|
|
134
|
+
if (matchedItem) {
|
|
135
|
+
this.setAutocompleteValueFromWrite(matchedItem);
|
|
136
|
+
isMatch = true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (!isMatch) {
|
|
140
|
+
this.setAutocompleteValueFromWrite(defaultItem);
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
error: () => {
|
|
144
|
+
this.setAutocompleteValueFromWrite(defaultItem);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
this.setAutocompleteValueFromWrite(defaultItem);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
this.setAutocompleteValueFromWrite(value);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
setItemsAndDataProvider() {
|
|
157
|
+
if (this.isInited) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
this.itemsLabelProperty = this.itemsLabelPropertyInit;
|
|
161
|
+
this.itemsValueProperty = this.itemsValuePropertyInit;
|
|
162
|
+
if (this.dataProvider) {
|
|
163
|
+
this.dataProviderService = this.dataProvider.serviceType ? this.injector.get(this.dataProvider.serviceType) : null;
|
|
164
|
+
if (this.itemsLabelTranslate) {
|
|
165
|
+
// setup translation properties
|
|
166
|
+
if (this.itemsLabelPropertyInit) {
|
|
167
|
+
this.itemsLabelProperty = `${this.itemsLabelPropertyInit}_i18n`;
|
|
168
|
+
}
|
|
169
|
+
else if (!this.itemsLabelProperty && !this.itemsValuePropertyInit) {
|
|
170
|
+
this.itemsLabelProperty = 'title_i18n';
|
|
171
|
+
this.itemsValueProperty = 'value';
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
throw new Error(`Invalid use with value (${this.itemsLabelPropertyInit}) and label (${this.itemsLabelPropertyInit}) property setup.`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
console.warn(`Data provider should be provided for MngAutocompleteComponent.`);
|
|
180
|
+
}
|
|
181
|
+
if (this.openOnFocus) {
|
|
182
|
+
this.onSearch({ query: '' });
|
|
183
|
+
}
|
|
184
|
+
this.isInited = true;
|
|
185
|
+
}
|
|
186
|
+
setAutocompleteValueFromWrite(value) {
|
|
187
|
+
if (value && this.itemsLabelTranslate) {
|
|
188
|
+
value = this.i18nPopulateItems([value], this.translate.instant(this.i18nGetItemsKeys([value])))[0];
|
|
189
|
+
}
|
|
190
|
+
this.autocompleteFormControl.setValue(value, { emitEvent: false });
|
|
191
|
+
}
|
|
192
|
+
getLookup(qp, query) {
|
|
193
|
+
if (this.dataProvider) {
|
|
194
|
+
return this.dataProvider.lookup(qp, this.dataProviderService, query).pipe(switchMap(items => {
|
|
195
|
+
if (this.itemsLabelTranslate) {
|
|
196
|
+
const translatedItems = this.i18nGetItemsKeys(items);
|
|
197
|
+
if (translatedItems.length === 0) {
|
|
198
|
+
return of([]);
|
|
199
|
+
}
|
|
200
|
+
return this.translate.stream(translatedItems).pipe(map(translations => this.i18nPopulateItems(items, translations)));
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
return of(items);
|
|
204
|
+
}
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
return of([]);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
i18nGetItemsKeys(items) {
|
|
212
|
+
return items.map(item => (typeof item === 'object' && this.itemsLabelPropertyInit ? item[this.itemsLabelPropertyInit] : item));
|
|
213
|
+
}
|
|
214
|
+
i18nPopulateItems(items, i18nMap) {
|
|
215
|
+
return items.map(item => {
|
|
216
|
+
if (typeof item === 'object' && this.itemsLabelPropertyInit) {
|
|
217
|
+
const label = item[this.itemsLabelPropertyInit];
|
|
218
|
+
const translation = i18nMap[label];
|
|
219
|
+
if (translation) {
|
|
220
|
+
return { ...item, [this.itemsLabelProperty]: translation };
|
|
221
|
+
}
|
|
222
|
+
return { ...item };
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
const translation = i18nMap[item];
|
|
226
|
+
return {
|
|
227
|
+
[this.itemsLabelProperty]: translation ?? item,
|
|
228
|
+
[this.itemsValueProperty]: item
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
setSuggestionsFromItems(items, query) {
|
|
234
|
+
if (this.inlineSearch) {
|
|
235
|
+
const queryLowerCase = query?.toLowerCase() ?? '';
|
|
236
|
+
const filteredItems = items.filter(i => {
|
|
237
|
+
let itemLabel = i;
|
|
238
|
+
if (this.itemsLabelProperty && typeof i === 'object') {
|
|
239
|
+
itemLabel = i[this.itemsLabelProperty];
|
|
240
|
+
}
|
|
241
|
+
if (itemLabel == null) {
|
|
242
|
+
return queryLowerCase == null || !queryLowerCase.length;
|
|
243
|
+
}
|
|
244
|
+
if (typeof itemLabel !== 'string') {
|
|
245
|
+
itemLabel = itemLabel.toString();
|
|
246
|
+
}
|
|
247
|
+
return itemLabel.toLowerCase().startsWith(queryLowerCase);
|
|
248
|
+
});
|
|
249
|
+
this.suggestionsSubject.next([...filteredItems]);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
this.suggestionsSubject.next([...items]);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
MngAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAutocompleteComponent, deps: [{ token: i0.Injector }, { token: i1.TranslateService }, { token: i2.MngFormlyFieldWrapperComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
257
|
+
MngAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngAutocompleteComponent, selector: "mng-autocomplete", inputs: { dataProvider: "dataProvider", dataKeyProperty: "dataKeyProperty", itemsValuePropertyInit: ["itemsValueProperty", "itemsValuePropertyInit"], itemsLabelPropertyInit: ["itemsLabelProperty", "itemsLabelPropertyInit"], itemsLabelTranslate: "itemsLabelTranslate", inlineSearch: "inlineSearch", openOnFocus: "openOnFocus", multiselect: "multiselect", placeholder: "placeholder", className: "className", dropdownClassName: "dropdownClassName", showClear: "showClear", autoClear: "autoClear", selectFirst: "selectFirst" }, outputs: { valueChangeEventEmitter: "valueChange" }, providers: [MNG_AUTOCOMPLETE_VALUE_ACCESSOR], viewQueries: [{ propertyName: "primeAutocomplete", first: true, predicate: AutoComplete, descendants: true }], ngImport: i0, template: "<p-autoComplete\n (onFocus)=\"onFocus($event)\"\n [formControl]=\"autocompleteFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dropdown]=\"true\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [field]=\"$any(itemsLabelProperty)\"\n [suggestions]=\"(suggestions$ | async) ?? []\"\n [multiple]=\"multiselect\"\n [showEmptyMessage]=\"true\"\n [emptyMessage]=\"'mngAutocomplete.noMatches' | translate\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [minLength]=\"openOnFocus ? 0 : 1\"\n [showClear]=\"showClear\"\n [forceSelection]=\"autoClear\"\n (completeMethod)=\"onSearch($event)\"\n (onSelect)=\"onSelect($event)\"\n (onBlur)=\"onBlur($event)\"\n (onClear)=\"onClear($event)\"\n appendTo=\"body\"\n dropdownMode=\"current\">\n</p-autoComplete>\n", dependencies: [{ kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "itemSize", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
258
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngAutocompleteComponent, decorators: [{
|
|
259
|
+
type: Component,
|
|
260
|
+
args: [{ selector: 'mng-autocomplete', providers: [MNG_AUTOCOMPLETE_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<p-autoComplete\n (onFocus)=\"onFocus($event)\"\n [formControl]=\"autocompleteFormControl\"\n [placeholder]=\"$any(placeholder)\"\n [dropdown]=\"true\"\n [dataKey]=\"$any(dataKeyProperty)\"\n [field]=\"$any(itemsLabelProperty)\"\n [suggestions]=\"(suggestions$ | async) ?? []\"\n [multiple]=\"multiselect\"\n [showEmptyMessage]=\"true\"\n [emptyMessage]=\"'mngAutocomplete.noMatches' | translate\"\n [styleClass]=\"$any(className)\"\n [panelStyleClass]=\"$any(dropdownClassName)\"\n [minLength]=\"openOnFocus ? 0 : 1\"\n [showClear]=\"showClear\"\n [forceSelection]=\"autoClear\"\n (completeMethod)=\"onSearch($event)\"\n (onSelect)=\"onSelect($event)\"\n (onBlur)=\"onBlur($event)\"\n (onClear)=\"onClear($event)\"\n appendTo=\"body\"\n dropdownMode=\"current\">\n</p-autoComplete>\n" }]
|
|
261
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.TranslateService }, { type: i2.MngFormlyFieldWrapperComponent, decorators: [{
|
|
262
|
+
type: Optional
|
|
263
|
+
}] }]; }, propDecorators: { dataProvider: [{
|
|
264
|
+
type: Input
|
|
265
|
+
}], dataKeyProperty: [{
|
|
266
|
+
type: Input
|
|
267
|
+
}], itemsValuePropertyInit: [{
|
|
268
|
+
type: Input,
|
|
269
|
+
args: ['itemsValueProperty']
|
|
270
|
+
}], itemsLabelPropertyInit: [{
|
|
271
|
+
type: Input,
|
|
272
|
+
args: ['itemsLabelProperty']
|
|
273
|
+
}], itemsLabelTranslate: [{
|
|
274
|
+
type: Input
|
|
275
|
+
}], inlineSearch: [{
|
|
276
|
+
type: Input
|
|
277
|
+
}], openOnFocus: [{
|
|
278
|
+
type: Input
|
|
279
|
+
}], multiselect: [{
|
|
280
|
+
type: Input
|
|
281
|
+
}], placeholder: [{
|
|
282
|
+
type: Input
|
|
283
|
+
}], className: [{
|
|
284
|
+
type: Input
|
|
285
|
+
}], dropdownClassName: [{
|
|
286
|
+
type: Input
|
|
287
|
+
}], showClear: [{
|
|
288
|
+
type: Input
|
|
289
|
+
}], autoClear: [{
|
|
290
|
+
type: Input
|
|
291
|
+
}], selectFirst: [{
|
|
292
|
+
type: Input
|
|
293
|
+
}], valueChangeEventEmitter: [{
|
|
294
|
+
type: Output,
|
|
295
|
+
args: ['valueChange']
|
|
296
|
+
}], primeAutocomplete: [{
|
|
297
|
+
type: ViewChild,
|
|
298
|
+
args: [AutoComplete]
|
|
299
|
+
}] } });
|
|
300
300
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBOEIsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUssT0FBTyxFQUF1QixXQUFXLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGVBQWUsRUFBNEIsRUFBRSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RSxPQUFPLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFDLE9BQU8sRUFBQyxxQkFBcUIsRUFBb0IsdUJBQXVCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQUlyRyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBcUI7SUFDN0QsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHdCQUF3QixDQUFDO0lBQ3ZELEtBQUssRUFBRSxJQUFJO0NBQ2QsQ0FBQztBQVFGLE1BQU0sT0FBTyx3QkFBd0I7SUFtQ2pDLFlBQW9CLFFBQWtCLEVBQVUsU0FBMkIsRUFBc0IsYUFBNkM7UUFBMUgsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLGNBQVMs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b0JBQW9CO2dCQUNYLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUV3Qix1QkFBdUI7c0JBQXBELE1BQU07dUJBQUMsYUFBYTtnQkFFVyxpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBFeGlzdGluZ1Byb3ZpZGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBWaWV3Q2hpbGQsIGZvcndhcmRSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0F1dG9Db21wbGV0ZX0gZnJvbSAncHJpbWVuZy9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgb2YsIHN3aXRjaE1hcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpcnN0LCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtNZWRpdXNGaWx0ZXJNYXRjaFR5cGUsIE1lZGl1c1F1ZXJ5UGFyYW0sIE1lZGl1c1F1ZXJ5UGFyYW1CdWlsZGVyfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWxzJztcbmltcG9ydCB7SUxvb2t1cERhdGFQcm92aWRlcn0gZnJvbSAnLi4vLi4vLi4vZGF0YS1wcm92aWRlcnMnO1xuaW1wb3J0IHtNbmdGb3JtbHlGaWVsZFdyYXBwZXJDb21wb25lbnR9IGZyb20gJy4uL2Zvcm1seS93cmFwcGVycyc7XG5cbmV4cG9ydCBjb25zdCBNTkdfQVVUT0NPTVBMRVRFX1ZBTFVFX0FDQ0VTU09SOiBFeGlzdGluZ1Byb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1uZ0F1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbW5nLWF1dG9jb21wbGV0ZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbTU5HX0FVVE9DT01QTEVURV9WQUxVRV9BQ0NFU1NPUl0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTW5nQXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YVByb3ZpZGVyPzogSUxvb2t1cERhdGFQcm92aWRlcjxhbnksIGFueT47XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFLZXlQcm9wZXJ0eT86IHN0cmluZztcbiAgICBASW5wdXQoJ2l0ZW1zVmFsdWVQcm9wZXJ0eScpIHB1YmxpYyBpdGVtc1ZhbHVlUHJvcGVydHlJbml0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgnaXRlbXNMYWJlbFByb3BlcnR5JykgcHVibGljIGl0ZW1zTGFiZWxQcm9wZXJ0eUluaXQ/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zTGFiZWxUcmFuc2xhdGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5saW5lU2VhcmNoID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIG9wZW5PbkZvY3VzID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIG11bHRpc2VsZWN0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93bkNsYXNzTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgQElucHV0KCkgcHVibGljIHNob3dDbGVhciA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhdXRvQ2xlYXIgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0Rmlyc3QgPSBmYWxzZTsgLy9vbiBldmVyeSBpbnB1dCBmaWVsZCBjaGFuZ2UgcmV0dXJuIGZpcnN0IGdpdmVuIHZhbHVlIChvciBudWxsKVxuXG4gICAgQE91dHB1dCgndmFsdWVDaGFuZ2UnKSBwdWJsaWMgdmFsdWVDaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAVmlld0NoaWxkKEF1dG9Db21wbGV0ZSkgcHVibGljIHByaW1lQXV0b2NvbXBsZXRlPzogQXV0b0NvbXBsZXRlO1xuXG4gICAgcHJpdmF0ZSBpc0luaXRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgc3VnZ2VzdGlvbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QXJyYXk8YW55Pj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFycmF5PGFueT4+KFtdKTtcbiAgICBwcml2YXRlIHNlYXJjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBkYXRhUHJvdmlkZXJTZXJ2aWNlOiBhbnkgPSBudWxsO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uQ2hhbmdlRm46IGFueSA9ICgpID0+IHt9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwcml2YXRlIG9uVG91Y2hlZEZuOiBhbnkgPSAoKSA9PiB7fTtcblxuICAgIHB1YmxpYyBpdGVtc0xhYmVsUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHVibGljIGl0ZW1zVmFsdWVQcm9wZXJ0eT86IHN0cmluZztcbiAgICBwdWJsaWMgYXV0b2NvbXBsZXRlRm9ybUNvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gICAgcHVibGljIHN1Z2dlc3Rpb25zJDogT2JzZXJ2YWJsZTxBcnJheTxhbnk+PiA9IHRoaXMuc3VnZ2VzdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBzdWdnZXN0aW9uU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLCBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1seVdyYXBwZXI6IE1uZ0Zvcm1seUZpZWxkV3JhcHBlckNvbXBvbmVudCkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNldEl0ZW1zQW5kRGF0YVByb3ZpZGVyKCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEZpcnN0KSB7XG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLnN1Z2dlc3Rpb25zJC5zdWJzY3JpYmUoZSA9PiB0aGlzLnZhbHVlQ2hhbmdlRXZlbnRFbWl0dGVyLmVtaXQoZS5sZW5ndGggPT09IDAgPyBudWxsIDogZVswXSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnN1Z2dlc3Rpb25TdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgb25TZWFyY2goZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1CdWlsZGVyID0gTWVkaXVzUXVlcnlQYXJhbUJ1aWxkZXIuY3JlYXRlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xhYmVsUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtQnVpbGRlci53aXRoU29ydCh0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZlbnQucXVlcnkgJiYgZXZlbnQucXVlcnkubGVuZ3RoID4gMCAmJiB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1CdWlsZGVyLndpdGhGaWx0ZXIodGhpcy5pdGVtc0xhYmVsUHJvcGVydHksIGV2ZW50LnF1ZXJ5LCB1bmRlZmluZWQsIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5TdGFydHNXaXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5nZXRMb29rdXAocXVlcnlQYXJhbUJ1aWxkZXIuYnVpbGQoKSwgZXZlbnQucXVlcnkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogaXRlbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN1Z2dlc3Rpb25zRnJvbUl0ZW1zKGl0ZW1zLCBldmVudC5xdWVyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlbGVjdCh2YWx1ZTogYW55KSB7XG4gICAgICAgIGxldCBvdXRwdXRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pdGVtc1ZhbHVlUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSB2YWx1ZVt0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZUZuKG91dHB1dFZhbHVlKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZUV2ZW50RW1pdHRlci5uZXh0KG91dHB1dFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25Gb2N1cyhldmVudDogRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMub3Blbk9uRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMucHJpbWVBdXRvY29tcGxldGU/LnNob3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvbkJsdXIoZXZlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLmZvcm1seVdyYXBwZXI/LmZvcm1Db250cm9sPy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uQ2xlYXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbigpO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlRXZlbnRFbWl0dGVyLm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVGb3JtQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUZvcm1Db250cm9sLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0SXRlbXNBbmREYXRhUHJvdmlkZXIoKTtcblxuICAgICAgICBpZiAodGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0ICYmIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEl0ZW06IGFueSA9IHtbdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0XTogdmFsdWV9O1xuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEl0ZW1bdGhpcy5pdGVtc0xhYmVsUHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRJdGVtID0gdGhpcy5zdWdnZXN0aW9uc1N1YmplY3QudmFsdWUuZmluZChpID0+IGlbdGhpcy5pdGVtc1ZhbHVlUHJvcGVydHlJbml0IV0gPT09IHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVkSXRlbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUobWF0Y2hlZEl0ZW0sIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YVByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbUJ1aWxkZXIgPSBNZWRpdXNRdWVyeVBhcmFtQnVpbGRlci5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtQnVpbGRlci53aXRoRmlsdGVyKHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5SW5pdCwgdmFsdWUsIHVuZGVmaW5lZCwgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkVxdWFscyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmdldExvb2t1cChxdWVyeVBhcmFtQnVpbGRlci5idWlsZCgpKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZShpdGVtc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgbG9va3VwIGRhdGEgcHJvdmlkZXJzIG5vdCB1c2luZyBxdWVyeSBwYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZEl0ZW0gPSBpdGVtcy5maW5kKGkgPT4gaVt0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eUluaXQhXSA9PT0gdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXV0b2NvbXBsZXRlVmFsdWVGcm9tV3JpdGUobWF0Y2hlZEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRvY29tcGxldGVWYWx1ZUZyb21Xcml0ZShkZWZhdWx0SXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdXRvY29tcGxldGVWYWx1ZUZyb21Xcml0ZShkZWZhdWx0SXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEF1dG9jb21wbGV0ZVZhbHVlRnJvbVdyaXRlKGRlZmF1bHRJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXV0b2NvbXBsZXRlVmFsdWVGcm9tV3JpdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRJdGVtc0FuZERhdGFQcm92aWRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ID0gdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0O1xuICAgICAgICB0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eSA9IHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5SW5pdDtcblxuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSA9IHRoaXMuZGF0YVByb3ZpZGVyLnNlcnZpY2VUeXBlID8gdGhpcy5pbmplY3Rvci5nZXQ8YW55Pih0aGlzLmRhdGFQcm92aWRlci5zZXJ2aWNlVHlwZSkgOiBudWxsO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xhYmVsVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0dXAgdHJhbnNsYXRpb24gcHJvcGVydGllc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgPSBgJHt0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXR9X2kxOG5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXRlbXNMYWJlbFByb3BlcnR5ICYmICF0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eUluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgPSAndGl0bGVfaTE4bic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNWYWx1ZVByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdXNlIHdpdGggdmFsdWUgKCR7dGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0fSkgYW5kIGxhYmVsICgke3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdH0pIHByb3BlcnR5IHNldHVwLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGF0YSBwcm92aWRlciBzaG91bGQgYmUgcHJvdmlkZWQgZm9yIE1uZ0F1dG9jb21wbGV0ZUNvbXBvbmVudC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wZW5PbkZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoKHtxdWVyeTogJyd9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNJbml0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0QXV0b2NvbXBsZXRlVmFsdWVGcm9tV3JpdGUodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5pdGVtc0xhYmVsVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuaTE4blBvcHVsYXRlSXRlbXMoW3ZhbHVlXSwgdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLmkxOG5HZXRJdGVtc0tleXMoW3ZhbHVlXSkpKVswXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TG9va3VwKHFwOiBNZWRpdXNRdWVyeVBhcmFtLCBxdWVyeT86IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8YW55Pj4ge1xuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFQcm92aWRlci5sb29rdXAocXAsIHRoaXMuZGF0YVByb3ZpZGVyU2VydmljZSwgcXVlcnkpLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNMYWJlbFRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZEl0ZW1zID0gdGhpcy5pMThuR2V0SXRlbXNLZXlzKGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLnN0cmVhbSh0cmFuc2xhdGVkSXRlbXMpLnBpcGUobWFwKHRyYW5zbGF0aW9ucyA9PiB0aGlzLmkxOG5Qb3B1bGF0ZUl0ZW1zKGl0ZW1zLCB0cmFuc2xhdGlvbnMpKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpMThuR2V0SXRlbXNLZXlzKGl0ZW1zOiBBcnJheTxhbnk+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoaXRlbSA9PiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIHRoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCA/IChpdGVtW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5SW5pdCBhcyBrZXlvZiBvYmplY3RdIGFzIHN0cmluZykgOiBpdGVtKSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaTE4blBvcHVsYXRlSXRlbXMoaXRlbXM6IEFycmF5PGFueT4sIGkxOG5NYXA6IGFueSk6IEFycmF5PGFueT4ge1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiB0aGlzLml0ZW1zTGFiZWxQcm9wZXJ0eUluaXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGl0ZW1bdGhpcy5pdGVtc0xhYmVsUHJvcGVydHlJbml0IGFzIGtleW9mIG9iamVjdF0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBpMThuTWFwW2xhYmVsXTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5pdGVtLCBbdGhpcy5pdGVtc0xhYmVsUHJvcGVydHkhXTogdHJhbnNsYXRpb259O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW19O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IGkxOG5NYXBbaXRlbV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMuaXRlbXNMYWJlbFByb3BlcnR5IV06IHRyYW5zbGF0aW9uID8/IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLml0ZW1zVmFsdWVQcm9wZXJ0eSFdOiBpdGVtXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTdWdnZXN0aW9uc0Zyb21JdGVtcyhpdGVtczogQXJyYXk8YW55PiwgcXVlcnk/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5saW5lU2VhcmNoKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUxvd2VyQ2FzZSA9IHF1ZXJ5Py50b0xvd2VyQ2FzZSgpID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRJdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXRlbUxhYmVsID0gaTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtc0xhYmVsUHJvcGVydHkgJiYgdHlwZW9mIGkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1MYWJlbCA9IGlbdGhpcy5pdGVtc0xhYmVsUHJvcGVydHldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXRlbUxhYmVsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5TG93ZXJDYXNlID09IG51bGwgfHwgIXF1ZXJ5TG93ZXJDYXNlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtTGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1MYWJlbCA9IGl0ZW1MYWJlbC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUxhYmVsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChxdWVyeUxvd2VyQ2FzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNTdWJqZWN0Lm5leHQoWy4uLmZpbHRlcmVkSXRlbXNdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNTdWJqZWN0Lm5leHQoWy4uLml0ZW1zXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8cC1hdXRvQ29tcGxldGVcbiAgICAob25Gb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxuICAgIFtmb3JtQ29udHJvbF09XCJhdXRvY29tcGxldGVGb3JtQ29udHJvbFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cIiRhbnkocGxhY2Vob2xkZXIpXCJcbiAgICBbZHJvcGRvd25dPVwidHJ1ZVwiXG4gICAgW2RhdGFLZXldPVwiJGFueShkYXRhS2V5UHJvcGVydHkpXCJcbiAgICBbZmllbGRdPVwiJGFueShpdGVtc0xhYmVsUHJvcGVydHkpXCJcbiAgICBbc3VnZ2VzdGlvbnNdPVwiKHN1Z2dlc3Rpb25zJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgW211bHRpcGxlXT1cIm11bHRpc2VsZWN0XCJcbiAgICBbc2hvd0VtcHR5TWVzc2FnZV09XCJ0cnVlXCJcbiAgICBbZW1wdHlNZXNzYWdlXT1cIidtbmdBdXRvY29tcGxldGUubm9NYXRjaGVzJyB8IHRyYW5zbGF0ZVwiXG4gICAgW3N0eWxlQ2xhc3NdPVwiJGFueShjbGFzc05hbWUpXCJcbiAgICBbcGFuZWxTdHlsZUNsYXNzXT1cIiRhbnkoZHJvcGRvd25DbGFzc05hbWUpXCJcbiAgICBbbWluTGVuZ3RoXT1cIm9wZW5PbkZvY3VzID8gMCA6IDFcIlxuICAgIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCJcbiAgICBbZm9yY2VTZWxlY3Rpb25dPVwiYXV0b0NsZWFyXCJcbiAgICAoY29tcGxldGVNZXRob2QpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgKG9uU2VsZWN0KT1cIm9uU2VsZWN0KCRldmVudClcIlxuICAgIChvbkJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgIChvbkNsZWFyKT1cIm9uQ2xlYXIoJGV2ZW50KVwiXG4gICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICBkcm9wZG93bk1vZGU9XCJjdXJyZW50XCI+XG48L3AtYXV0b0NvbXBsZXRlPlxuIl19
|