@koalarx/ui 12.7.19 → 13.0.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/alert/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/alert/{esm2015/koalarx-ui-alert.js → esm2020/koalarx-ui-alert.mjs} +0 -0
- package/alert/esm2020/lib/dialog-alert.component.mjs +48 -0
- package/alert/{esm2015/lib/koala.alert-config.interface.js → esm2020/lib/koala.alert-config.interface.mjs} +0 -0
- package/alert/{esm2015/lib/koala.alert.enum.js → esm2020/lib/koala.alert.enum.mjs} +0 -0
- package/alert/esm2020/lib/koala.alert.module.mjs +48 -0
- package/alert/esm2020/lib/koala.alert.service.mjs +19 -0
- package/alert/{esm2015/lib/koala.request-code-to-alert-enum.translate.js → esm2020/lib/koala.request-code-to-alert-enum.translate.mjs} +0 -0
- package/alert/fesm2015/koalarx-ui-alert.mjs +141 -0
- package/alert/fesm2015/koalarx-ui-alert.mjs.map +1 -0
- package/alert/fesm2020/koalarx-ui-alert.mjs +139 -0
- package/alert/fesm2020/koalarx-ui-alert.mjs.map +1 -0
- package/alert/koalarx-ui-alert.d.ts +1 -0
- package/alert/lib/dialog-alert.component.d.ts +3 -0
- package/alert/lib/koala.alert.module.d.ts +10 -0
- package/alert/lib/koala.alert.service.d.ts +3 -0
- package/alert/package.json +18 -6
- package/button/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/button/{esm2015/koalarx-ui-button.js → esm2020/koalarx-ui-button.mjs} +0 -0
- package/button/esm2020/lib/button.component.mjs +44 -0
- package/button/esm2020/lib/koala.button.module.mjs +42 -0
- package/button/fesm2015/koalarx-ui-button.mjs +90 -0
- package/button/fesm2015/koalarx-ui-button.mjs.map +1 -0
- package/button/fesm2020/koalarx-ui-button.mjs +90 -0
- package/button/fesm2020/koalarx-ui-button.mjs.map +1 -0
- package/button/koalarx-ui-button.d.ts +1 -0
- package/button/lib/button.component.d.ts +6 -1
- package/button/lib/koala.button.module.d.ts +10 -0
- package/button/package.json +18 -6
- package/common/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/common/{esm2015/koalarx-ui-common.js → esm2020/koalarx-ui-common.mjs} +0 -0
- package/common/{esm2015/lib/mask-options.js → esm2020/lib/mask-options.mjs} +0 -0
- package/common/esm2020/lib/services/csv/koala.csv.service.mjs +36 -0
- package/common/{esm2015/lib/services/xlsx/koala.xlsx-config.interface.js → esm2020/lib/services/xlsx/koala.xlsx-config.interface.mjs} +0 -0
- package/common/esm2020/lib/services/xlsx/koala.xlsx.service.mjs +73 -0
- package/common/fesm2015/{koalarx-ui-common.js → koalarx-ui-common.mjs} +14 -14
- package/common/fesm2015/koalarx-ui-common.mjs.map +1 -0
- package/common/fesm2020/koalarx-ui-common.mjs +118 -0
- package/common/fesm2020/koalarx-ui-common.mjs.map +1 -0
- package/common/koalarx-ui-common.d.ts +1 -0
- package/common/lib/services/csv/koala.csv.service.d.ts +3 -0
- package/common/lib/services/xlsx/koala.xlsx.service.d.ts +3 -0
- package/common/package.json +18 -6
- package/core/esm2020/index.mjs +35 -0
- package/core/esm2020/koalarx-ui-core.mjs +5 -0
- package/core/{esm2015/lib/environments/koalaEnvironment.js → esm2020/lib/environments/koalaEnvironment.mjs} +0 -0
- package/core/esm2020/lib/loader/loader-bar-page.component.mjs +24 -0
- package/core/{esm2015/lib/loader/loader-bar-page.interface.js → esm2020/lib/loader/loader-bar-page.interface.mjs} +0 -0
- package/core/{esm2015/lib/loader/loader-config.interface.js → esm2020/lib/loader/loader-config.interface.mjs} +0 -0
- package/core/esm2020/lib/ngx-koala.module.mjs +49 -0
- package/core/{esm2015/lib/page/koala-language.helper.js → esm2020/lib/page/koala-language.helper.mjs} +0 -0
- package/core/{esm2015/lib/page/koala-page-pallet-colors.interface.js → esm2020/lib/page/koala-page-pallet-colors.interface.mjs} +0 -0
- package/core/esm2020/lib/page/koala.page.module.mjs +78 -0
- package/core/{esm2015/lib/page/koala.user-menu-options.interface.js → esm2020/lib/page/koala.user-menu-options.interface.mjs} +0 -0
- package/core/{esm2015/lib/page/notifications/koala.notification.interface.js → esm2020/lib/page/notifications/koala.notification.interface.mjs} +0 -0
- package/core/esm2020/lib/page/notifications/notification.component.mjs +47 -0
- package/core/esm2020/lib/page/page.component.mjs +404 -0
- package/core/esm2020/lib/router/koala.parameter-hash-location-stategy.mjs +18 -0
- package/core/esm2020/lib/services/api-requester/factory/koala.response.factory.mjs +44 -0
- package/core/{esm2015/lib/services/api-requester/helpers/error/koala.client.error.js → esm2020/lib/services/api-requester/helpers/error/koala.client.error.mjs} +0 -0
- package/core/{esm2015/lib/services/api-requester/helpers/error/koala.errors.helper.js → esm2020/lib/services/api-requester/helpers/error/koala.errors.helper.mjs} +0 -0
- package/core/{esm2015/lib/services/api-requester/helpers/error/koala.not-found.error.js → esm2020/lib/services/api-requester/helpers/error/koala.not-found.error.mjs} +0 -0
- package/core/{esm2015/lib/services/api-requester/helpers/error/koala.success.error.js → esm2020/lib/services/api-requester/helpers/error/koala.success.error.mjs} +0 -0
- package/core/{esm2015/lib/services/api-requester/helpers/error/koala.unhautorized.error.js → esm2020/lib/services/api-requester/helpers/error/koala.unhautorized.error.mjs} +0 -0
- package/core/{esm2015/lib/services/api-requester/helpers/service/koala.request-header.helper.js → esm2020/lib/services/api-requester/helpers/service/koala.request-header.helper.mjs} +0 -0
- package/core/esm2020/lib/services/api-requester/koala.api-requester.base.mjs +63 -0
- package/core/esm2020/lib/services/api-requester/koala.api-requester.service.mjs +131 -0
- package/core/esm2020/lib/services/loader/koala.loader.service.mjs +34 -0
- package/core/{esm2015/lib/services/openid/koala-oauth2-config.interface.js → esm2020/lib/services/openid/koala-oauth2-config.interface.mjs} +0 -0
- package/core/esm2020/lib/services/openid/koala.oauth.config.mjs +30 -0
- package/core/esm2020/lib/services/openid/koala.oauth2.service.mjs +194 -0
- package/core/esm2020/lib/services/request/koala.request.service.mjs +52 -0
- package/core/{esm2015/lib/services/token/koala.token.service.js → esm2020/lib/services/token/koala.token.service.mjs} +7 -6
- package/core/esm2020/lib/services/token/token.factory.mjs +27 -0
- package/core/fesm2015/{koalarx-ui-core.js → koalarx-ui-core.mjs} +249 -191
- package/core/fesm2015/koalarx-ui-core.mjs.map +1 -0
- package/core/fesm2020/koalarx-ui-core.mjs +1367 -0
- package/core/fesm2020/koalarx-ui-core.mjs.map +1 -0
- package/core/index.d.ts +1 -0
- package/core/koalarx-ui-core.d.ts +1 -2
- package/core/lib/loader/loader-bar-page.component.d.ts +5 -1
- package/core/lib/ngx-koala.module.d.ts +7 -0
- package/core/lib/page/koala.page.module.d.ts +19 -0
- package/core/lib/page/notifications/notification.component.d.ts +3 -0
- package/core/lib/page/page.component.d.ts +3 -0
- package/core/lib/router/koala.parameter-hash-location-stategy.d.ts +3 -0
- package/core/lib/services/api-requester/koala.api-requester.service.d.ts +3 -0
- package/core/lib/services/loader/koala.loader.service.d.ts +3 -0
- package/core/lib/services/openid/koala.oauth2.service.d.ts +3 -0
- package/core/lib/services/request/koala.request.service.d.ts +3 -0
- package/core/lib/services/token/koala.token.service.d.ts +3 -0
- package/core/package.json +18 -6
- package/dialog/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/dialog/{esm2015/koalarx-ui-dialog.js → esm2020/koalarx-ui-dialog.mjs} +0 -0
- package/dialog/esm2020/lib/dialog.component.mjs +25 -0
- package/dialog/{esm2015/lib/koala.dialog-template.interface.js → esm2020/lib/koala.dialog-template.interface.mjs} +0 -0
- package/dialog/esm2020/lib/koala.dialog.module.mjs +38 -0
- package/dialog/esm2020/lib/koala.dialog.service.mjs +57 -0
- package/dialog/fesm2015/koalarx-ui-dialog.mjs +121 -0
- package/dialog/fesm2015/koalarx-ui-dialog.mjs.map +1 -0
- package/dialog/fesm2020/koalarx-ui-dialog.mjs +121 -0
- package/dialog/fesm2020/koalarx-ui-dialog.mjs.map +1 -0
- package/dialog/koalarx-ui-dialog.d.ts +1 -0
- package/dialog/lib/dialog.component.d.ts +3 -0
- package/dialog/lib/koala.dialog.module.d.ts +9 -0
- package/dialog/lib/koala.dialog.service.d.ts +3 -0
- package/dialog/package.json +18 -6
- package/dynamic-component/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/dynamic-component/{esm2015/koalarx-ui-dynamic-component.js → esm2020/koalarx-ui-dynamic-component.mjs} +0 -0
- package/dynamic-component/{esm2015/lib/koala-dynamic-component.component.js → esm2020/lib/koala-dynamic-component.component.mjs} +0 -0
- package/dynamic-component/esm2020/lib/koala-dynamic-component.directive.mjs +16 -0
- package/dynamic-component/esm2020/lib/koala-dynamic-component.factory.mjs +41 -0
- package/dynamic-component/{esm2015/lib/koala-dynamic-component.js → esm2020/lib/koala-dynamic-component.mjs} +0 -0
- package/dynamic-component/esm2020/lib/koala-dynamic-component.module.mjs +23 -0
- package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.mjs +87 -0
- package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.mjs.map +1 -0
- package/dynamic-component/fesm2020/koalarx-ui-dynamic-component.mjs +86 -0
- package/dynamic-component/fesm2020/koalarx-ui-dynamic-component.mjs.map +1 -0
- package/dynamic-component/koalarx-ui-dynamic-component.d.ts +1 -0
- package/dynamic-component/lib/koala-dynamic-component.directive.d.ts +3 -0
- package/dynamic-component/lib/koala-dynamic-component.factory.d.ts +3 -0
- package/dynamic-component/lib/koala-dynamic-component.module.d.ts +6 -0
- package/dynamic-component/package.json +18 -6
- package/file-button/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/file-button/{esm2015/koalarx-ui-file-button.js → esm2020/koalarx-ui-file-button.mjs} +0 -0
- package/file-button/esm2020/lib/file-button.component.mjs +125 -0
- package/file-button/esm2020/lib/koala.btn-file.service.mjs +25 -0
- package/file-button/esm2020/lib/koala.file-button.module.mjs +38 -0
- package/file-button/{esm2015/lib/koala.file.interface.js → esm2020/lib/koala.file.interface.mjs} +0 -0
- package/file-button/fesm2015/koalarx-ui-file-button.mjs +199 -0
- package/file-button/fesm2015/koalarx-ui-file-button.mjs.map +1 -0
- package/file-button/fesm2020/koalarx-ui-file-button.mjs +189 -0
- package/file-button/fesm2020/koalarx-ui-file-button.mjs.map +1 -0
- package/file-button/koalarx-ui-file-button.d.ts +1 -0
- package/file-button/lib/file-button.component.d.ts +4 -1
- package/file-button/lib/koala.btn-file.service.d.ts +3 -0
- package/file-button/lib/koala.file-button.module.d.ts +9 -0
- package/file-button/package.json +18 -6
- package/folder-page/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/folder-page/{esm2015/koalarx-ui-folder-page.js → esm2020/koalarx-ui-folder-page.mjs} +0 -0
- package/folder-page/esm2020/lib/folder.component.mjs +70 -0
- package/folder-page/{esm2015/lib/koala-navigate-history.interface.js → esm2020/lib/koala-navigate-history.interface.mjs} +0 -0
- package/folder-page/esm2020/lib/koala.folder-page.module.mjs +42 -0
- package/folder-page/fesm2015/koalarx-ui-folder-page.mjs +117 -0
- package/folder-page/fesm2015/koalarx-ui-folder-page.mjs.map +1 -0
- package/folder-page/fesm2020/koalarx-ui-folder-page.mjs +116 -0
- package/folder-page/fesm2020/koalarx-ui-folder-page.mjs.map +1 -0
- package/folder-page/koalarx-ui-folder-page.d.ts +1 -0
- package/folder-page/lib/folder.component.d.ts +6 -2
- package/folder-page/lib/koala.folder-page.module.d.ts +10 -0
- package/folder-page/package.json +18 -6
- package/form/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/form/{esm2015/koalarx-ui-form.js → esm2020/koalarx-ui-form.mjs} +0 -0
- package/form/esm2020/lib/btn-submit/btn-submit.component.mjs +49 -0
- package/form/esm2020/lib/directives/koala-autofocus.directive.mjs +25 -0
- package/form/esm2020/lib/dynamic-form/builder/dynamic-form.builder.mjs +138 -0
- package/form/{esm2015/lib/dynamic-form/builder/fields/autocomplete.builder.js → esm2020/lib/dynamic-form/builder/fields/autocomplete.builder.mjs} +0 -0
- package/form/esm2020/lib/dynamic-form/builder/fields/field.base.mjs +148 -0
- package/form/{esm2015/lib/dynamic-form/builder/fields/field.builder.js → esm2020/lib/dynamic-form/builder/fields/field.builder.mjs} +0 -0
- package/form/esm2020/lib/dynamic-form/builder/fields/more-items.builder.mjs +57 -0
- package/form/esm2020/lib/dynamic-form/dynamic-form.component.mjs +581 -0
- package/form/{esm2015/lib/dynamic-form/enums/dynamic-form-type-field.enum.js → esm2020/lib/dynamic-form/enums/dynamic-form-type-field.enum.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/interfaces/koala-custom-validator-fn.interface.js → esm2020/lib/dynamic-form/interfaces/koala-custom-validator-fn.interface.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-autocomplete-options.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-autocomplete-options.interface.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-autocomplete-multiple-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-autocomplete-multiple-config.interface.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-config.interface.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-field.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-field.interface.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-more-itens-show-field-config.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-more-itens-show-field-config.interface.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-form-show-field.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-form-show-field.interface.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/interfaces/koala.dynamic-set-value.interface.js → esm2020/lib/dynamic-form/interfaces/koala.dynamic-set-value.interface.mjs} +0 -0
- package/form/esm2020/lib/dynamic-form/koala.dynamic-form.service.mjs +199 -0
- package/form/{esm2015/lib/dynamic-form/validators/autocomplete-selected.validator.js → esm2020/lib/dynamic-form/validators/autocomplete-selected.validator.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/validators/cnpj.validator.js → esm2020/lib/dynamic-form/validators/cnpj.validator.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/validators/cpf.validator.js → esm2020/lib/dynamic-form/validators/cpf.validator.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/validators/date-max.validator.js → esm2020/lib/dynamic-form/validators/date-max.validator.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/validators/date-min.validator.js → esm2020/lib/dynamic-form/validators/date-min.validator.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/validators/koala-dynamic-form-validator-result.helper.js → esm2020/lib/dynamic-form/validators/koala-dynamic-form-validator-result.helper.mjs} +0 -0
- package/form/{esm2015/lib/dynamic-form/validators/validation.helper.js → esm2020/lib/dynamic-form/validators/validation.helper.mjs} +0 -0
- package/form/{esm2015/lib/form.abstract.js → esm2020/lib/form.abstract.mjs} +0 -0
- package/form/esm2020/lib/koala.form.module.mjs +134 -0
- package/form/{esm2015/lib/show-invalid-fields/show-invalid-fields.js → esm2020/lib/show-invalid-fields/show-invalid-fields.mjs} +0 -0
- package/form/fesm2015/koalarx-ui-form.mjs +1575 -0
- package/form/fesm2015/koalarx-ui-form.mjs.map +1 -0
- package/form/fesm2020/koalarx-ui-form.mjs +1557 -0
- package/form/fesm2020/koalarx-ui-form.mjs.map +1 -0
- package/form/koalarx-ui-form.d.ts +1 -0
- package/form/lib/btn-submit/btn-submit.component.d.ts +3 -0
- package/form/lib/directives/koala-autofocus.directive.d.ts +3 -0
- package/form/lib/dynamic-form/dynamic-form.component.d.ts +7 -1
- package/form/lib/dynamic-form/koala.dynamic-form.service.d.ts +3 -0
- package/form/lib/koala.form.module.d.ts +23 -0
- package/form/package.json +18 -6
- package/icon/{esm2015/index.js → esm2020/index.mjs} +2 -1
- package/icon/{esm2015/koalarx-ui-icon.js → esm2020/koalarx-ui-icon.mjs} +0 -0
- package/icon/esm2020/lib/icon.component.mjs +46 -0
- package/icon/esm2020/lib/koala.icon.module.mjs +26 -0
- package/icon/esm2020/lib/koala.icon.type.mjs +2 -0
- package/icon/fesm2015/koalarx-ui-icon.mjs +77 -0
- package/icon/{esm2015/lib/icon.component.js → fesm2015/koalarx-ui-icon.mjs.map} +1 -45
- package/icon/fesm2020/koalarx-ui-icon.mjs +76 -0
- package/icon/{fesm2015/koalarx-ui-icon.js → fesm2020/koalarx-ui-icon.mjs.map} +1 -69
- package/icon/index.d.ts +1 -0
- package/icon/koalarx-ui-icon.d.ts +1 -0
- package/icon/lib/icon.component.d.ts +4 -1
- package/icon/lib/koala.icon.module.d.ts +6 -0
- package/icon/lib/koala.icon.type.d.ts +1 -0
- package/icon/package.json +18 -6
- package/icons-animated/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/icons-animated/esm2020/koalarx-ui-icons-animated.mjs +5 -0
- package/icons-animated/esm2020/lib/icons/downloading/downloading-icon-animated.component.mjs +23 -0
- package/icons-animated/esm2020/lib/icons/loading/loading-icon-animated.component.mjs +23 -0
- package/icons-animated/esm2020/lib/icons-animated.component.mjs +20 -0
- package/icons-animated/esm2020/lib/icons-animated.service.mjs +32 -0
- package/icons-animated/esm2020/lib/koala-icons-animated.module.mjs +32 -0
- package/icons-animated/fesm2015/koalarx-ui-icons-animated.mjs +122 -0
- package/icons-animated/fesm2015/koalarx-ui-icons-animated.mjs.map +1 -0
- package/icons-animated/fesm2020/koalarx-ui-icons-animated.mjs +120 -0
- package/icons-animated/fesm2020/koalarx-ui-icons-animated.mjs.map +1 -0
- package/icons-animated/koalarx-ui-icons-animated.d.ts +1 -1
- package/icons-animated/lib/icons/downloading/downloading-icon-animated.component.d.ts +5 -2
- package/icons-animated/lib/icons/loading/loading-icon-animated.component.d.ts +5 -2
- package/icons-animated/lib/icons-animated.component.d.ts +3 -0
- package/icons-animated/lib/icons-animated.service.d.ts +3 -0
- package/icons-animated/lib/koala-icons-animated.module.d.ts +8 -0
- package/icons-animated/package.json +18 -6
- package/list/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/list/{esm2015/koalarx-ui-list.js → esm2020/koalarx-ui-list.mjs} +0 -0
- package/list/{esm2015/lib/koala-list-btn-collapse-sub-list-config.interface.js → esm2020/lib/koala-list-btn-collapse-sub-list-config.interface.mjs} +0 -0
- package/list/{esm2015/lib/koala-list-filter.interface.js → esm2020/lib/koala-list-filter.interface.mjs} +0 -0
- package/list/{esm2015/lib/koala-list-form-filter.interface.js → esm2020/lib/koala-list-form-filter.interface.mjs} +0 -0
- package/list/{esm2015/lib/koala-list-item-menu-option.interface.js → esm2020/lib/koala-list-item-menu-option.interface.mjs} +0 -0
- package/list/{esm2015/lib/koala-list-item.interface.js → esm2020/lib/koala-list-item.interface.mjs} +0 -0
- package/list/{esm2015/lib/koala.list-config.interface.js → esm2020/lib/koala.list-config.interface.mjs} +0 -0
- package/list/esm2020/lib/koala.list.module.mjs +70 -0
- package/list/esm2020/lib/koala.list.service.mjs +15 -0
- package/list/esm2020/lib/list-builder/list.builder.mjs +97 -0
- package/list/esm2020/lib/list.abstract.mjs +157 -0
- package/list/esm2020/lib/list.component.mjs +171 -0
- package/list/esm2020/lib/providers/pagination/pagination.provider.mjs +32 -0
- package/list/fesm2015/koalarx-ui-list.mjs +559 -0
- package/list/fesm2015/koalarx-ui-list.mjs.map +1 -0
- package/list/fesm2020/koalarx-ui-list.mjs +529 -0
- package/list/fesm2020/koalarx-ui-list.mjs.map +1 -0
- package/list/koalarx-ui-list.d.ts +1 -0
- package/list/lib/koala.list.module.d.ts +15 -0
- package/list/lib/koala.list.service.d.ts +3 -0
- package/list/lib/list.component.d.ts +3 -0
- package/list/lib/providers/pagination/pagination.provider.d.ts +3 -0
- package/list/package.json +18 -6
- package/menu/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/menu/{esm2015/koalarx-ui-menu.js → esm2020/koalarx-ui-menu.mjs} +0 -0
- package/menu/{esm2015/lib/koala.menu-module.interface.js → esm2020/lib/koala.menu-module.interface.mjs} +0 -0
- package/menu/{esm2015/lib/koala.menu-tool.interface.js → esm2020/lib/koala.menu-tool.interface.mjs} +0 -0
- package/menu/esm2020/lib/koala.menu.module.mjs +38 -0
- package/menu/esm2020/lib/koala.menu.service.mjs +24 -0
- package/menu/esm2020/lib/menu.component.mjs +100 -0
- package/menu/fesm2015/koalarx-ui-menu.mjs +167 -0
- package/menu/fesm2015/koalarx-ui-menu.mjs.map +1 -0
- package/menu/fesm2020/koalarx-ui-menu.mjs +162 -0
- package/menu/fesm2020/koalarx-ui-menu.mjs.map +1 -0
- package/menu/koalarx-ui-menu.d.ts +1 -0
- package/menu/lib/koala.menu.module.d.ts +9 -0
- package/menu/lib/koala.menu.service.d.ts +3 -0
- package/menu/lib/menu.component.d.ts +6 -0
- package/menu/package.json +18 -6
- package/package.json +1 -1
- package/question/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/question/{esm2015/koalarx-ui-question.js → esm2020/koalarx-ui-question.mjs} +0 -0
- package/question/esm2020/lib/dialog-question.component.mjs +25 -0
- package/question/{esm2015/lib/koala-question-config.interface.js → esm2020/lib/koala-question-config.interface.mjs} +0 -0
- package/question/esm2020/lib/koala.question.module.mjs +42 -0
- package/question/esm2020/lib/koala.question.service.mjs +26 -0
- package/question/fesm2015/koalarx-ui-question.mjs +95 -0
- package/question/fesm2015/koalarx-ui-question.mjs.map +1 -0
- package/question/fesm2020/koalarx-ui-question.mjs +93 -0
- package/question/fesm2020/koalarx-ui-question.mjs.map +1 -0
- package/question/koalarx-ui-question.d.ts +1 -0
- package/question/lib/dialog-question.component.d.ts +3 -0
- package/question/lib/koala.question.module.d.ts +10 -0
- package/question/lib/koala.question.service.d.ts +3 -0
- package/question/package.json +18 -6
- package/snackbar/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/snackbar/{esm2015/koalarx-ui-snackbar.js → esm2020/koalarx-ui-snackbar.mjs} +0 -0
- package/snackbar/esm2020/lib/koala.snackbar.component.mjs +22 -0
- package/snackbar/{esm2015/lib/koala.snackbar.interface.js → esm2020/lib/koala.snackbar.interface.mjs} +0 -0
- package/snackbar/esm2020/lib/koala.snackbar.module.mjs +38 -0
- package/snackbar/esm2020/lib/koala.snackbar.service.mjs +35 -0
- package/snackbar/fesm2015/koalarx-ui-snackbar.mjs +95 -0
- package/snackbar/fesm2015/koalarx-ui-snackbar.mjs.map +1 -0
- package/snackbar/fesm2020/koalarx-ui-snackbar.mjs +93 -0
- package/snackbar/fesm2020/koalarx-ui-snackbar.mjs.map +1 -0
- package/snackbar/koalarx-ui-snackbar.d.ts +1 -0
- package/snackbar/lib/koala.snackbar.component.d.ts +3 -0
- package/snackbar/lib/koala.snackbar.module.d.ts +8 -0
- package/snackbar/lib/koala.snackbar.service.d.ts +3 -0
- package/snackbar/package.json +18 -6
- package/alert/bundles/koalarx-ui-alert.umd.js +0 -153
- package/alert/bundles/koalarx-ui-alert.umd.js.map +0 -1
- package/alert/esm2015/lib/dialog-alert.component.js +0 -43
- package/alert/esm2015/lib/koala.alert.module.js +0 -31
- package/alert/esm2015/lib/koala.alert.service.js +0 -21
- package/alert/fesm2015/koalarx-ui-alert.js +0 -121
- package/alert/fesm2015/koalarx-ui-alert.js.map +0 -1
- package/alert/koalarx-ui-alert.metadata.json +0 -1
- package/button/bundles/koalarx-ui-button.umd.js +0 -71
- package/button/bundles/koalarx-ui-button.umd.js.map +0 -1
- package/button/esm2015/lib/button.component.js +0 -31
- package/button/esm2015/lib/koala.button.module.js +0 -27
- package/button/fesm2015/koalarx-ui-button.js +0 -63
- package/button/fesm2015/koalarx-ui-button.js.map +0 -1
- package/button/koalarx-ui-button.metadata.json +0 -1
- package/common/bundles/koalarx-ui-common.umd.js +0 -481
- package/common/bundles/koalarx-ui-common.umd.js.map +0 -1
- package/common/esm2015/lib/services/csv/koala.csv.service.js +0 -38
- package/common/esm2015/lib/services/xlsx/koala.xlsx.service.js +0 -74
- package/common/fesm2015/koalarx-ui-common.js.map +0 -1
- package/common/koalarx-ui-common.metadata.json +0 -1
- package/core/bundles/koalarx-ui-core.umd.js +0 -1716
- package/core/bundles/koalarx-ui-core.umd.js.map +0 -1
- package/core/esm2015/index.js +0 -34
- package/core/esm2015/koalarx-ui-core.js +0 -7
- package/core/esm2015/lib/loader/loader-bar-page.component.js +0 -22
- package/core/esm2015/lib/ngx-koala.module.js +0 -35
- package/core/esm2015/lib/page/koala.page.module.js +0 -46
- package/core/esm2015/lib/page/notifications/notification.component.js +0 -43
- package/core/esm2015/lib/page/page.component.js +0 -396
- package/core/esm2015/lib/router/koala.parameter-hash-location-stategy.js +0 -16
- package/core/esm2015/lib/services/api-requester/factory/koala.response.factory.js +0 -48
- package/core/esm2015/lib/services/api-requester/koala.api-requester.base.js +0 -70
- package/core/esm2015/lib/services/api-requester/koala.api-requester.service.js +0 -134
- package/core/esm2015/lib/services/loader/koala.loader.service.js +0 -32
- package/core/esm2015/lib/services/openid/koala.oauth.config.js +0 -33
- package/core/esm2015/lib/services/openid/koala.oauth2.service.js +0 -201
- package/core/esm2015/lib/services/request/koala.request.service.js +0 -53
- package/core/esm2015/lib/services/token/token.factory.js +0 -31
- package/core/fesm2015/koalarx-ui-core.js.map +0 -1
- package/core/koalarx-ui-core.metadata.json +0 -1
- package/dialog/bundles/koalarx-ui-dialog.umd.js +0 -139
- package/dialog/bundles/koalarx-ui-dialog.umd.js.map +0 -1
- package/dialog/esm2015/lib/dialog.component.js +0 -18
- package/dialog/esm2015/lib/koala.dialog.module.js +0 -25
- package/dialog/esm2015/lib/koala.dialog.service.js +0 -61
- package/dialog/fesm2015/koalarx-ui-dialog.js +0 -107
- package/dialog/fesm2015/koalarx-ui-dialog.js.map +0 -1
- package/dialog/koalarx-ui-dialog.metadata.json +0 -1
- package/dynamic-component/bundles/koalarx-ui-dynamic-component.umd.js +0 -95
- package/dynamic-component/bundles/koalarx-ui-dynamic-component.umd.js.map +0 -1
- package/dynamic-component/esm2015/lib/koala-dynamic-component.directive.js +0 -15
- package/dynamic-component/esm2015/lib/koala-dynamic-component.factory.js +0 -38
- package/dynamic-component/esm2015/lib/koala-dynamic-component.module.js +0 -17
- package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.js +0 -79
- package/dynamic-component/fesm2015/koalarx-ui-dynamic-component.js.map +0 -1
- package/dynamic-component/koalarx-ui-dynamic-component.metadata.json +0 -1
- package/file-button/bundles/koalarx-ui-file-button.umd.js +0 -553
- package/file-button/bundles/koalarx-ui-file-button.umd.js.map +0 -1
- package/file-button/esm2015/lib/file-button.component.js +0 -118
- package/file-button/esm2015/lib/koala.btn-file.service.js +0 -26
- package/file-button/esm2015/lib/koala.file-button.module.js +0 -25
- package/file-button/fesm2015/koalarx-ui-file-button.js +0 -171
- package/file-button/fesm2015/koalarx-ui-file-button.js.map +0 -1
- package/file-button/koalarx-ui-file-button.metadata.json +0 -1
- package/folder-page/bundles/koalarx-ui-folder-page.umd.js +0 -97
- package/folder-page/bundles/koalarx-ui-folder-page.umd.js.map +0 -1
- package/folder-page/esm2015/lib/folder.component.js +0 -56
- package/folder-page/esm2015/lib/koala.folder-page.module.js +0 -27
- package/folder-page/fesm2015/koalarx-ui-folder-page.js +0 -88
- package/folder-page/fesm2015/koalarx-ui-folder-page.js.map +0 -1
- package/folder-page/koalarx-ui-folder-page.metadata.json +0 -1
- package/form/bundles/koalarx-ui-form.umd.js +0 -1969
- package/form/bundles/koalarx-ui-form.umd.js.map +0 -1
- package/form/esm2015/lib/btn-submit/btn-submit.component.js +0 -39
- package/form/esm2015/lib/directives/koala-autofocus.directive.js +0 -25
- package/form/esm2015/lib/dynamic-form/builder/dynamic-form.builder.js +0 -141
- package/form/esm2015/lib/dynamic-form/builder/fields/field.base.js +0 -151
- package/form/esm2015/lib/dynamic-form/builder/fields/more-items.builder.js +0 -57
- package/form/esm2015/lib/dynamic-form/dynamic-form.component.js +0 -564
- package/form/esm2015/lib/dynamic-form/koala.dynamic-form.service.js +0 -204
- package/form/esm2015/lib/koala.form.module.js +0 -69
- package/form/fesm2015/koalarx-ui-form.js +0 -1487
- package/form/fesm2015/koalarx-ui-form.js.map +0 -1
- package/form/koalarx-ui-form.metadata.json +0 -1
- package/icon/bundles/koalarx-ui-icon.umd.js +0 -76
- package/icon/bundles/koalarx-ui-icon.umd.js.map +0 -1
- package/icon/esm2015/lib/koala.icon.module.js +0 -19
- package/icon/fesm2015/koalarx-ui-icon.js.map +0 -1
- package/icon/koalarx-ui-icon.metadata.json +0 -1
- package/icons-animated/bundles/koalarx-ui-icons-animated.umd.js +0 -138
- package/icons-animated/bundles/koalarx-ui-icons-animated.umd.js.map +0 -1
- package/icons-animated/esm2015/koalarx-ui-icons-animated.js +0 -6
- package/icons-animated/esm2015/lib/icons/downloading/downloading-icon-animated.component.js +0 -28
- package/icons-animated/esm2015/lib/icons/loading/loading-icon-animated.component.js +0 -28
- package/icons-animated/esm2015/lib/icons-animated.component.js +0 -15
- package/icons-animated/esm2015/lib/icons-animated.service.js +0 -29
- package/icons-animated/esm2015/lib/koala-icons-animated.module.js +0 -23
- package/icons-animated/fesm2015/koalarx-ui-icons-animated.js +0 -121
- package/icons-animated/fesm2015/koalarx-ui-icons-animated.js.map +0 -1
- package/icons-animated/koalarx-ui-icons-animated.metadata.json +0 -1
- package/list/bundles/koalarx-ui-list.umd.js +0 -914
- package/list/bundles/koalarx-ui-list.umd.js.map +0 -1
- package/list/esm2015/lib/koala.list.module.js +0 -42
- package/list/esm2015/lib/koala.list.service.js +0 -13
- package/list/esm2015/lib/list-builder/list.builder.js +0 -101
- package/list/esm2015/lib/list.abstract.js +0 -174
- package/list/esm2015/lib/list.component.js +0 -166
- package/list/esm2015/lib/providers/pagination/pagination.provider.js +0 -30
- package/list/fesm2015/koalarx-ui-list.js +0 -514
- package/list/fesm2015/koalarx-ui-list.js.map +0 -1
- package/list/koalarx-ui-list.metadata.json +0 -1
- package/menu/bundles/koalarx-ui-menu.umd.js +0 -511
- package/menu/bundles/koalarx-ui-menu.umd.js.map +0 -1
- package/menu/esm2015/lib/koala.menu.module.js +0 -25
- package/menu/esm2015/lib/koala.menu.service.js +0 -22
- package/menu/esm2015/lib/menu.component.js +0 -104
- package/menu/fesm2015/koalarx-ui-menu.js +0 -153
- package/menu/fesm2015/koalarx-ui-menu.js.map +0 -1
- package/menu/koalarx-ui-menu.metadata.json +0 -1
- package/question/bundles/koalarx-ui-question.umd.js +0 -104
- package/question/bundles/koalarx-ui-question.umd.js.map +0 -1
- package/question/esm2015/lib/dialog-question.component.js +0 -20
- package/question/esm2015/lib/koala.question.module.js +0 -27
- package/question/esm2015/lib/koala.question.service.js +0 -28
- package/question/fesm2015/koalarx-ui-question.js +0 -77
- package/question/fesm2015/koalarx-ui-question.js.map +0 -1
- package/question/koalarx-ui-question.metadata.json +0 -1
- package/snackbar/bundles/koalarx-ui-snackbar.umd.js +0 -93
- package/snackbar/bundles/koalarx-ui-snackbar.umd.js.map +0 -1
- package/snackbar/esm2015/lib/koala.snackbar.component.js +0 -20
- package/snackbar/esm2015/lib/koala.snackbar.module.js +0 -26
- package/snackbar/esm2015/lib/koala.snackbar.service.js +0 -35
- package/snackbar/fesm2015/koalarx-ui-snackbar.js +0 -81
- package/snackbar/fesm2015/koalarx-ui-snackbar.js.map +0 -1
- package/snackbar/koalarx-ui-snackbar.metadata.json +0 -1
|
@@ -1,564 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { FormBuilder, Validators } from '@angular/forms';
|
|
3
|
-
import { DynamicFormTypeFieldEnum } from './enums/dynamic-form-type-field.enum';
|
|
4
|
-
import { CpfValidator } from './validators/cpf.validator';
|
|
5
|
-
import { CnpjValidator } from './validators/cnpj.validator';
|
|
6
|
-
import { ChangeDetectionStrategy, Component, Input, ViewChild } from '@angular/core';
|
|
7
|
-
import { FormAbstract } from '../form.abstract';
|
|
8
|
-
import { debounceTime } from 'rxjs/operators';
|
|
9
|
-
import { BehaviorSubject } from 'rxjs';
|
|
10
|
-
import { AutocompleteSelectedValidator } from './validators/autocomplete-selected.validator';
|
|
11
|
-
import { KoalaDynamicFormService } from './koala.dynamic-form.service';
|
|
12
|
-
import { delay } from "@koalarx/utils/operators/delay";
|
|
13
|
-
import { koala } from "@koalarx/utils";
|
|
14
|
-
import { DateMinValidator } from "./validators/date-min.validator";
|
|
15
|
-
import { DateMaxValidator } from "./validators/date-max.validator";
|
|
16
|
-
import { KoalaLanguageHelper } from "@koalarx/ui/core";
|
|
17
|
-
export class DynamicFormComponent extends FormAbstract {
|
|
18
|
-
constructor(fb, dynamicFormService) {
|
|
19
|
-
super(() => this.form);
|
|
20
|
-
this.fb = fb;
|
|
21
|
-
this.dynamicFormService = dynamicFormService;
|
|
22
|
-
this.tabIndexStart = 1;
|
|
23
|
-
this.typeField = DynamicFormTypeFieldEnum;
|
|
24
|
-
this.hoursAndMinutesMask = '00:000';
|
|
25
|
-
this.errorMessage = KoalaLanguageHelper;
|
|
26
|
-
}
|
|
27
|
-
ngOnInit() {
|
|
28
|
-
var _a;
|
|
29
|
-
if (!this.form.get('formData')) {
|
|
30
|
-
this.form.addControl('formData', this.fb.array([]));
|
|
31
|
-
}
|
|
32
|
-
this.controls = this.form.get('formData');
|
|
33
|
-
(_a = this.formConfig) === null || _a === void 0 ? void 0 : _a.forEach((config, indexConfig) => {
|
|
34
|
-
const newFormGroup = this.newControl(config);
|
|
35
|
-
if (config.asyncValidators) {
|
|
36
|
-
newFormGroup.get('value').setAsyncValidators(config.asyncValidators);
|
|
37
|
-
}
|
|
38
|
-
newFormGroup.get('value').updateValueAndValidity();
|
|
39
|
-
if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
|
|
40
|
-
const formGroupDynamicFormsSubject = newFormGroup.get('dynamicFormConfig').value;
|
|
41
|
-
formGroupDynamicFormsSubject.subscribe(formGroupConfig => {
|
|
42
|
-
if (formGroupConfig) {
|
|
43
|
-
formGroupConfig.form.valueChanges.subscribe(() => {
|
|
44
|
-
if (formGroupConfig.form.valid && (config.valueChanges || this.showFieldsMoreItensConfig)) {
|
|
45
|
-
const value = this.dynamicFormService.emitData(formGroupConfig.form);
|
|
46
|
-
newFormGroup.get('value').setValue(value);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
if (config.valueChanges ||
|
|
53
|
-
config.type === DynamicFormTypeFieldEnum.autocomplete ||
|
|
54
|
-
config.type === DynamicFormTypeFieldEnum.dynamicForm ||
|
|
55
|
-
this.showFieldsMoreItensConfig) {
|
|
56
|
-
if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
|
|
57
|
-
const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
|
|
58
|
-
if (autocompleteOptionsSubject) {
|
|
59
|
-
autocompleteOptionsSubject.subscribe(options => newFormGroup.get('autocompleteOptionsFiltered').value.next(options));
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
newFormGroup.get('value')
|
|
63
|
-
.valueChanges
|
|
64
|
-
.pipe(debounceTime(300))
|
|
65
|
-
.subscribe((value) => __awaiter(this, void 0, void 0, function* () {
|
|
66
|
-
var _a, _b, _c, _d;
|
|
67
|
-
yield this.setConfigDynamicForm(newFormGroup);
|
|
68
|
-
if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
|
|
69
|
-
if (value && (value.hasOwnProperty('value') &&
|
|
70
|
-
value.hasOwnProperty('name') &&
|
|
71
|
-
Object.keys(value).length === 2) || (Array.isArray(value) &&
|
|
72
|
-
newFormGroup.get('multiple').value)) {
|
|
73
|
-
if (newFormGroup.get('multiple').value) {
|
|
74
|
-
if (Array.isArray(value)) {
|
|
75
|
-
newFormGroup.get('autocompleteSelectedValue').setValue(value);
|
|
76
|
-
newFormGroup.get('value').setValue(value[value.length - 1], { emitEvent: false });
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
if (this.validateAutocompleteSelect(newFormGroup.get('autocompleteSelectedValue').value, value)) {
|
|
80
|
-
newFormGroup.get('autocompleteSelectedValue').value.push(value);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
if ((_a = this.autocompleteInput) === null || _a === void 0 ? void 0 : _a.nativeElement) {
|
|
84
|
-
this.autocompleteInput.nativeElement.value = '';
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
newFormGroup.get('autocompleteSelectedValue').setValue(value);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else if (!newFormGroup.get('multiple').value) {
|
|
92
|
-
newFormGroup.get('autocompleteSelectedValue').setValue((_c = (_b = koala(this.formConfig)
|
|
93
|
-
.array()
|
|
94
|
-
.filter(newFormGroup.get('name').value, 'name')
|
|
95
|
-
.getValue()[0]) === null || _b === void 0 ? void 0 : _b.autocompleteDefaultValueOnClear) !== null && _c !== void 0 ? _c : null);
|
|
96
|
-
}
|
|
97
|
-
if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
|
|
98
|
-
if (config.autocompleteType === 'all') {
|
|
99
|
-
const autocompleteOptionsSubject = newFormGroup.get('autocompleteOptions').value;
|
|
100
|
-
newFormGroup.get('autocompleteOptionsFiltered').value.next(this.autocompleteFilter(autocompleteOptionsSubject.value, value));
|
|
101
|
-
}
|
|
102
|
-
else if (config.autocompleteType === 'onDemand' && typeof value !== "object") {
|
|
103
|
-
const loader = newFormGroup.get('autocompleteLoading').value;
|
|
104
|
-
loader.next(true);
|
|
105
|
-
config.autocompleteFilter(value).subscribe(options => {
|
|
106
|
-
newFormGroup.get('autocompleteOptionsFiltered').value.next(options);
|
|
107
|
-
loader.next(false);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (config.valueChanges) {
|
|
113
|
-
if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
|
|
114
|
-
config.valueChanges((newFormGroup.get('multiple').value ?
|
|
115
|
-
newFormGroup.get('autocompleteSelectedValue').value.map(item => item.value) :
|
|
116
|
-
(_d = newFormGroup.get('autocompleteSelectedValue').value) === null || _d === void 0 ? void 0 : _d.value));
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
config.valueChanges(value);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}));
|
|
123
|
-
}
|
|
124
|
-
this.controls.push(newFormGroup);
|
|
125
|
-
if (config.moreItemsConfig) {
|
|
126
|
-
if (config.moreItemsMinItems > 0) {
|
|
127
|
-
for (let min = 0; min < config.moreItemsMinItems; min++) {
|
|
128
|
-
if (min <= config.moreItemsMaxItems) {
|
|
129
|
-
this.addMoreItem(indexConfig);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
if (config.moreItemsConfig.setValues) {
|
|
134
|
-
config.moreItemsConfig
|
|
135
|
-
.setValues
|
|
136
|
-
.subscribe((values) => __awaiter(this, void 0, void 0, function* () {
|
|
137
|
-
if (values.length > 0) {
|
|
138
|
-
values.forEach((itemValue, indexValue) => {
|
|
139
|
-
if (!this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue]) {
|
|
140
|
-
this.addMoreItem(indexConfig);
|
|
141
|
-
}
|
|
142
|
-
setTimeout(() => {
|
|
143
|
-
this.setValuesOnFields(itemValue, this.controls.controls[indexConfig].get('moreItemsConfig').value[indexValue].form);
|
|
144
|
-
}, 300);
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
}));
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
if (this.showFields) {
|
|
152
|
-
this.changeVisibilityFields(this.showFields, this.form);
|
|
153
|
-
}
|
|
154
|
-
if (this.setValues) {
|
|
155
|
-
this.setValuesOnFields(this.setValues, this.form);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
hoursAndMinutesApplyMask(index, event) {
|
|
159
|
-
var _a;
|
|
160
|
-
const control = (_a = this.controls) === null || _a === void 0 ? void 0 : _a.controls[index];
|
|
161
|
-
const type = control === null || control === void 0 ? void 0 : control.get('type').value;
|
|
162
|
-
if (type === DynamicFormTypeFieldEnum.hoursAndMinutes) {
|
|
163
|
-
const value = control === null || control === void 0 ? void 0 : control.get('value').value;
|
|
164
|
-
if (event.key == 'Backspace' && value.length < 6) {
|
|
165
|
-
this.hoursAndMinutesMask = '00:000';
|
|
166
|
-
}
|
|
167
|
-
else if (event.key != 'Backspace' && value.length >= 6) {
|
|
168
|
-
this.hoursAndMinutesMask = '000:00';
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
passwordView(index) {
|
|
173
|
-
var _a;
|
|
174
|
-
const control = (_a = this.controls) === null || _a === void 0 ? void 0 : _a.controls[index];
|
|
175
|
-
const hidePassword = !(control === null || control === void 0 ? void 0 : control.get('hidePassword').value);
|
|
176
|
-
control === null || control === void 0 ? void 0 : control.get('hidePassword').setValue(hidePassword);
|
|
177
|
-
control === null || control === void 0 ? void 0 : control.get('type').setValue(hidePassword ?
|
|
178
|
-
DynamicFormTypeFieldEnum.password :
|
|
179
|
-
DynamicFormTypeFieldEnum.text);
|
|
180
|
-
}
|
|
181
|
-
addMoreItem(propIndex) {
|
|
182
|
-
if (this.controls.controls[propIndex].get('moreItemsConfig').value.length < this.controls.controls[propIndex].get('moreItemsMaxItems').value) {
|
|
183
|
-
const formGroup = this.fb.group({});
|
|
184
|
-
this.controls.controls[propIndex].get('moreItemsConfig').value.push({
|
|
185
|
-
form: formGroup,
|
|
186
|
-
formConfig: this.formConfig[propIndex].moreItemsConfig.formConfig,
|
|
187
|
-
showFields: new BehaviorSubject([]),
|
|
188
|
-
showFieldsMoreItensConfig: this.formConfig[propIndex].moreItemsConfig.showFieldsConfig
|
|
189
|
-
});
|
|
190
|
-
this.controls.controls[propIndex].get('moreItemsExpanded').setValue(this.controls.controls[propIndex].get('moreItemsConfig').value.length - 1);
|
|
191
|
-
const formArrayMoreItems = this.controls.controls[propIndex].get('moreItemsFormGroup');
|
|
192
|
-
formArrayMoreItems.push(formGroup);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
removeMoreItem(propIndex, removeIndex) {
|
|
196
|
-
const expandedItemIndex = removeIndex - 1;
|
|
197
|
-
this.controls.controls[propIndex].get('moreItemsConfig').value.splice(removeIndex, 1);
|
|
198
|
-
setTimeout(() => {
|
|
199
|
-
this.controls.controls[propIndex].get('moreItemsExpanded').setValue((expandedItemIndex < 0) ? 0 : expandedItemIndex);
|
|
200
|
-
}, 50);
|
|
201
|
-
}
|
|
202
|
-
clearAutocomplete(propIndex) {
|
|
203
|
-
var _a, _b;
|
|
204
|
-
if (this.controls.controls[propIndex].get('multiple').value) {
|
|
205
|
-
this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
|
|
206
|
-
this.controls.controls[propIndex].get('value').setValue(null);
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue((_a = this.formConfig[propIndex].autocompleteDefaultValueOnClear) !== null && _a !== void 0 ? _a : null);
|
|
210
|
-
this.controls.controls[propIndex].get('value').setValue((_b = this.formConfig[propIndex].autocompleteDefaultValueOnClear) !== null && _b !== void 0 ? _b : null);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
display(option) {
|
|
214
|
-
return option ? option.name : undefined;
|
|
215
|
-
}
|
|
216
|
-
removeOptionOnAutocomplete(propIndex, option) {
|
|
217
|
-
const value = this.controls.controls[propIndex].get('autocompleteSelectedValue').value.filter(item => item !== option);
|
|
218
|
-
this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue(value);
|
|
219
|
-
if (value.length === 0) {
|
|
220
|
-
this.controls.controls[propIndex].get('autocompleteSelectedValue').setValue([]);
|
|
221
|
-
this.controls.controls[propIndex].get('value').setValue(null);
|
|
222
|
-
}
|
|
223
|
-
else if (this.formConfig[propIndex].valueChanges) {
|
|
224
|
-
this.formConfig[propIndex].valueChanges(value.map(item => item.value));
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
getColorChip(config) {
|
|
228
|
-
return config.color;
|
|
229
|
-
}
|
|
230
|
-
newControl(config) {
|
|
231
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
|
|
232
|
-
let validators = (_a = config.syncValidators) !== null && _a !== void 0 ? _a : [];
|
|
233
|
-
let value = (_b = config.value) !== null && _b !== void 0 ? _b : '';
|
|
234
|
-
let valueSelectedAutocomplete = (config.multiple ? [] : ((_c = config.autocompleteDefaultValueOnClear) !== null && _c !== void 0 ? _c : null));
|
|
235
|
-
if (config.required === true)
|
|
236
|
-
validators.push(Validators.required);
|
|
237
|
-
if (config.min && typeof config.min === "number")
|
|
238
|
-
validators.push(Validators.min(config.min));
|
|
239
|
-
if (config.max && typeof config.max === "number")
|
|
240
|
-
validators.push(Validators.max(config.max));
|
|
241
|
-
if (config.type === DynamicFormTypeFieldEnum.date ||
|
|
242
|
-
config.type === DynamicFormTypeFieldEnum.datetime ||
|
|
243
|
-
config.type === DynamicFormTypeFieldEnum.time) {
|
|
244
|
-
if (config.min && typeof config.min === "string") {
|
|
245
|
-
validators.push(DateMinValidator(config.min));
|
|
246
|
-
}
|
|
247
|
-
if (config.max && typeof config.max === "string") {
|
|
248
|
-
validators.push(DateMaxValidator(config.max));
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
if (config.minLength)
|
|
252
|
-
validators.push(Validators.minLength(config.minLength));
|
|
253
|
-
if (config.maxLength)
|
|
254
|
-
validators.push(Validators.maxLength(config.maxLength));
|
|
255
|
-
if (config.type === DynamicFormTypeFieldEnum.cpf) {
|
|
256
|
-
validators.push(CpfValidator);
|
|
257
|
-
}
|
|
258
|
-
else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
|
|
259
|
-
validators.push(CnpjValidator);
|
|
260
|
-
}
|
|
261
|
-
else if (config.type === DynamicFormTypeFieldEnum.email) {
|
|
262
|
-
validators.push(Validators.email);
|
|
263
|
-
}
|
|
264
|
-
else if (config.type === DynamicFormTypeFieldEnum.autocomplete) {
|
|
265
|
-
if (value) {
|
|
266
|
-
valueSelectedAutocomplete = value;
|
|
267
|
-
value = (config.multiple ? valueSelectedAutocomplete[0] : value);
|
|
268
|
-
}
|
|
269
|
-
if (config.required === true) {
|
|
270
|
-
validators.push(AutocompleteSelectedValidator);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
else if (config.type === DynamicFormTypeFieldEnum.checkbox) {
|
|
274
|
-
value = (_d = config.value) !== null && _d !== void 0 ? _d : false;
|
|
275
|
-
}
|
|
276
|
-
if (config.type === DynamicFormTypeFieldEnum.hoursAndMinutes &&
|
|
277
|
-
value.length >= 6) {
|
|
278
|
-
this.hoursAndMinutesMask = '000:00';
|
|
279
|
-
}
|
|
280
|
-
if (config.dynamicFormConfig) {
|
|
281
|
-
const cloneDynamicFormConfig = {};
|
|
282
|
-
Object.assign(cloneDynamicFormConfig, config.dynamicFormConfig);
|
|
283
|
-
cloneDynamicFormConfig.form = config.dynamicFormConfig.form;
|
|
284
|
-
config.dynamicFormConfig = cloneDynamicFormConfig;
|
|
285
|
-
}
|
|
286
|
-
if (config.show === false) {
|
|
287
|
-
validators = [];
|
|
288
|
-
}
|
|
289
|
-
const field = this.fb.group({
|
|
290
|
-
show: [new BehaviorSubject((_e = config.show) !== null && _e !== void 0 ? _e : true)],
|
|
291
|
-
label: [config.label],
|
|
292
|
-
name: [config.name],
|
|
293
|
-
type: [config.type],
|
|
294
|
-
fileButtonConfig: [{
|
|
295
|
-
icon: (_g = (_f = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _f === void 0 ? void 0 : _f.icon) !== null && _g !== void 0 ? _g : 'attach_file',
|
|
296
|
-
text: (_j = (_h = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _h === void 0 ? void 0 : _h.text) !== null && _j !== void 0 ? _j : 'Clique para anexar arquivos',
|
|
297
|
-
backgroundColor: (_l = (_k = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _k === void 0 ? void 0 : _k.backgroundColor) !== null && _l !== void 0 ? _l : 'white',
|
|
298
|
-
color: (_o = (_m = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _m === void 0 ? void 0 : _m.color) !== null && _o !== void 0 ? _o : 'blue',
|
|
299
|
-
accept: (_q = (_p = config === null || config === void 0 ? void 0 : config.fileButtonConfig) === null || _p === void 0 ? void 0 : _p.accept) !== null && _q !== void 0 ? _q : '*'
|
|
300
|
-
}],
|
|
301
|
-
dynamicFormConfig: [new BehaviorSubject(config.dynamicFormConfig)],
|
|
302
|
-
dynamicFormGroup: this.fb.array([]),
|
|
303
|
-
appearance: [config.appearance],
|
|
304
|
-
floatLabel: [config.floatLabel],
|
|
305
|
-
placeholder: [config.placeholder],
|
|
306
|
-
class: [config.class],
|
|
307
|
-
fieldClass: [config.fieldClass],
|
|
308
|
-
textHint: [config.textHint],
|
|
309
|
-
required: [(_r = config.required) !== null && _r !== void 0 ? _r : false],
|
|
310
|
-
min: [(_s = config.min) !== null && _s !== void 0 ? _s : 0],
|
|
311
|
-
max: [(_t = config.max) !== null && _t !== void 0 ? _t : 99999999999],
|
|
312
|
-
minLength: [(_u = config.minLength) !== null && _u !== void 0 ? _u : 0],
|
|
313
|
-
maxLength: [(_v = config.maxLength) !== null && _v !== void 0 ? _v : 255],
|
|
314
|
-
disabled: [(_w = config.disabled) !== null && _w !== void 0 ? _w : false],
|
|
315
|
-
focus: [(_x = config.focus) !== null && _x !== void 0 ? _x : false],
|
|
316
|
-
multiple: [(_y = config.multiple) !== null && _y !== void 0 ? _y : false],
|
|
317
|
-
opcoesSelect: [(_z = config.opcoesSelect) !== null && _z !== void 0 ? _z : []],
|
|
318
|
-
hidePassword: config.type === DynamicFormTypeFieldEnum.password ? true : null,
|
|
319
|
-
moreItemsButtonIconAddlabel: [config.moreItemsButtonIconAddlabel],
|
|
320
|
-
moreItemsMinItems: [(_0 = config.moreItemsMinItems) !== null && _0 !== void 0 ? _0 : 0],
|
|
321
|
-
moreItemsMaxItems: [(_1 = config.moreItemsMaxItems) !== null && _1 !== void 0 ? _1 : 100],
|
|
322
|
-
moreItemsIcon: [config.moreItemsIcon],
|
|
323
|
-
moreItemsIconFontColor: [config.moreItemsIconFontColor],
|
|
324
|
-
moreItemsIconBackgroundColor: [config.moreItemsIconBackgroundColor],
|
|
325
|
-
moreItemsExpanded: [''],
|
|
326
|
-
moreItemsConfig: [[]],
|
|
327
|
-
moreItemsFormGroup: this.fb.array([]),
|
|
328
|
-
autocompleteLoading: [new BehaviorSubject(false)],
|
|
329
|
-
autocompleteOptions: [config.autocompleteOptions],
|
|
330
|
-
autocompleteMultipleConfig: [config.autocompleteMultipleConfig],
|
|
331
|
-
autocompleteOptionsFiltered: [new BehaviorSubject([])],
|
|
332
|
-
autocompleteSelectedValue: [valueSelectedAutocomplete],
|
|
333
|
-
textLogs: [config === null || config === void 0 ? void 0 : config.textObs],
|
|
334
|
-
customMasc: [config === null || config === void 0 ? void 0 : config.customMasc],
|
|
335
|
-
customMascThousandSeparator: [(_2 = config === null || config === void 0 ? void 0 : config.customMascThousandSeparator) !== null && _2 !== void 0 ? _2 : ''],
|
|
336
|
-
customMascSuffix: [(_3 = config === null || config === void 0 ? void 0 : config.customMascSuffix) !== null && _3 !== void 0 ? _3 : ''],
|
|
337
|
-
customMascPrefix: [(_4 = config === null || config === void 0 ? void 0 : config.customMascPrefix) !== null && _4 !== void 0 ? _4 : ''],
|
|
338
|
-
value: [{ value, disabled: config.disabled }, validators, config.asyncValidators]
|
|
339
|
-
});
|
|
340
|
-
if (config.autocompleteType === "onDemand") {
|
|
341
|
-
const loader = field.get('autocompleteLoading').value;
|
|
342
|
-
loader.next(true);
|
|
343
|
-
config.autocompleteFilter('').subscribe(options => {
|
|
344
|
-
field.get('autocompleteOptionsFiltered').value.next(options);
|
|
345
|
-
loader.next(false);
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
return field;
|
|
349
|
-
}
|
|
350
|
-
setValuesOnFields(subject, form) {
|
|
351
|
-
subject.subscribe(item => {
|
|
352
|
-
if (item) {
|
|
353
|
-
const formArray = form.get('formData');
|
|
354
|
-
for (const prop of item.values()) {
|
|
355
|
-
this.setValueByProp(formArray, prop);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
changeVisibilityFields(subject, form) {
|
|
361
|
-
subject.pipe(debounceTime(5)).subscribe(item => {
|
|
362
|
-
var _a, _b, _c;
|
|
363
|
-
if (item) {
|
|
364
|
-
const formArray = form.get('formData');
|
|
365
|
-
for (const prop of item.values()) {
|
|
366
|
-
for (const [indexControl, control] of formArray.controls.entries()) {
|
|
367
|
-
if (control.get('name').value === prop.name) {
|
|
368
|
-
control.get('show').value.next(prop.show);
|
|
369
|
-
const config = (_a = this.formConfig[indexControl]) !== null && _a !== void 0 ? _a : null;
|
|
370
|
-
if (prop.show) {
|
|
371
|
-
let validators = [];
|
|
372
|
-
if (config) {
|
|
373
|
-
if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
|
|
374
|
-
const formArrayMoreItems = control.get('dynamicFormGroup');
|
|
375
|
-
formArrayMoreItems.push((_b = config === null || config === void 0 ? void 0 : config.dynamicFormConfig) === null || _b === void 0 ? void 0 : _b.form);
|
|
376
|
-
}
|
|
377
|
-
else {
|
|
378
|
-
validators = (_c = config.syncValidators) !== null && _c !== void 0 ? _c : [];
|
|
379
|
-
if (config.required === true) {
|
|
380
|
-
validators.push(Validators.required);
|
|
381
|
-
}
|
|
382
|
-
if (config.type === DynamicFormTypeFieldEnum.cpf) {
|
|
383
|
-
validators.push(CpfValidator);
|
|
384
|
-
}
|
|
385
|
-
else if (config.type === DynamicFormTypeFieldEnum.cnpj) {
|
|
386
|
-
validators.push(CnpjValidator);
|
|
387
|
-
}
|
|
388
|
-
else if (config.type === DynamicFormTypeFieldEnum.email) {
|
|
389
|
-
validators.push(Validators.email);
|
|
390
|
-
}
|
|
391
|
-
else if (config.required === true &&
|
|
392
|
-
config.type === DynamicFormTypeFieldEnum.autocomplete) {
|
|
393
|
-
validators.push(AutocompleteSelectedValidator);
|
|
394
|
-
}
|
|
395
|
-
if (config.min && typeof config.min === "number")
|
|
396
|
-
validators.push(Validators.min(config.min));
|
|
397
|
-
if (config.max && typeof config.max === "number")
|
|
398
|
-
validators.push(Validators.max(config.max));
|
|
399
|
-
if (config.type === DynamicFormTypeFieldEnum.date ||
|
|
400
|
-
config.type === DynamicFormTypeFieldEnum.datetime ||
|
|
401
|
-
config.type === DynamicFormTypeFieldEnum.time) {
|
|
402
|
-
if (config.min && typeof config.min === "string") {
|
|
403
|
-
validators.push(DateMinValidator(config.min));
|
|
404
|
-
}
|
|
405
|
-
if (config.max && typeof config.max === "string") {
|
|
406
|
-
validators.push(DateMaxValidator(config.max));
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
if (config.minLength)
|
|
410
|
-
validators.push(Validators.minLength(config.minLength));
|
|
411
|
-
if (config.maxLength)
|
|
412
|
-
validators.push(Validators.maxLength(config.maxLength));
|
|
413
|
-
control.get('value').setValidators(validators);
|
|
414
|
-
if (config.asyncValidators) {
|
|
415
|
-
control.get('value').setAsyncValidators(config.asyncValidators);
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
control.get('value').updateValueAndValidity();
|
|
419
|
-
if (prop.clearCurrentValue) {
|
|
420
|
-
control.get('value').setValue(null);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
control.get('value').clearValidators();
|
|
426
|
-
control.get('value').clearAsyncValidators();
|
|
427
|
-
control.setErrors(null);
|
|
428
|
-
control.get('value').setValue(null);
|
|
429
|
-
control.get('value').updateValueAndValidity();
|
|
430
|
-
if (config.type === DynamicFormTypeFieldEnum.dynamicForm) {
|
|
431
|
-
const formGroup = control;
|
|
432
|
-
formGroup.removeControl('dynamicFormGroup');
|
|
433
|
-
formGroup.addControl('dynamicFormGroup', this.fb.array([]));
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
break;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
autocompleteFilter(arr, value) {
|
|
444
|
-
return arr.filter(filter => {
|
|
445
|
-
if (typeof value === 'string') {
|
|
446
|
-
if (filter) {
|
|
447
|
-
let find = true;
|
|
448
|
-
value.toLowerCase()
|
|
449
|
-
.split(' ')
|
|
450
|
-
.forEach(part => {
|
|
451
|
-
if (filter.name.toLowerCase().indexOf(part) < 0) {
|
|
452
|
-
find = false;
|
|
453
|
-
return false;
|
|
454
|
-
}
|
|
455
|
-
});
|
|
456
|
-
return find;
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
else {
|
|
460
|
-
return true;
|
|
461
|
-
}
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
setValueByProp(formArray, prop) {
|
|
465
|
-
if (formArray) {
|
|
466
|
-
if (prop.name.indexOf(' > ') >= 0) {
|
|
467
|
-
let dynamicFormSubject;
|
|
468
|
-
const arrPropName = prop.name.split(' > ');
|
|
469
|
-
let indexPropName = 0;
|
|
470
|
-
do {
|
|
471
|
-
const control = formArray.controls.find(control => control.get('name').value === arrPropName[indexPropName]);
|
|
472
|
-
if (indexPropName === arrPropName.length - 2) {
|
|
473
|
-
dynamicFormSubject = control.get('dynamicFormConfig').value;
|
|
474
|
-
const dynamicForm = dynamicFormSubject.getValue();
|
|
475
|
-
if (dynamicForm.formConfig.find(fc => fc.name === arrPropName[arrPropName.length - 1])) {
|
|
476
|
-
if (dynamicForm.setValues) {
|
|
477
|
-
dynamicForm.setValues.next(koala(dynamicForm.setValues.getValue()).array().merge([{
|
|
478
|
-
name: arrPropName[arrPropName.length - 1],
|
|
479
|
-
value: prop.value
|
|
480
|
-
}]).getValue());
|
|
481
|
-
}
|
|
482
|
-
else {
|
|
483
|
-
dynamicForm.setValues = new BehaviorSubject([{
|
|
484
|
-
name: arrPropName[arrPropName.length - 1],
|
|
485
|
-
value: prop.value
|
|
486
|
-
}]);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
indexPropName++;
|
|
491
|
-
} while (indexPropName < arrPropName.length - 1);
|
|
492
|
-
}
|
|
493
|
-
else {
|
|
494
|
-
for (const control of formArray.controls.values()) {
|
|
495
|
-
if (control.get('name').value === prop.name) {
|
|
496
|
-
control.get('value').setValue(prop.value);
|
|
497
|
-
break;
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
setConfigDynamicForm(newFormGroup) {
|
|
504
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
505
|
-
if (this.showFieldsMoreItensConfig) {
|
|
506
|
-
const value = newFormGroup.get('value').value;
|
|
507
|
-
const configs = this.showFieldsMoreItensConfig
|
|
508
|
-
.filter(config => config.nameField === newFormGroup.get('name').value)
|
|
509
|
-
.sort(config => {
|
|
510
|
-
if (config.fnShow(value)) {
|
|
511
|
-
return 1;
|
|
512
|
-
}
|
|
513
|
-
return -1;
|
|
514
|
-
});
|
|
515
|
-
for (const config of configs) {
|
|
516
|
-
if (config) {
|
|
517
|
-
if (config.dynamicFormConfig && config.fnShow(value)) {
|
|
518
|
-
const controlDynamicFormConfig = this.controls
|
|
519
|
-
.controls
|
|
520
|
-
.find(control => config.fieldsToShow.indexOf(control.get('name').value) >= 0);
|
|
521
|
-
const dynamicFormConfigSubject = controlDynamicFormConfig.get('dynamicFormConfig').value;
|
|
522
|
-
dynamicFormConfigSubject.next(null);
|
|
523
|
-
yield delay(1);
|
|
524
|
-
dynamicFormConfigSubject.next(config.dynamicFormConfig(value));
|
|
525
|
-
}
|
|
526
|
-
this.dynamicFormService.showFields(this.showFields, config.fieldsToShow, config.fnShow(value), config.clearCurrentValue);
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
validateAutocompleteSelect(selectedValues, value) {
|
|
533
|
-
let isValid = true;
|
|
534
|
-
for (const selectedItem of selectedValues.values()) {
|
|
535
|
-
if (selectedItem.name === value.name) {
|
|
536
|
-
isValid = false;
|
|
537
|
-
break;
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
return isValid;
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
DynamicFormComponent.decorators = [
|
|
544
|
-
{ type: Component, args: [{
|
|
545
|
-
selector: 'koala-dynamic-form',
|
|
546
|
-
template: "<div [formGroup]=\"form\" class=\"p-relative w-100\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n autocomplete=\"off\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"off\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"off\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [mat-autosize]=\"true\"\n\t\t [matAutosizeMaxRows]=\"8\"\n\t\t [matAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [mat-autosize]=\"true\"\n\t\t [matAutosizeMaxRows]=\"8\"\n\t\t [matAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n\t <mat-chip\n\t\t (removed)=\"removeOptionOnAutocomplete(i, option)\"\n\t\t *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n\t\t [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n\t\t [removable]=\"true\"\n\t\t [selectable]=\"true\">\n\t {{display(option)}}\n\t\t <mat-icon matChipRemove>cancel</mat-icon>\n\t </mat-chip>\n\t <input\n\t\t #autocompleteInput\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"off\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"off\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n\t\t <div *ngIf=\"(propriedade.get('autocompleteOptionsFiltered').value | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(propriedade.get('dynamicFormConfig').value | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n",
|
|
547
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
548
|
-
styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:\"Josefin Sans\",sans-serif;font-size:11px;font-weight:bold;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"]
|
|
549
|
-
},] }
|
|
550
|
-
];
|
|
551
|
-
DynamicFormComponent.ctorParameters = () => [
|
|
552
|
-
{ type: FormBuilder },
|
|
553
|
-
{ type: KoalaDynamicFormService }
|
|
554
|
-
];
|
|
555
|
-
DynamicFormComponent.propDecorators = {
|
|
556
|
-
form: [{ type: Input }],
|
|
557
|
-
formConfig: [{ type: Input }],
|
|
558
|
-
showFields: [{ type: Input }],
|
|
559
|
-
showFieldsMoreItensConfig: [{ type: Input }],
|
|
560
|
-
setValues: [{ type: Input }],
|
|
561
|
-
tabIndexStart: [{ type: Input }],
|
|
562
|
-
autocompleteInput: [{ type: ViewChild, args: ['autocompleteInput',] }]
|
|
563
|
-
};
|
|
564
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFhLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFHN0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVF2RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEs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InNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tZmllbGQuaW50ZXJmYWNlJztcbmltcG9ydCB7IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bSB9IGZyb20gJy4vZW51bXMvZHluYW1pYy1mb3JtLXR5cGUtZmllbGQuZW51bSc7XG5pbXBvcnQgeyBDcGZWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvY3BmLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBDbnBqVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL2NucGoudmFsaWRhdG9yJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFic3RyYWN0IH0gZnJvbSAnLi4vZm9ybS5hYnN0cmFjdCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtc2V0LXZhbHVlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVTZWxlY3RlZFZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy9hdXRvY29tcGxldGUtc2VsZWN0ZWQudmFsaWRhdG9yJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1hdXRvY29tcGxldGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tc2hvdy1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybVNlcnZpY2UgfSBmcm9tICcuL2tvYWxhLmR5bmFtaWMtZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1Nb3JlSXRlbnNTaG93RmllbGRDb25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLW1vcmUtaXRlbnMtc2hvdy1maWVsZC1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRoZW1lUGFsZXR0ZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybUF1dG9jb21wbGV0ZU11bHRpcGxlQ29uZmlnSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1hdXRvY29tcGxldGUtbXVsdGlwbGUtY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIkBrb2FsYXJ4L3V0aWxzL29wZXJhdG9ycy9kZWxheVwiO1xuaW1wb3J0IHsga29hbGEgfSBmcm9tIFwiQGtvYWxhcngvdXRpbHNcIjtcbmltcG9ydCB7IERhdGVNaW5WYWxpZGF0b3IgfSBmcm9tIFwiLi92YWxpZGF0b3JzL2RhdGUtbWluLnZhbGlkYXRvclwiO1xuaW1wb3J0IHsgRGF0ZU1heFZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvZGF0ZS1tYXgudmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBLb2FsYUxhbmd1YWdlSGVscGVyIH0gZnJvbSBcIkBrb2FsYXJ4L3VpL2NvcmVcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna29hbGEtZHluYW1pYy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICdkeW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZHluYW1pYy1mb3JtLmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1Db21wb25lbnQgZXh0ZW5kcyBGb3JtQWJzdHJhY3QgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBmb3JtOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGZvcm1Db25maWc6IEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZVtdO1xuICBASW5wdXQoKSBzaG93RmllbGRzOiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZVtdPjtcbiAgQElucHV0KCkgc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZzogS29hbGFEeW5hbWljRm9ybU1vcmVJdGVuc1Nob3dGaWVsZENvbmZpZ0ludGVyZmFjZVtdO1xuICBASW5wdXQoKSBzZXRWYWx1ZXM6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZVtdPjtcbiAgQElucHV0KCkgdGFiSW5kZXhTdGFydDogbnVtYmVyID0gMTtcbiAgcHVibGljIGNvbnRyb2xzOiBGb3JtQXJyYXk7XG4gIHB1YmxpYyB0eXBlRmllbGQgPSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW07XG4gIHB1YmxpYyBob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwOjAwMCc7XG4gIHB1YmxpYyBlcnJvck1lc3NhZ2UgPSBLb2FsYUxhbmd1YWdlSGVscGVyO1xuXG4gIEBWaWV3Q2hpbGQoJ2F1dG9jb21wbGV0ZUlucHV0JykgYXV0b2NvbXBsZXRlSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBkeW5hbWljRm9ybVNlcnZpY2U6IEtvYWxhRHluYW1pY0Zvcm1TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCgpID0+IHRoaXMuZm9ybSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuZm9ybS5nZXQoJ2Zvcm1EYXRhJykpIHtcbiAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKCdmb3JtRGF0YScsIHRoaXMuZmIuYXJyYXkoW10pKTtcbiAgICB9XG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMuZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgRm9ybUFycmF5O1xuICAgIHRoaXMuZm9ybUNvbmZpZz8uZm9yRWFjaCgoY29uZmlnLCBpbmRleENvbmZpZykgPT4ge1xuICAgICAgY29uc3QgbmV3Rm9ybUdyb3VwID0gdGhpcy5uZXdDb250cm9sKGNvbmZpZyk7XG4gICAgICBpZiAoY29uZmlnLmFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpLnNldEFzeW5jVmFsaWRhdG9ycyhjb25maWcuYXN5bmNWYWxpZGF0b3JzKTtcbiAgICAgIH1cbiAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0pIHtcbiAgICAgICAgY29uc3QgZm9ybUdyb3VwRHluYW1pY0Zvcm1zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICBmb3JtR3JvdXBEeW5hbWljRm9ybXNTdWJqZWN0LnN1YnNjcmliZShmb3JtR3JvdXBDb25maWcgPT4ge1xuICAgICAgICAgIGlmIChmb3JtR3JvdXBDb25maWcpIHtcbiAgICAgICAgICAgIGZvcm1Hcm91cENvbmZpZy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZm9ybUdyb3VwQ29uZmlnLmZvcm0udmFsaWQgJiYgKGNvbmZpZy52YWx1ZUNoYW5nZXMgfHwgdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuZW1pdERhdGEoZm9ybUdyb3VwQ29uZmlnLmZvcm0pO1xuICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzIHx8XG4gICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlIHx8XG4gICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZHluYW1pY0Zvcm0gfHxcbiAgICAgICAgdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QgPSBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXT47XG4gICAgICAgICAgaWYgKGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0KSB7XG4gICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdC5zdWJzY3JpYmUob3B0aW9ucyA9PiBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KG9wdGlvbnMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKVxuICAgICAgICAgICAgICAgICAgICAudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMDApKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldENvbmZpZ0R5bmFtaWNGb3JtKG5ld0Zvcm1Hcm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KCduYW1lJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnbXVsdGlwbGUnKS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVBdXRvY29tcGxldGVTZWxlY3QobmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRvY29tcGxldGVJbnB1dD8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5ld0Zvcm1Hcm91cC5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKGtvYWxhKHRoaXMuZm9ybUNvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJyYXk8S29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlPigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihuZXdGb3JtR3JvdXAuZ2V0KCduYW1lJykudmFsdWUsICduYW1lJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKVswXT8uYXV0b2NvbXBsZXRlRGVmYXVsdFZhbHVlT25DbGVhciA/PyBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXV0b2NvbXBsZXRlVHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnMnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdPjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KHRoaXMuYXV0b2NvbXBsZXRlRmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5hdXRvY29tcGxldGVUeXBlID09PSAnb25EZW1hbmQnICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlciA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZUxvYWRpbmcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmF1dG9jb21wbGV0ZUZpbHRlcih2YWx1ZSkuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUubmV4dChvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnZhbHVlQ2hhbmdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWx1ZUNoYW5nZXMoKG5ld0Zvcm1Hcm91cC5nZXQoJ211bHRpcGxlJykudmFsdWUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWUubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWU/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlQ2hhbmdlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udHJvbHMucHVzaChuZXdGb3JtR3JvdXApO1xuICAgICAgaWYgKGNvbmZpZy5tb3JlSXRlbXNDb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5tb3JlSXRlbXNNaW5JdGVtcyA+IDApIHtcbiAgICAgICAgICBmb3IgKGxldCBtaW4gPSAwOyBtaW4gPCBjb25maWcubW9yZUl0ZW1zTWluSXRlbXM7IG1pbisrKSB7XG4gICAgICAgICAgICBpZiAobWluIDw9IGNvbmZpZy5tb3JlSXRlbXNNYXhJdGVtcykge1xuICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVJdGVtKGluZGV4Q29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5tb3JlSXRlbXNDb25maWcuc2V0VmFsdWVzKSB7XG4gICAgICAgICAgY29uZmlnLm1vcmVJdGVtc0NvbmZpZ1xuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZXNcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFzeW5jIHZhbHVlcyA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmZvckVhY2goKGl0ZW1WYWx1ZSwgaW5kZXhWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250cm9scy5jb250cm9sc1tpbmRleENvbmZpZ10uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZVtpbmRleFZhbHVlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNb3JlSXRlbShpbmRleENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZXNPbkZpZWxkcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW2luZGV4Q29uZmlnXS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlW2luZGV4VmFsdWVdLmZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAodGhpcy5zaG93RmllbGRzKSB7XG4gICAgICB0aGlzLmNoYW5nZVZpc2liaWxpdHlGaWVsZHModGhpcy5zaG93RmllbGRzLCB0aGlzLmZvcm0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXRWYWx1ZXMpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWVzT25GaWVsZHModGhpcy5zZXRWYWx1ZXMsIHRoaXMuZm9ybSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhvdXJzQW5kTWludXRlc0FwcGx5TWFzayhpbmRleDogbnVtYmVyLCBldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xzPy5jb250cm9sc1tpbmRleF07XG4gICAgY29uc3QgdHlwZSA9IGNvbnRyb2w/LmdldCgndHlwZScpLnZhbHVlIGFzIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bTtcbiAgICBpZiAodHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmhvdXJzQW5kTWludXRlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sPy5nZXQoJ3ZhbHVlJykudmFsdWU7XG4gICAgICBpZiAoZXZlbnQua2V5ID09ICdCYWNrc3BhY2UnICYmIHZhbHVlLmxlbmd0aCA8IDYpIHtcbiAgICAgICAgdGhpcy5ob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwOjAwMCc7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSAhPSAnQmFja3NwYWNlJyAmJiB2YWx1ZS5sZW5ndGggPj0gNikge1xuICAgICAgICB0aGlzLmhvdXJzQW5kTWludXRlc01hc2sgPSAnMDAwOjAwJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFzc3dvcmRWaWV3KGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9scz8uY29udHJvbHNbaW5kZXhdO1xuICAgIGNvbnN0IGhpZGVQYXNzd29yZCA9ICFjb250cm9sPy5nZXQoJ2hpZGVQYXNzd29yZCcpLnZhbHVlO1xuICAgIGNvbnRyb2w/LmdldCgnaGlkZVBhc3N3b3JkJykuc2V0VmFsdWUoaGlkZVBhc3N3b3JkKTtcbiAgICBjb250cm9sPy5nZXQoJ3R5cGUnKS5zZXRWYWx1ZShoaWRlUGFzc3dvcmQgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5wYXNzd29yZCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRleHRcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZE1vcmVJdGVtKHByb3BJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLmxlbmd0aCA8IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc01heEl0ZW1zJykudmFsdWUpIHtcbiAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUucHVzaCh7XG4gICAgICAgIGZvcm06IGZvcm1Hcm91cCxcbiAgICAgICAgZm9ybUNvbmZpZzogdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0ubW9yZUl0ZW1zQ29uZmlnLmZvcm1Db25maWcsXG4gICAgICAgIHNob3dGaWVsZHM6IG5ldyBCZWhhdmlvclN1YmplY3Q8QmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+W10+KFtdKSxcbiAgICAgICAgc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZzogdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0ubW9yZUl0ZW1zQ29uZmlnLnNob3dGaWVsZHNDb25maWdcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRXhwYW5kZWQnKS5zZXRWYWx1ZShcbiAgICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIC0gMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZvcm1BcnJheU1vcmVJdGVtcyA9IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0Zvcm1Hcm91cCcpIGFzIEZvcm1BcnJheTtcbiAgICAgIGZvcm1BcnJheU1vcmVJdGVtcy5wdXNoKGZvcm1Hcm91cCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlbW92ZU1vcmVJdGVtKHByb3BJbmRleDogbnVtYmVyLCByZW1vdmVJbmRleCkge1xuICAgIGNvbnN0IGV4cGFuZGVkSXRlbUluZGV4ID0gcmVtb3ZlSW5kZXggLSAxO1xuICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNFeHBhbmRlZCcpLnNldFZhbHVlKChleHBhbmRlZEl0ZW1JbmRleCA8IDApID8gMCA6IGV4cGFuZGVkSXRlbUluZGV4KTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBdXRvY29tcGxldGUocHJvcEluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbXVsdGlwbGUnKS52YWx1ZSkge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS5hdXRvY29tcGxldGVEZWZhdWx0VmFsdWVPbkNsZWFyID8/IG51bGwpO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS5hdXRvY29tcGxldGVEZWZhdWx0VmFsdWVPbkNsZWFyID8/IG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5KG9wdGlvbj86IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24ubmFtZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVPcHRpb25PbkF1dG9jb21wbGV0ZShwcm9wSW5kZXg6IG51bWJlciwgb3B0aW9uOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWUuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gb3B0aW9uKSBhcyBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW107XG4gICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKHZhbHVlKTtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUoW10pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgndmFsdWUnKS5zZXRWYWx1ZShudWxsKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLnZhbHVlQ2hhbmdlcykge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0udmFsdWVDaGFuZ2VzKHZhbHVlLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sb3JDaGlwKGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUF1dG9jb21wbGV0ZU11bHRpcGxlQ29uZmlnSW50ZXJmYWNlKTogVGhlbWVQYWxldHRlIHtcbiAgICByZXR1cm4gY29uZmlnLmNvbG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdDb250cm9sKGNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlKTogRm9ybUdyb3VwIHtcbiAgICBsZXQgdmFsaWRhdG9ycyA9IGNvbmZpZy5zeW5jVmFsaWRhdG9ycyA/PyBbXTtcbiAgICBsZXQgdmFsdWU6IGFueSA9IGNvbmZpZy52YWx1ZSA/PyAnJztcbiAgICBsZXQgdmFsdWVTZWxlY3RlZEF1dG9jb21wbGV0ZTogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSB8IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSA9IChcbiAgICAgIGNvbmZpZy5tdWx0aXBsZSA/IFtdIDogKGNvbmZpZy5hdXRvY29tcGxldGVEZWZhdWx0VmFsdWVPbkNsZWFyID8/IG51bGwpXG4gICAgKTtcblxuICAgIGlmIChjb25maWcucmVxdWlyZWQgPT09IHRydWUpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICBpZiAoY29uZmlnLm1pbiAmJiB0eXBlb2YgY29uZmlnLm1pbiA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluKGNvbmZpZy5taW4pKTtcbiAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGNvbmZpZy5tYXgpKTtcbiAgICBpZiAoXG4gICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGUgfHxcbiAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZXRpbWUgfHxcbiAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0udGltZVxuICAgICkge1xuICAgICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNaW5WYWxpZGF0b3IoY29uZmlnLm1pbikpOyB9XG4gICAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJzdHJpbmdcIikgeyB2YWxpZGF0b3JzLnB1c2goRGF0ZU1heFZhbGlkYXRvcihjb25maWcubWF4KSk7IH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZy5taW5MZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aChjb25maWcubWluTGVuZ3RoKSk7XG4gICAgaWYgKGNvbmZpZy5tYXhMZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aChjb25maWcubWF4TGVuZ3RoKSk7XG5cbiAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jcGYpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChDcGZWYWxpZGF0b3IpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jbnBqKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goQ25walZhbGlkYXRvcik7XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmVtYWlsKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmF1dG9jb21wbGV0ZSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGUgPSB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSAoY29uZmlnLm11bHRpcGxlID8gdmFsdWVTZWxlY3RlZEF1dG9jb21wbGV0ZVswXSA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY2hlY2tib3gpIHtcbiAgICAgIHZhbHVlID0gY29uZmlnLnZhbHVlID8/IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uaG91cnNBbmRNaW51dGVzICYmXG4gICAgICB2YWx1ZS5sZW5ndGggPj0gNlxuICAgICkge1xuICAgICAgdGhpcy5ob3Vyc0FuZE1pbnV0ZXNNYXNrID0gJzAwMDowMCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZykge1xuICAgICAgY29uc3QgY2xvbmVEeW5hbWljRm9ybUNvbmZpZyA9IHt9IGFzIEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U7XG4gICAgICBPYmplY3QuYXNzaWduKGNsb25lRHluYW1pY0Zvcm1Db25maWcsIGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyk7XG4gICAgICBjbG9uZUR5bmFtaWNGb3JtQ29uZmlnLmZvcm0gPSBjb25maWcuZHluYW1pY0Zvcm1Db25maWcuZm9ybTtcbiAgICAgIGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyA9IGNsb25lRHluYW1pY0Zvcm1Db25maWc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5zaG93ID09PSBmYWxzZSkge1xuICAgICAgdmFsaWRhdG9ycyA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBzaG93OiBbbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihjb25maWcuc2hvdyA/PyB0cnVlKV0sXG4gICAgICBsYWJlbDogW2NvbmZpZy5sYWJlbF0sXG4gICAgICBuYW1lOiBbY29uZmlnLm5hbWVdLFxuICAgICAgdHlwZTogW2NvbmZpZy50eXBlXSxcbiAgICAgIGZpbGVCdXR0b25Db25maWc6IFt7XG4gICAgICAgIGljb246IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uaWNvbiA/PyAnYXR0YWNoX2ZpbGUnLFxuICAgICAgICB0ZXh0OiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LnRleHQgPz8gJ0NsaXF1ZSBwYXJhIGFuZXhhciBhcnF1aXZvcycsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy5iYWNrZ3JvdW5kQ29sb3IgPz8gJ3doaXRlJyxcbiAgICAgICAgY29sb3I6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uY29sb3IgPz8gJ2JsdWUnLFxuICAgICAgICBhY2NlcHQ6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8uYWNjZXB0ID8/ICcqJ1xuICAgICAgfV0sXG4gICAgICBkeW5hbWljRm9ybUNvbmZpZzogW25ldyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT4oY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnKV0sXG4gICAgICBkeW5hbWljRm9ybUdyb3VwOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIGFwcGVhcmFuY2U6IFtjb25maWcuYXBwZWFyYW5jZV0sXG4gICAgICBmbG9hdExhYmVsOiBbY29uZmlnLmZsb2F0TGFiZWxdLFxuICAgICAgcGxhY2Vob2xkZXI6IFtjb25maWcucGxhY2Vob2xkZXJdLFxuICAgICAgY2xhc3M6IFtjb25maWcuY2xhc3NdLFxuICAgICAgZmllbGRDbGFzczogW2NvbmZpZy5maWVsZENsYXNzXSxcbiAgICAgIHRleHRIaW50OiBbY29uZmlnLnRleHRIaW50XSxcbiAgICAgIHJlcXVpcmVkOiBbY29uZmlnLnJlcXVpcmVkID8/IGZhbHNlXSxcbiAgICAgIG1pbjogW2NvbmZpZy5taW4gPz8gMF0sXG4gICAgICBtYXg6IFtjb25maWcubWF4ID8/IDk5OTk5OTk5OTk5XSxcbiAgICAgIG1pbkxlbmd0aDogW2NvbmZpZy5taW5MZW5ndGggPz8gMF0sXG4gICAgICBtYXhMZW5ndGg6IFtjb25maWcubWF4TGVuZ3RoID8/IDI1NV0sXG4gICAgICBkaXNhYmxlZDogW2NvbmZpZy5kaXNhYmxlZCA/PyBmYWxzZV0sXG4gICAgICBmb2N1czogW2NvbmZpZy5mb2N1cyA/PyBmYWxzZV0sXG4gICAgICBtdWx0aXBsZTogW2NvbmZpZy5tdWx0aXBsZSA/PyBmYWxzZV0sXG4gICAgICBvcGNvZXNTZWxlY3Q6IFtjb25maWcub3Bjb2VzU2VsZWN0ID8/IFtdXSxcbiAgICAgIGhpZGVQYXNzd29yZDogY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5wYXNzd29yZCA/IHRydWUgOiBudWxsLFxuICAgICAgbW9yZUl0ZW1zQnV0dG9uSWNvbkFkZGxhYmVsOiBbY29uZmlnLm1vcmVJdGVtc0J1dHRvbkljb25BZGRsYWJlbF0sXG4gICAgICBtb3JlSXRlbXNNaW5JdGVtczogW2NvbmZpZy5tb3JlSXRlbXNNaW5JdGVtcyA/PyAwXSxcbiAgICAgIG1vcmVJdGVtc01heEl0ZW1zOiBbY29uZmlnLm1vcmVJdGVtc01heEl0ZW1zID8/IDEwMF0sXG4gICAgICBtb3JlSXRlbXNJY29uOiBbY29uZmlnLm1vcmVJdGVtc0ljb25dLFxuICAgICAgbW9yZUl0ZW1zSWNvbkZvbnRDb2xvcjogW2NvbmZpZy5tb3JlSXRlbXNJY29uRm9udENvbG9yXSxcbiAgICAgIG1vcmVJdGVtc0ljb25CYWNrZ3JvdW5kQ29sb3I6IFtjb25maWcubW9yZUl0ZW1zSWNvbkJhY2tncm91bmRDb2xvcl0sXG4gICAgICBtb3JlSXRlbXNFeHBhbmRlZDogWycnXSxcbiAgICAgIG1vcmVJdGVtc0NvbmZpZzogW1tdXSxcbiAgICAgIG1vcmVJdGVtc0Zvcm1Hcm91cDogdGhpcy5mYi5hcnJheShbXSksXG4gICAgICBhdXRvY29tcGxldGVMb2FkaW5nOiBbbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSldLFxuICAgICAgYXV0b2NvbXBsZXRlT3B0aW9uczogW2NvbmZpZy5hdXRvY29tcGxldGVPcHRpb25zXSxcbiAgICAgIGF1dG9jb21wbGV0ZU11bHRpcGxlQ29uZmlnOiBbY29uZmlnLmF1dG9jb21wbGV0ZU11bHRpcGxlQ29uZmlnXSxcbiAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZDogW25ldyBCZWhhdmlvclN1YmplY3Q8YW55PihbXSldLFxuICAgICAgYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZTogW3ZhbHVlU2VsZWN0ZWRBdXRvY29tcGxldGVdLFxuICAgICAgdGV4dExvZ3M6IFtjb25maWc/LnRleHRPYnNdLFxuICAgICAgY3VzdG9tTWFzYzogW2NvbmZpZz8uY3VzdG9tTWFzY10sXG4gICAgICBjdXN0b21NYXNjVGhvdXNhbmRTZXBhcmF0b3I6IFtjb25maWc/LmN1c3RvbU1hc2NUaG91c2FuZFNlcGFyYXRvciA/PyAnJ10sXG4gICAgICBjdXN0b21NYXNjU3VmZml4OiBbY29uZmlnPy5jdXN0b21NYXNjU3VmZml4ID8/ICcnXSxcbiAgICAgIGN1c3RvbU1hc2NQcmVmaXg6IFtjb25maWc/LmN1c3RvbU1hc2NQcmVmaXggPz8gJyddLFxuICAgICAgdmFsdWU6IFt7dmFsdWUsIGRpc2FibGVkOiBjb25maWcuZGlzYWJsZWR9LCB2YWxpZGF0b3JzLCBjb25maWcuYXN5bmNWYWxpZGF0b3JzXVxuICAgIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5hdXRvY29tcGxldGVUeXBlID09PSBcIm9uRGVtYW5kXCIpIHtcbiAgICAgIGNvbnN0IGxvYWRlciA9IGZpZWxkLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICAgIGxvYWRlci5uZXh0KHRydWUpO1xuICAgICAgY29uZmlnLmF1dG9jb21wbGV0ZUZpbHRlcignJykuc3Vic2NyaWJlKG9wdGlvbnMgPT4ge1xuICAgICAgICBmaWVsZC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucyk7XG4gICAgICAgIGxvYWRlci5uZXh0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVzT25GaWVsZHMoc3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+LCBmb3JtOiBGb3JtR3JvdXApIHtcbiAgICBzdWJqZWN0LnN1YnNjcmliZShpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IGZvcm0uZ2V0KCdmb3JtRGF0YScpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGl0ZW0udmFsdWVzKCkpIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlQnlQcm9wKGZvcm1BcnJheSwgcHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlVmlzaWJpbGl0eUZpZWxkcyhzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybVNob3dGaWVsZEludGVyZmFjZVtdPiwgZm9ybTogRm9ybUdyb3VwKSB7XG4gICAgc3ViamVjdC5waXBlKGRlYm91bmNlVGltZSg1KSkuc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgRm9ybUFycmF5O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgaXRlbS52YWx1ZXMoKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4Q29udHJvbCwgY29udHJvbF0gb2YgZm9ybUFycmF5LmNvbnRyb2xzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuZ2V0KCduYW1lJykudmFsdWUgPT09IHByb3AubmFtZSkge1xuICAgICAgICAgICAgICBjb250cm9sLmdldCgnc2hvdycpLnZhbHVlLm5leHQocHJvcC5zaG93KTtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtRmllbGRJbnRlcmZhY2UgPSB0aGlzLmZvcm1Db25maWdbaW5kZXhDb250cm9sXSA/PyBudWxsO1xuICAgICAgICAgICAgICBpZiAocHJvcC5zaG93KSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbGlkYXRvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtQXJyYXlNb3JlSXRlbXMgPSBjb250cm9sLmdldCgnZHluYW1pY0Zvcm1Hcm91cCcpIGFzIEZvcm1BcnJheTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUFycmF5TW9yZUl0ZW1zLnB1c2goY29uZmlnPy5keW5hbWljRm9ybUNvbmZpZz8uZm9ybSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzID0gY29uZmlnLnN5bmNWYWxpZGF0b3JzID8/IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNwZikge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChDcGZWYWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY25waikge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChDbnBqVmFsaWRhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmVtYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5yZXF1aXJlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChBdXRvY29tcGxldGVTZWxlY3RlZFZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1pbiAmJiB0eXBlb2YgY29uZmlnLm1pbiA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluKGNvbmZpZy5taW4pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwibnVtYmVyXCIpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heChjb25maWcubWF4KSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmRhdGV0aW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS50aW1lXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWluVmFsaWRhdG9yKGNvbmZpZy5taW4pKTsgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWF4ICYmIHR5cGVvZiBjb25maWcubWF4ID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWF4VmFsaWRhdG9yKGNvbmZpZy5tYXgpKTsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWluTGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgoY29uZmlnLm1pbkxlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1heExlbmd0aCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKGNvbmZpZy5tYXhMZW5ndGgpKTtcblxuICAgICAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldEFzeW5jVmFsaWRhdG9ycyhjb25maWcuYXN5bmNWYWxpZGF0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgICBpZiAocHJvcC5jbGVhckN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuY2xlYXJBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLnNldEVycm9ycyhudWxsKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgICAgICAgICAgICAgICBmb3JtR3JvdXAucmVtb3ZlQ29udHJvbCgnZHluYW1pY0Zvcm1Hcm91cCcpO1xuICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwLmFkZENvbnRyb2woJ2R5bmFtaWNGb3JtR3JvdXAnLCB0aGlzLmZiLmFycmF5KFtdKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvY29tcGxldGVGaWx0ZXIoYXJyOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10sIHZhbHVlOiBzdHJpbmcpOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10ge1xuICAgIHJldHVybiBhcnIuZmlsdGVyKGZpbHRlciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgbGV0IGZpbmQgPSB0cnVlO1xuICAgICAgICAgIHZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgIC5zcGxpdCgnICcpXG4gICAgICAgICAgICAgICAuZm9yRWFjaChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihwYXJ0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICBmaW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiBmaW5kO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VmFsdWVCeVByb3AoZm9ybUFycmF5OiBGb3JtQXJyYXksIHByb3A6IEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlKSB7XG4gICAgaWYgKGZvcm1BcnJheSkge1xuICAgICAgaWYgKHByb3AubmFtZS5pbmRleE9mKCcgPiAnKSA+PSAwKSB7XG4gICAgICAgIGxldCBkeW5hbWljRm9ybVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlPjtcbiAgICAgICAgY29uc3QgYXJyUHJvcE5hbWUgPSBwcm9wLm5hbWUuc3BsaXQoJyA+ICcpO1xuICAgICAgICBsZXQgaW5kZXhQcm9wTmFtZSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUFycmF5LmNvbnRyb2xzLmZpbmQoY29udHJvbCA9PiBjb250cm9sLmdldCgnbmFtZScpLnZhbHVlID09PSBhcnJQcm9wTmFtZVtpbmRleFByb3BOYW1lXSk7XG4gICAgICAgICAgaWYgKGluZGV4UHJvcE5hbWUgPT09IGFyclByb3BOYW1lLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNGb3JtU3ViamVjdCA9IGNvbnRyb2wuZ2V0KCdkeW5hbWljRm9ybUNvbmZpZycpLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgZHluYW1pY0Zvcm0gPSBkeW5hbWljRm9ybVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGlmIChkeW5hbWljRm9ybS5mb3JtQ29uZmlnLmZpbmQoZmMgPT4gZmMubmFtZSA9PT0gYXJyUHJvcE5hbWVbYXJyUHJvcE5hbWUubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICAgIGlmIChkeW5hbWljRm9ybS5zZXRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBkeW5hbWljRm9ybS5zZXRWYWx1ZXMubmV4dChrb2FsYShkeW5hbWljRm9ybS5zZXRWYWx1ZXMuZ2V0VmFsdWUoKSkuYXJyYXk8YW55PigpLm1lcmdlKFt7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBhcnJQcm9wTmFtZVthcnJQcm9wTmFtZS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wLnZhbHVlXG4gICAgICAgICAgICAgICAgfV0pLmdldFZhbHVlKCkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtLnNldFZhbHVlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXT4oW3tcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGFyclByb3BOYW1lW2FyclByb3BOYW1lLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3AudmFsdWVcbiAgICAgICAgICAgICAgICB9XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaW5kZXhQcm9wTmFtZSsrO1xuICAgICAgICB9IHdoaWxlIChpbmRleFByb3BOYW1lIDwgYXJyUHJvcE5hbWUubGVuZ3RoIC0gMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgZm9ybUFycmF5LmNvbnRyb2xzLnZhbHVlcygpKSB7XG4gICAgICAgICAgaWYgKGNvbnRyb2wuZ2V0KCduYW1lJykudmFsdWUgPT09IHByb3AubmFtZSkge1xuICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUocHJvcC52YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldENvbmZpZ0R5bmFtaWNGb3JtKG5ld0Zvcm1Hcm91cDogRm9ybUdyb3VwKSB7XG4gICAgaWYgKHRoaXMuc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZykge1xuICAgICAgY29uc3QgdmFsdWUgPSBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpLnZhbHVlO1xuICAgICAgY29uc3QgY29uZmlncyA9IHRoaXMuc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbmZpZyA9PiBjb25maWcubmFtZUZpZWxkID09PSBuZXdGb3JtR3JvdXAuZ2V0KCduYW1lJykudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5mblNob3codmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgIGlmIChjb25maWcuZHluYW1pY0Zvcm1Db25maWcgJiYgY29uZmlnLmZuU2hvdyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xEeW5hbWljRm9ybUNvbmZpZyA9IHRoaXMuY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZChjb250cm9sID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZmllbGRzVG9TaG93LmluZGV4T2YoY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSkgPj0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljRm9ybUNvbmZpZ1N1YmplY3QgPSBjb250cm9sRHluYW1pY0Zvcm1Db25maWcuZ2V0KCdkeW5hbWljRm9ybUNvbmZpZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlPjtcbiAgICAgICAgICAgIGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgYXdhaXQgZGVsYXkoMSk7XG4gICAgICAgICAgICBkeW5hbWljRm9ybUNvbmZpZ1N1YmplY3QubmV4dChjb25maWcuZHluYW1pY0Zvcm1Db25maWcodmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5keW5hbWljRm9ybVNlcnZpY2Uuc2hvd0ZpZWxkcyhcbiAgICAgICAgICAgIHRoaXMuc2hvd0ZpZWxkcyxcbiAgICAgICAgICAgIGNvbmZpZy5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICBjb25maWcuZm5TaG93KHZhbHVlKSxcbiAgICAgICAgICAgIGNvbmZpZy5jbGVhckN1cnJlbnRWYWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQXV0b2NvbXBsZXRlU2VsZWN0KHNlbGVjdGVkVmFsdWVzOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10sIHZhbHVlOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlKSB7XG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuXG4gICAgZm9yIChjb25zdCBzZWxlY3RlZEl0ZW0gb2Ygc2VsZWN0ZWRWYWx1ZXMudmFsdWVzKCkpIHtcbiAgICAgIGlmIChzZWxlY3RlZEl0ZW0ubmFtZSA9PT0gdmFsdWUubmFtZSkge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG59XG4iXX0=
|