@sapphire-ion/framework 0.30.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/README.md +24 -0
- package/esm2022/lib/classes/comparison/comparison-operator.mjs +18 -0
- package/esm2022/lib/classes/comparison/comparison-value-type.mjs +25 -0
- package/esm2022/lib/classes/comparison/comparison.mjs +41 -0
- package/esm2022/lib/classes/comparison/properties/bool-property.mjs +15 -0
- package/esm2022/lib/classes/comparison/properties/date-property.mjs +27 -0
- package/esm2022/lib/classes/comparison/properties/datetime-property.mjs +27 -0
- package/esm2022/lib/classes/comparison/properties/decimal-property.mjs +27 -0
- package/esm2022/lib/classes/comparison/properties/enum-property.mjs +27 -0
- package/esm2022/lib/classes/comparison/properties/implicit-property.mjs +12 -0
- package/esm2022/lib/classes/comparison/properties/int-property.mjs +27 -0
- package/esm2022/lib/classes/comparison/properties/long-property.mjs +27 -0
- package/esm2022/lib/classes/comparison/properties/string-property.mjs +15 -0
- package/esm2022/lib/classes/comparison/properties/time-property.mjs +27 -0
- package/esm2022/lib/classes/credentials.mjs +2 -0
- package/esm2022/lib/classes/environment.mjs +32 -0
- package/esm2022/lib/classes/filters/view-filtros.mjs +18 -0
- package/esm2022/lib/classes/inputs/table-field-form-builder.mjs +10 -0
- package/esm2022/lib/classes/inputs/table-field.mjs +63 -0
- package/esm2022/lib/classes/page-option.mjs +2 -0
- package/esm2022/lib/classes/routes/default-routing-factory.mjs +23 -0
- package/esm2022/lib/classes/routes/id-preloader-configuration.mjs +22 -0
- package/esm2022/lib/classes/routes/route-data.mjs +9 -0
- package/esm2022/lib/components/carousel/carousel-image/carousel-image.component.mjs +18 -0
- package/esm2022/lib/components/carousel/carousel-item/carousel-item.component.mjs +15 -0
- package/esm2022/lib/components/carousel/carousel.component.mjs +79 -0
- package/esm2022/lib/components/carousel/carousel.module.mjs +31 -0
- package/esm2022/lib/components/carousel/i-carousel-item.component.mjs +16 -0
- package/esm2022/lib/components/content-block/content-block.component.mjs +27 -0
- package/esm2022/lib/components/default/default-list/abstract-list.mjs +49 -0
- package/esm2022/lib/components/default/default-list/default-list.component.mjs +94 -0
- package/esm2022/lib/components/default/default-list/header-list/header-list.component.mjs +98 -0
- package/esm2022/lib/components/default/default-list/list.mjs +110 -0
- package/esm2022/lib/components/default/default-pagination/default-pagination.component.mjs +123 -0
- package/esm2022/lib/components/default/default-table/default-table.component.mjs +206 -0
- package/esm2022/lib/components/default/default-table/th-filter/th-filter.component.mjs +182 -0
- package/esm2022/lib/components/default/default-view/abstract-view.mjs +18 -0
- package/esm2022/lib/components/default/default-view/default-view.component.mjs +51 -0
- package/esm2022/lib/components/default/default-view/header-view/header-view.component.mjs +72 -0
- package/esm2022/lib/components/default/default-view/view.mjs +170 -0
- package/esm2022/lib/components/default/default.module.mjs +87 -0
- package/esm2022/lib/components/default-page/default.page.mjs +73 -0
- package/esm2022/lib/components/drag-drop-file/drag-drop-file.directive.mjs +60 -0
- package/esm2022/lib/components/drag-drop-file/drag-drop-file.module.mjs +31 -0
- package/esm2022/lib/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.mjs +15 -0
- package/esm2022/lib/components/drawer/default-drawer-end/default-drawer-end.component.mjs +34 -0
- package/esm2022/lib/components/drawer/drawer-group/drawer-group.component.mjs +49 -0
- package/esm2022/lib/components/drawer/drawer.component.mjs +117 -0
- package/esm2022/lib/components/drawer/menu.mjs +15 -0
- package/esm2022/lib/components/filter/filter.component.mjs +124 -0
- package/esm2022/lib/components/http-responses-pages/forbidden-403/forbidden-403.component.mjs +17 -0
- package/esm2022/lib/components/image/image.component.mjs +91 -0
- package/esm2022/lib/components/info-popover/info-popover.component.mjs +91 -0
- package/esm2022/lib/components/inputs/custom-input.mjs +77 -0
- package/esm2022/lib/components/inputs/custom-signal-input.mjs +74 -0
- package/esm2022/lib/components/inputs/input-bool/input-bool.component.mjs +43 -0
- package/esm2022/lib/components/inputs/input-bool/input-bool.configuration.mjs +16 -0
- package/esm2022/lib/components/inputs/input-color/input-color.component.mjs +487 -0
- package/esm2022/lib/components/inputs/input-configuration.mjs +2 -0
- package/esm2022/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.mjs +93 -0
- package/esm2022/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.configuration.mjs +6 -0
- package/esm2022/lib/components/inputs/input-date/input-date.component.mjs +119 -0
- package/esm2022/lib/components/inputs/input-date/input-date.configuration.mjs +8 -0
- package/esm2022/lib/components/inputs/input-decimal/input-decimal.component.mjs +269 -0
- package/esm2022/lib/components/inputs/input-decimal/input-decimal.configuration.mjs +45 -0
- package/esm2022/lib/components/inputs/input-default-configurations.mjs +14 -0
- package/esm2022/lib/components/inputs/input-file/download-button/download-button.component.mjs +91 -0
- package/esm2022/lib/components/inputs/input-file/input-file.component.mjs +128 -0
- package/esm2022/lib/components/inputs/input-file/input-file.configuration.mjs +11 -0
- package/esm2022/lib/components/inputs/input-loading/input-loading.component.mjs +16 -0
- package/esm2022/lib/components/inputs/input-provider-factory.mjs +15 -0
- package/esm2022/lib/components/inputs/input-select/ISelect.mjs +11 -0
- package/esm2022/lib/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.mjs +42 -0
- package/esm2022/lib/components/inputs/input-select/input-select-option/input-select-option.component.mjs +46 -0
- package/esm2022/lib/components/inputs/input-select/input-select-template.directive.mjs +16 -0
- package/esm2022/lib/components/inputs/input-select/input-select.component.mjs +322 -0
- package/esm2022/lib/components/inputs/input-select/input.select.configuration.mjs +164 -0
- package/esm2022/lib/components/inputs/input-string/input-string.component.mjs +50 -0
- package/esm2022/lib/components/inputs/input-string/input-string.configuration.mjs +18 -0
- package/esm2022/lib/components/inputs/input-textarea/input-textarea.component.mjs +47 -0
- package/esm2022/lib/components/inputs/input-type.mjs +18 -0
- package/esm2022/lib/components/inputs/input-validators.mjs +90 -0
- package/esm2022/lib/components/inputs/inputs.module.mjs +101 -0
- package/esm2022/lib/components/loading/loading.component.mjs +34 -0
- package/esm2022/lib/components/login/login-admin/login-admin.component.mjs +52 -0
- package/esm2022/lib/components/login/login.component.mjs +93 -0
- package/esm2022/lib/components/main-content/main-content.component.mjs +62 -0
- package/esm2022/lib/components/stepper/step/step.component.mjs +43 -0
- package/esm2022/lib/components/stepper/stepper.component.mjs +36 -0
- package/esm2022/lib/components/stepper/stepper.module.mjs +25 -0
- package/esm2022/lib/components/tabs/tab/tab.component.mjs +41 -0
- package/esm2022/lib/components/tabs/tabs/tabs.component.mjs +56 -0
- package/esm2022/lib/components/tabs/tabs.module.mjs +22 -0
- package/esm2022/lib/components/text-tooltip/text-tooltip.component.mjs +51 -0
- package/esm2022/lib/components/tooltip/tooltip.component.mjs +21 -0
- package/esm2022/lib/core.module.mjs +29 -0
- package/esm2022/lib/directives/ng-var.directive.mjs +29 -0
- package/esm2022/lib/guards/auth.guard.mjs +26 -0
- package/esm2022/lib/guards/error.interceptor.mjs +106 -0
- package/esm2022/lib/guards/token.interceptor.mjs +25 -0
- package/esm2022/lib/index.mjs +172 -0
- package/esm2022/lib/pipes/secure.pipe.mjs +42 -0
- package/esm2022/lib/services/auth.service.mjs +149 -0
- package/esm2022/lib/services/environment.service.mjs +26 -0
- package/esm2022/lib/services/generics.service.mjs +84 -0
- package/esm2022/lib/services/route/route.cache.service.mjs +15 -0
- package/esm2022/lib/services/route/route.provider.service.mjs +42 -0
- package/esm2022/lib/services/usuario.service.mjs +49 -0
- package/esm2022/lib/services/utils.service.mjs +149 -0
- package/esm2022/lib/services/web/api-url-provider.service.mjs +29 -0
- package/esm2022/lib/services/web/http.ativo.service.mjs +55 -0
- package/esm2022/lib/services/web/http.service.mjs +175 -0
- package/esm2022/lib/services/web/storage.service.mjs +115 -0
- package/esm2022/public-api.mjs +5 -0
- package/esm2022/sapphire-ion-framework.mjs +5 -0
- package/fesm2022/sapphire-ion-framework.mjs +6080 -0
- package/fesm2022/sapphire-ion-framework.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/classes/comparison/comparison-operator.d.ts +9 -0
- package/lib/classes/comparison/comparison-value-type.d.ts +23 -0
- package/lib/classes/comparison/comparison.d.ts +25 -0
- package/lib/classes/comparison/properties/bool-property.d.ts +7 -0
- package/lib/classes/comparison/properties/date-property.d.ts +11 -0
- package/lib/classes/comparison/properties/datetime-property.d.ts +11 -0
- package/lib/classes/comparison/properties/decimal-property.d.ts +11 -0
- package/lib/classes/comparison/properties/enum-property.d.ts +11 -0
- package/lib/classes/comparison/properties/implicit-property.d.ts +6 -0
- package/lib/classes/comparison/properties/int-property.d.ts +11 -0
- package/lib/classes/comparison/properties/long-property.d.ts +11 -0
- package/lib/classes/comparison/properties/string-property.d.ts +7 -0
- package/lib/classes/comparison/properties/time-property.d.ts +11 -0
- package/lib/classes/credentials.d.ts +5 -0
- package/lib/classes/environment.d.ts +13 -0
- package/lib/classes/filters/view-filtros.d.ts +10 -0
- package/lib/classes/inputs/table-field-form-builder.d.ts +5 -0
- package/lib/classes/inputs/table-field.d.ts +19 -0
- package/lib/classes/page-option.d.ts +7 -0
- package/lib/classes/routes/default-routing-factory.d.ts +8 -0
- package/lib/classes/routes/id-preloader-configuration.d.ts +28 -0
- package/lib/classes/routes/route-data.d.ts +5 -0
- package/lib/components/carousel/carousel-image/carousel-image.component.d.ts +10 -0
- package/lib/components/carousel/carousel-item/carousel-item.component.d.ts +9 -0
- package/lib/components/carousel/carousel.component.d.ts +32 -0
- package/lib/components/carousel/carousel.module.d.ts +12 -0
- package/lib/components/carousel/i-carousel-item.component.d.ts +9 -0
- package/lib/components/content-block/content-block.component.d.ts +15 -0
- package/lib/components/default/default-list/abstract-list.d.ts +21 -0
- package/lib/components/default/default-list/default-list.component.d.ts +42 -0
- package/lib/components/default/default-list/header-list/header-list.component.d.ts +45 -0
- package/lib/components/default/default-list/list.d.ts +37 -0
- package/lib/components/default/default-pagination/default-pagination.component.d.ts +36 -0
- package/lib/components/default/default-table/default-table.component.d.ts +71 -0
- package/lib/components/default/default-table/th-filter/th-filter.component.d.ts +20 -0
- package/lib/components/default/default-view/abstract-view.d.ts +16 -0
- package/lib/components/default/default-view/default-view.component.d.ts +26 -0
- package/lib/components/default/default-view/header-view/header-view.component.d.ts +25 -0
- package/lib/components/default/default-view/view.d.ts +55 -0
- package/lib/components/default/default.module.d.ts +28 -0
- package/lib/components/default-page/default.page.d.ts +35 -0
- package/lib/components/drag-drop-file/drag-drop-file.directive.d.ts +14 -0
- package/lib/components/drag-drop-file/drag-drop-file.module.d.ts +10 -0
- package/lib/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.d.ts +9 -0
- package/lib/components/drawer/default-drawer-end/default-drawer-end.component.d.ts +13 -0
- package/lib/components/drawer/drawer-group/drawer-group.component.d.ts +22 -0
- package/lib/components/drawer/drawer.component.d.ts +23 -0
- package/lib/components/drawer/menu.d.ts +9 -0
- package/lib/components/filter/filter.component.d.ts +29 -0
- package/lib/components/http-responses-pages/forbidden-403/forbidden-403.component.d.ts +8 -0
- package/lib/components/image/image.component.d.ts +23 -0
- package/lib/components/info-popover/info-popover.component.d.ts +15 -0
- package/lib/components/inputs/custom-input.d.ts +36 -0
- package/lib/components/inputs/custom-signal-input.d.ts +38 -0
- package/lib/components/inputs/input-bool/input-bool.component.d.ts +19 -0
- package/lib/components/inputs/input-bool/input-bool.configuration.d.ts +17 -0
- package/lib/components/inputs/input-color/input-color.component.d.ts +80 -0
- package/lib/components/inputs/input-configuration.d.ts +8 -0
- package/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.d.ts +24 -0
- package/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.configuration.d.ts +5 -0
- package/lib/components/inputs/input-date/input-date.component.d.ts +30 -0
- package/lib/components/inputs/input-date/input-date.configuration.d.ts +7 -0
- package/lib/components/inputs/input-decimal/input-decimal.component.d.ts +41 -0
- package/lib/components/inputs/input-decimal/input-decimal.configuration.d.ts +25 -0
- package/lib/components/inputs/input-default-configurations.d.ts +13 -0
- package/lib/components/inputs/input-file/download-button/download-button.component.d.ts +36 -0
- package/lib/components/inputs/input-file/input-file.component.d.ts +39 -0
- package/lib/components/inputs/input-file/input-file.configuration.d.ts +11 -0
- package/lib/components/inputs/input-loading/input-loading.component.d.ts +7 -0
- package/lib/components/inputs/input-provider-factory.d.ts +4 -0
- package/lib/components/inputs/input-select/ISelect.d.ts +21 -0
- package/lib/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.d.ts +18 -0
- package/lib/components/inputs/input-select/input-select-option/input-select-option.component.d.ts +24 -0
- package/lib/components/inputs/input-select/input-select-template.directive.d.ts +8 -0
- package/lib/components/inputs/input-select/input-select.component.d.ts +66 -0
- package/lib/components/inputs/input-select/input.select.configuration.d.ts +87 -0
- package/lib/components/inputs/input-string/input-string.component.d.ts +19 -0
- package/lib/components/inputs/input-string/input-string.configuration.d.ts +14 -0
- package/lib/components/inputs/input-textarea/input-textarea.component.d.ts +18 -0
- package/lib/components/inputs/input-type.d.ts +16 -0
- package/lib/components/inputs/input-validators.d.ts +19 -0
- package/lib/components/inputs/inputs.module.d.ts +28 -0
- package/lib/components/loading/loading.component.d.ts +18 -0
- package/lib/components/login/login-admin/login-admin.component.d.ts +20 -0
- package/lib/components/login/login.component.d.ts +28 -0
- package/lib/components/main-content/main-content.component.d.ts +17 -0
- package/lib/components/stepper/step/step.component.d.ts +15 -0
- package/lib/components/stepper/stepper.component.d.ts +17 -0
- package/lib/components/stepper/stepper.module.d.ts +10 -0
- package/lib/components/tabs/tab/tab.component.d.ts +19 -0
- package/lib/components/tabs/tabs/tabs.component.d.ts +18 -0
- package/lib/components/tabs/tabs.module.d.ts +12 -0
- package/lib/components/text-tooltip/text-tooltip.component.d.ts +16 -0
- package/lib/components/tooltip/tooltip.component.d.ts +7 -0
- package/lib/core.module.d.ts +11 -0
- package/lib/directives/ng-var.directive.d.ts +12 -0
- package/lib/guards/auth.guard.d.ts +11 -0
- package/lib/guards/error.interceptor.d.ts +32 -0
- package/lib/guards/token.interceptor.d.ts +11 -0
- package/lib/index.d.ts +108 -0
- package/lib/pipes/secure.pipe.d.ts +15 -0
- package/lib/services/auth.service.d.ts +47 -0
- package/lib/services/environment.service.d.ts +10 -0
- package/lib/services/generics.service.d.ts +22 -0
- package/lib/services/route/route.cache.service.d.ts +7 -0
- package/lib/services/route/route.provider.service.d.ts +13 -0
- package/lib/services/usuario.service.d.ts +21 -0
- package/lib/services/utils.service.d.ts +36 -0
- package/lib/services/web/api-url-provider.service.d.ts +13 -0
- package/lib/services/web/http.ativo.service.d.ts +31 -0
- package/lib/services/web/http.service.d.ts +51 -0
- package/lib/services/web/storage.service.d.ts +25 -0
- package/package.json +41 -0
- package/public-api.d.ts +1 -0
- package/themes/compiled-styles.scss +2291 -0
- package/themes/components/_inputs_new/input-string/input-string.component.scss +0 -0
- package/themes/components/_inputs_new/inputs.scss +15 -0
- package/themes/components/carousel/carousel-image/carousel-image.component.scss +0 -0
- package/themes/components/carousel/carousel-item/carousel-item.component.scss +0 -0
- package/themes/components/carousel/carousel.component.scss +9 -0
- package/themes/components/content-block/content-block.component.scss +0 -0
- package/themes/components/default/default-list/default-list.component.scss +0 -0
- package/themes/components/default/default-list/header-list/header-list.component.scss +0 -0
- package/themes/components/default/default-pagination/default-pagination.component.scss +22 -0
- package/themes/components/default/default-table/default-table.component.scss +33 -0
- package/themes/components/default/default-table/th-filter/th-filter.component.scss +24 -0
- package/themes/components/default/default-view/default-view.component.scss +5 -0
- package/themes/components/default/default-view/header-view/header-view.component.scss +7 -0
- package/themes/components/default-page/default.page.scss +4 -0
- package/themes/components/drag-drop-file/drag-drop-overlay/drag-drop-overlay.component.scss +9 -0
- package/themes/components/drawer/default-drawer-end/default-drawer-end.component.scss +0 -0
- package/themes/components/drawer/drawer-group/drawer-group.component.scss +22 -0
- package/themes/components/drawer/drawer.component.scss +46 -0
- package/themes/components/filter/filter.component.scss +0 -0
- package/themes/components/http-responses-pages/forbidden-403/forbidden-403.component.scss +19 -0
- package/themes/components/image/image.component.scss +0 -0
- package/themes/components/info-popover/info-popover.component.scss +3 -0
- package/themes/components/inputs/input-bool/input-bool.component.scss +14 -0
- package/themes/components/inputs/input-color/input-color.component.scss +48 -0
- package/themes/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.scss +0 -0
- package/themes/components/inputs/input-date/input-date.component.scss +41 -0
- package/themes/components/inputs/input-decimal/input-decimal.component.scss +44 -0
- package/themes/components/inputs/input-file/download-button/download-button.component.scss +3 -0
- package/themes/components/inputs/input-file/input-file.component.scss +3 -0
- package/themes/components/inputs/input-loading/input-loading.component.scss +0 -0
- package/themes/components/inputs/input-select/input-select-internal-option/input-select-internal-option.component.scss +0 -0
- package/themes/components/inputs/input-select/input-select-option/input-select-option.component.scss +0 -0
- package/themes/components/inputs/input-select/input-select.component.scss +28 -0
- package/themes/components/inputs/input-string/input-string.component.scss +0 -0
- package/themes/components/inputs/input-textarea/input-textarea.component.scss +0 -0
- package/themes/components/inputs/inputs.scss +67 -0
- package/themes/components/loading/loading.component.scss +0 -0
- package/themes/components/login/login-admin/login-admin.component.scss +3 -0
- package/themes/components/login/login.component.scss +40 -0
- package/themes/components/main-content/main-content.component.scss +9 -0
- package/themes/components/stepper/step/step.component.scss +48 -0
- package/themes/components/stepper/stepper.component.scss +0 -0
- package/themes/components/tabs/tab/tab.component.scss +0 -0
- package/themes/components/tabs/tabs/tabs.component.scss +23 -0
- package/themes/components/text-tooltip/text-tooltip.component.scss +0 -0
- package/themes/components/tooltip/tooltip.component.scss +23 -0
- package/themes/styles/components.scss +52 -0
- package/themes/styles/core.styles.scss +409 -0
- package/themes/styles/ionic/ion-action-sheet.scss +8 -0
- package/themes/styles/ionic/ion-alert.scss +9 -0
- package/themes/styles/ionic/ion-button.scss +3 -0
- package/themes/styles/ionic/ion-card.scss +3 -0
- package/themes/styles/ionic/ion-content.scss +3 -0
- package/themes/styles/ionic/ion-datetime.scss +6 -0
- package/themes/styles/ionic/ion-item.scss +10 -0
- package/themes/styles/ionic/ion-list.scss +4 -0
- package/themes/styles/ionic/ion-modal.scss +8 -0
- package/themes/styles/ionic/ion-popover.scss +31 -0
- package/themes/styles/ionic/ion-progress-bar.scss +3 -0
- package/themes/styles/ionic/ion-searchbar.scss +4 -0
- package/themes/styles/ionic/ion-toast.scss +14 -0
- package/themes/styles/ionic.scss +13 -0
- package/themes/styles/login-default.scss +87 -0
- package/themes/styles/mixins.scss +467 -0
- package/themes/styles/styles.scss +1 -0
- package/themes/styles/translucid.scss +21 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { Component, ContentChildren, ElementRef, Host, HostListener, Optional, QueryList, SkipSelf, ViewChild, ViewChildren, computed, effect, forwardRef, model, signal } from '@angular/core';
|
|
2
|
+
import { IonInput, IonItem, IonPopover, IonSearchbar } from '@ionic/angular';
|
|
3
|
+
import { ControlContainer } from '@angular/forms';
|
|
4
|
+
import { interval } from 'rxjs';
|
|
5
|
+
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
|
6
|
+
import { BindLabelFactory, BindValueFactory, InputSelectConfiguration } from './input.select.configuration';
|
|
7
|
+
import { InputSelectInternalOptionComponent } from './input-select-internal-option/input-select-internal-option.component';
|
|
8
|
+
import { InputSelectOptionComponent } from './input-select-option/input-select-option.component';
|
|
9
|
+
import { ISelect } from './ISelect';
|
|
10
|
+
import { InputProviderFactory } from '../input-provider-factory';
|
|
11
|
+
import { CustomSignalInput } from '../custom-signal-input';
|
|
12
|
+
import { Search } from '../../../services/utils.service';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@angular/forms";
|
|
15
|
+
import * as i2 from "@angular/common";
|
|
16
|
+
import * as i3 from "@ionic/angular";
|
|
17
|
+
import * as i4 from "@angular/cdk/scrolling";
|
|
18
|
+
import * as i5 from "../input-loading/input-loading.component";
|
|
19
|
+
import * as i6 from "./input-select-internal-option/input-select-internal-option.component";
|
|
20
|
+
export class InputSelectComponent extends CustomSignalInput {
|
|
21
|
+
constructor(controlContainer, elementRef) {
|
|
22
|
+
super();
|
|
23
|
+
this.controlContainer = controlContainer;
|
|
24
|
+
this.elementRef = elementRef;
|
|
25
|
+
/** Items disponíveis no select */
|
|
26
|
+
this.items = model([]);
|
|
27
|
+
/** Configuração do select */
|
|
28
|
+
this.configuration = model(new InputSelectConfiguration());
|
|
29
|
+
this.loadingFromLoader = false;
|
|
30
|
+
this.useDefaultModelOptions = signal(false);
|
|
31
|
+
this.bindValue = computed(() => {
|
|
32
|
+
if (this.useDefaultModelOptions()) {
|
|
33
|
+
return ((obj) => { return obj.value; });
|
|
34
|
+
}
|
|
35
|
+
return BindValueFactory(this.configuration());
|
|
36
|
+
});
|
|
37
|
+
this.bindLabel = computed(() => {
|
|
38
|
+
if (this.useDefaultModelOptions()) {
|
|
39
|
+
return ((obj) => { return obj.label; });
|
|
40
|
+
}
|
|
41
|
+
return BindLabelFactory(this.configuration());
|
|
42
|
+
});
|
|
43
|
+
this.lastItemsQtd = null;
|
|
44
|
+
this.CurrentLabel = "";
|
|
45
|
+
this.CurrentlyNoValue = true;
|
|
46
|
+
//[ Model ]
|
|
47
|
+
this._model = null;
|
|
48
|
+
this.interfaceOptions = { cssClass: 'wider-popover' };
|
|
49
|
+
this.Search = model("");
|
|
50
|
+
this.lstSearchItens = computed(() => { return Search(this.items(), this.Search(), this.bindLabel()); });
|
|
51
|
+
effect(() => { this.Update(); }, { allowSignalWrites: true });
|
|
52
|
+
this.updateInterval = interval(1000);
|
|
53
|
+
this.updateSubscription = this.updateInterval.subscribe(() => {
|
|
54
|
+
if (this.lastItemsQtd != this.items().length) {
|
|
55
|
+
this.lastItemsQtd = this.items().length;
|
|
56
|
+
this.Update();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
ngOnDestroy() {
|
|
61
|
+
this.updateSubscription.unsubscribe();
|
|
62
|
+
}
|
|
63
|
+
ngOnInit() {
|
|
64
|
+
super.ngOnInit();
|
|
65
|
+
this.configuration().loader.AddComponent(this);
|
|
66
|
+
this.configuration().loader.Refresh(this.items());
|
|
67
|
+
}
|
|
68
|
+
Clear() {
|
|
69
|
+
this.model = null;
|
|
70
|
+
this.Update();
|
|
71
|
+
}
|
|
72
|
+
Update() {
|
|
73
|
+
this.UpdateSelected();
|
|
74
|
+
this.UpdateCurrentLabel();
|
|
75
|
+
}
|
|
76
|
+
UpdateCurrentLabel() {
|
|
77
|
+
if (this._model == null) {
|
|
78
|
+
this.CurrentLabel = this.configuration().placeholder;
|
|
79
|
+
this.CurrentlyNoValue = true;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!this.configuration().multiple) {
|
|
83
|
+
const m = this.items().find(p => this.bindValue()(p) == this._model);
|
|
84
|
+
if (m) {
|
|
85
|
+
this.CurrentLabel = this.bindLabel()(m);
|
|
86
|
+
this.CurrentlyNoValue = false;
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
if (!this._model) {
|
|
92
|
+
this.CurrentLabel = this.configuration().placeholder;
|
|
93
|
+
this.CurrentlyNoValue = true;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
else if (Array.isArray(this.model) && !this.model.length) {
|
|
97
|
+
this.CurrentLabel = this.configuration().placeholder;
|
|
98
|
+
this.CurrentlyNoValue = true;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.CurrentLabel = "";
|
|
102
|
+
this.CurrentlyNoValue = false;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
UpdateSelected() {
|
|
107
|
+
if (this.lstOptions && this.lstOptions.length) {
|
|
108
|
+
this.lstOptions.forEach(p => p.isSelected = false);
|
|
109
|
+
this.lstOptions.filter(p => Array.isArray(this._model) ? this._model.includes(p.value) : this._model == p.value).forEach(p => p.isSelected = true);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
IsSelected(item) {
|
|
113
|
+
if (Array.isArray(this._model)) {
|
|
114
|
+
return this._model.includes(this.bindValue()(item));
|
|
115
|
+
}
|
|
116
|
+
return this._model == this.bindValue()(item);
|
|
117
|
+
}
|
|
118
|
+
/** Applies only on multiple */
|
|
119
|
+
GetSelectedItens() {
|
|
120
|
+
if (this._model && this.lstOptions.length) {
|
|
121
|
+
return this.lstOptions.filter(p => p.isSelected).map(p => p.model());
|
|
122
|
+
}
|
|
123
|
+
if (this._model && this.items()) {
|
|
124
|
+
return this.items().filter(p => Array.isArray(this._model) ? this._model.includes(this.bindValue()(p)) : this._model == this.bindValue()(p));
|
|
125
|
+
}
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
get model() { return this._model; }
|
|
129
|
+
set model(value) {
|
|
130
|
+
this.SetModel(value);
|
|
131
|
+
this.propagateChange(this._model);
|
|
132
|
+
}
|
|
133
|
+
SetModel(value) {
|
|
134
|
+
if (value == null) {
|
|
135
|
+
this._model = null;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this._model = value;
|
|
139
|
+
this.Update();
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
SearchChanged() {
|
|
143
|
+
if (this.lstOptions.length) {
|
|
144
|
+
this.useDefaultModelOptions.set(true);
|
|
145
|
+
var lst = Search(this.lstOptions.map(p => p.model()), this.Search(), this.bindLabel());
|
|
146
|
+
this.lstOptions.forEach(p => p.hidden = !lst.includes(p.model()));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
GetUseDefaultModelOptions() {
|
|
150
|
+
if (this.lstOptions && this.lstOptions.length) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
UpdateUseDefaultModelOptions() {
|
|
156
|
+
this.useDefaultModelOptions.set(this.GetUseDefaultModelOptions());
|
|
157
|
+
if (this.useDefaultModelOptions()) {
|
|
158
|
+
if (this.items().length != this.lstOptions.length) {
|
|
159
|
+
this.items.set(this.lstOptions.map(p => p.model()));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//[ Select ]
|
|
164
|
+
writeValue(obj) { this.SetModel(obj); }
|
|
165
|
+
Select(item) {
|
|
166
|
+
this.UpdateUseDefaultModelOptions();
|
|
167
|
+
if (!this.configuration().multiple) {
|
|
168
|
+
this.model = this.bindValue()(item);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
var value = this.bindValue()(item);
|
|
172
|
+
if (this._model) {
|
|
173
|
+
if (this._model.includes(value)) {
|
|
174
|
+
this.model = [...this._model.filter(p => p != value)];
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
this.model = [...this._model, value];
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
this.model = [value];
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async PresentPopover($event) {
|
|
186
|
+
Object.defineProperty($event, 'target', { writable: false, value: this.inputContainer.nativeElement });
|
|
187
|
+
const Popover = this.ionPopoverComponent;
|
|
188
|
+
const PopoverElement = this.ionPopoverElement.nativeElement;
|
|
189
|
+
const PopoverContent = Array.from(Array.from(PopoverElement.shadowRoot.children).find(p => p.classList.contains("popover-wrapper")).children).find(p => p.classList.contains("popover-content"));
|
|
190
|
+
PopoverContent.style.width = this.inputContainer.nativeElement.offsetWidth + 'px';
|
|
191
|
+
await Popover.present($event);
|
|
192
|
+
this.searchbarComponent.setFocus();
|
|
193
|
+
if (this.cdkVirtualScrollViewport) {
|
|
194
|
+
this.cdkVirtualScrollViewport.nativeElement.scroll({ top: 1, behavior: 'smooth' });
|
|
195
|
+
}
|
|
196
|
+
this.focusedModel = null;
|
|
197
|
+
this.UpdateUseDefaultModelOptions();
|
|
198
|
+
}
|
|
199
|
+
;
|
|
200
|
+
async HandleKeyboardEvent(event) {
|
|
201
|
+
if (!this.inputComponent || !this.searchbarComponent) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const inputComponent = await this.inputComponent.getInputElement();
|
|
205
|
+
const searchbarComponent = await this.searchbarComponent.getInputElement();
|
|
206
|
+
if (event.target == inputComponent && event.key == "ArrowDown" && this.configuration().searcheable) {
|
|
207
|
+
this.itemComponent.nativeElement.click();
|
|
208
|
+
event.preventDefault();
|
|
209
|
+
}
|
|
210
|
+
else if (event.target == searchbarComponent) {
|
|
211
|
+
this.UpdateUseDefaultModelOptions();
|
|
212
|
+
const items = this.lstSearchItens();
|
|
213
|
+
if (event.key == "ArrowDown") {
|
|
214
|
+
if (this.focusedModel) {
|
|
215
|
+
const index = items.indexOf(this.focusedModel);
|
|
216
|
+
if (items[index + 1]) {
|
|
217
|
+
this.SetFocusedElement(items[index + 1]);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
this.SetFocusedElement(items[0]);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
if (items[0]) {
|
|
225
|
+
this.SetFocusedElement(items[0]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else if (event.key == "ArrowUp") {
|
|
230
|
+
if (this.focusedModel) {
|
|
231
|
+
const index = items.indexOf(this.focusedModel);
|
|
232
|
+
if (items[index - 1]) {
|
|
233
|
+
this.SetFocusedElement(items[index - 1]);
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.SetFocusedElement(items[items.length - 1]);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else if (event.key == "Enter") {
|
|
241
|
+
var Option;
|
|
242
|
+
if (this.useDefaultModelOptions()) {
|
|
243
|
+
Option = this.lstOptions.find(p => p.model() == this.focusedModel);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
Option = this.lstInternalOptions.find(p => p.model == this.focusedModel);
|
|
247
|
+
}
|
|
248
|
+
if (!Option.disabled) {
|
|
249
|
+
this.Select(this.focusedModel);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
SetFocusedElement(focusedModel, scroll = true) {
|
|
255
|
+
this.focusedModel = focusedModel;
|
|
256
|
+
var Option;
|
|
257
|
+
if (this.useDefaultModelOptions()) {
|
|
258
|
+
Option = this.lstOptions.find(p => p.model() == focusedModel);
|
|
259
|
+
this.lstOptions.filter(p => p.onFocus).forEach(p => p.onFocus = false);
|
|
260
|
+
Option.onFocus = true;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
Option = this.lstInternalOptions.find(p => p.model == focusedModel);
|
|
264
|
+
this.lstInternalOptions.filter(p => p.onFocus).forEach(p => p.onFocus = false);
|
|
265
|
+
Option.onFocus = true;
|
|
266
|
+
}
|
|
267
|
+
if (scroll) {
|
|
268
|
+
Option.GetNativeElement().scrollIntoView({ behavior: 'smooth' });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputSelectComponent, deps: [{ token: i1.ControlContainer, host: true, optional: true, skipSelf: true }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
272
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: InputSelectComponent, selector: "input-select", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: false, transformFunction: null }, Search: { classPropertyName: "Search", publicName: "Search", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { items: "itemsChange", configuration: "configurationChange", Search: "SearchChange" }, host: { listeners: { "document:keydown": "HandleKeyboardEvent($event)" } }, providers: [InputProviderFactory.GetProvider(InputSelectComponent, [
|
|
273
|
+
{
|
|
274
|
+
provide: ISelect, useExisting: forwardRef(() => InputSelectComponent)
|
|
275
|
+
}
|
|
276
|
+
])], queries: [{ propertyName: "lstOptions", predicate: InputSelectOptionComponent }], viewQueries: [{ propertyName: "cdkVirtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, read: (ElementRef) }, { propertyName: "inputContainer", first: true, predicate: ["container"], descendants: true, read: ElementRef }, { propertyName: "ionPopoverComponent", first: true, predicate: IonPopover, descendants: true }, { propertyName: "ionPopoverElement", first: true, predicate: IonPopover, descendants: true, read: ElementRef }, { propertyName: "searchbarComponent", first: true, predicate: IonSearchbar, descendants: true }, { propertyName: "inputComponent", first: true, predicate: IonInput, descendants: true }, { propertyName: "itemComponent", first: true, predicate: IonItem, descendants: true, read: ElementRef }, { propertyName: "lstInternalOptions", predicate: InputSelectInternalOptionComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"relative flex overflow-hidden\" #container>\r\n <ion-card \r\n class=\"focus-within:on-focus ion-card-input\" \r\n [disabled]=\"loading || loadingFromLoader || disabled\" \r\n [class.invalid]=\"invalid\"\r\n [class.submitted]=\"submitted\"\r\n [class.disabled]=\"disabled\"\r\n [ngClass]=\"{'!rounded-l-2xl !rounded-r-none !border-r-0': configuration().clearable}\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\" class=\"rounded-2xl w-full relative\" (click)=\"PresentPopover($event)\" [ngClass]=\"{'!rounded-l-2xl !rounded-r-none': configuration().clearable }\">\r\n <ion-input fill=\"none\" [readonly]=\"true\" labelPlacement=\"stacked\" [value]=\"CurrentLabel\" [class.no-items-opacity]=\"CurrentlyNoValue\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required() }\" slot=\"label\" class=\"!text-dark\"> \r\n {{label}} \r\n </ion-text>\r\n </ion-input>\r\n @if(configuration().multiple){\r\n <div class=\"absolute left-0 bottom-0 h-6 w-full flex z-[90] overflow-x-auto\">\r\n @for(item of GetSelectedItens(); track $index){\r\n <div class=\"h-full flex bg-medium/10 border translucid-border rounded-lg mr-1 animated\">\r\n <div (click)=\"Select(item); $event.stopPropagation()\" class=\"bg-medium/10 cursor-pointer translucid-border min-w-min !border-l-0 !border-y-0 h-full aspect-square flex items-center justify-center rounded-r-lg\"> \r\n <ion-icon color=\"danger\" name=\"close\"></ion-icon>\r\n </div>\r\n <div class=\"h-full px-1 select-none\"> {{bindLabel()(item)}} </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ion-item>\r\n \r\n </ion-card-content>\r\n </ion-card>\r\n <input-loading [loading]=\"loading || loadingFromLoader\"></input-loading>\r\n @if(configuration().clearable){\r\n <div class=\"w-12\">\r\n <ion-button (click)=\"Clear()\" [disabled]=\"loading || disabled || loadingFromLoader\" size=\"small\" fill=\"outline\" color=\"medium\" class=\"rounded-r-2xl h-full w-full\" style=\"--border-width: 1px 1px 2px 1px;\">\r\n <ion-icon name=\"backspace\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n }\r\n</div>\r\n\r\n<ion-popover class=\"input-select-popover\" [keepContentsMounted]=\"false\" [dismissOnSelect]=\"!configuration().multiple\" (didDismiss)=\"Search.set('')\">\r\n <ng-template>\r\n <div class=\"size-full flex flex-col bg-primary/10\">\r\n <div class=\"w-full shrink-0\" [hidden]=\"!configuration().searcheable\">\r\n <ion-searchbar [(ngModel)]=\"Search\" (ngModelChange)=\"SearchChanged()\" placeholder=\"Pesquisa...\" class=\"size-full bg-transparent\" [debounce]=\"100\"></ion-searchbar>\r\n </div>\r\n\r\n <div class=\"h-48 w-full overflow-hidden translucid-border !border-x-0 !border-b-0 rounded-t-2xl bg-light\" [ngClass]=\"{'!border-0': !configuration().searcheable}\">\r\n @if(!lstOptions || !lstOptions.length){\r\n <cdk-virtual-scroll-viewport itemSize=\"45\" [minBufferPx]=\"200\" [maxBufferPx]=\"300\" class=\"size-full\">\r\n <input-select-internal-option [model]=\"item\" *cdkVirtualFor=\"let item of lstSearchItens()\" [isSelected]=\"IsSelected(item)\">\r\n <ion-label class=\"truncate\">{{bindLabel()(item)}}</ion-label>\r\n </input-select-internal-option>\r\n </cdk-virtual-scroll-viewport>\r\n }\r\n @else {\r\n <div class=\"size-full overflow-y-auto overflow-x-hidden mask-y\">\r\n <ng-content select=\"input-select-option\"></ng-content>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ion-popover>", styles: [".no-items-opacity{--color: color-mix(in srgb, var(--ion-color-dark) 60%, transparent 40%)}.rounded-2xl,.\\!rounded-2xl{--border-radius: 1rem}.rounded-r-2xl,.\\!rounded-r-2xl{--border-radius: 0rem 1rem 1rem 0rem}.rounded-l-2xl,.\\!rounded-l-2xl{--border-radius: 1rem 0rem 0rem 1rem}.rounded-tr-none,.\\!rounded-tr-none{--border-radius: 0rem 0rem 1rem 0rem}\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocapitalize", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "maxlength", "minlength", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i3.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i5.InputLoadingComponent, selector: "input-loading", inputs: ["loading"] }, { kind: "component", type: i6.InputSelectInternalOptionComponent, selector: "input-select-internal-option", inputs: ["hidden", "disabled", "label", "model", "isSelected"], outputs: ["labelChange"] }] }); }
|
|
277
|
+
}
|
|
278
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputSelectComponent, decorators: [{
|
|
279
|
+
type: Component,
|
|
280
|
+
args: [{ selector: 'input-select', providers: [InputProviderFactory.GetProvider(InputSelectComponent, [
|
|
281
|
+
{
|
|
282
|
+
provide: ISelect, useExisting: forwardRef(() => InputSelectComponent)
|
|
283
|
+
}
|
|
284
|
+
])], template: "<div class=\"relative flex overflow-hidden\" #container>\r\n <ion-card \r\n class=\"focus-within:on-focus ion-card-input\" \r\n [disabled]=\"loading || loadingFromLoader || disabled\" \r\n [class.invalid]=\"invalid\"\r\n [class.submitted]=\"submitted\"\r\n [class.disabled]=\"disabled\"\r\n [ngClass]=\"{'!rounded-l-2xl !rounded-r-none !border-r-0': configuration().clearable}\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\" class=\"rounded-2xl w-full relative\" (click)=\"PresentPopover($event)\" [ngClass]=\"{'!rounded-l-2xl !rounded-r-none': configuration().clearable }\">\r\n <ion-input fill=\"none\" [readonly]=\"true\" labelPlacement=\"stacked\" [value]=\"CurrentLabel\" [class.no-items-opacity]=\"CurrentlyNoValue\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required() }\" slot=\"label\" class=\"!text-dark\"> \r\n {{label}} \r\n </ion-text>\r\n </ion-input>\r\n @if(configuration().multiple){\r\n <div class=\"absolute left-0 bottom-0 h-6 w-full flex z-[90] overflow-x-auto\">\r\n @for(item of GetSelectedItens(); track $index){\r\n <div class=\"h-full flex bg-medium/10 border translucid-border rounded-lg mr-1 animated\">\r\n <div (click)=\"Select(item); $event.stopPropagation()\" class=\"bg-medium/10 cursor-pointer translucid-border min-w-min !border-l-0 !border-y-0 h-full aspect-square flex items-center justify-center rounded-r-lg\"> \r\n <ion-icon color=\"danger\" name=\"close\"></ion-icon>\r\n </div>\r\n <div class=\"h-full px-1 select-none\"> {{bindLabel()(item)}} </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </ion-item>\r\n \r\n </ion-card-content>\r\n </ion-card>\r\n <input-loading [loading]=\"loading || loadingFromLoader\"></input-loading>\r\n @if(configuration().clearable){\r\n <div class=\"w-12\">\r\n <ion-button (click)=\"Clear()\" [disabled]=\"loading || disabled || loadingFromLoader\" size=\"small\" fill=\"outline\" color=\"medium\" class=\"rounded-r-2xl h-full w-full\" style=\"--border-width: 1px 1px 2px 1px;\">\r\n <ion-icon name=\"backspace\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n }\r\n</div>\r\n\r\n<ion-popover class=\"input-select-popover\" [keepContentsMounted]=\"false\" [dismissOnSelect]=\"!configuration().multiple\" (didDismiss)=\"Search.set('')\">\r\n <ng-template>\r\n <div class=\"size-full flex flex-col bg-primary/10\">\r\n <div class=\"w-full shrink-0\" [hidden]=\"!configuration().searcheable\">\r\n <ion-searchbar [(ngModel)]=\"Search\" (ngModelChange)=\"SearchChanged()\" placeholder=\"Pesquisa...\" class=\"size-full bg-transparent\" [debounce]=\"100\"></ion-searchbar>\r\n </div>\r\n\r\n <div class=\"h-48 w-full overflow-hidden translucid-border !border-x-0 !border-b-0 rounded-t-2xl bg-light\" [ngClass]=\"{'!border-0': !configuration().searcheable}\">\r\n @if(!lstOptions || !lstOptions.length){\r\n <cdk-virtual-scroll-viewport itemSize=\"45\" [minBufferPx]=\"200\" [maxBufferPx]=\"300\" class=\"size-full\">\r\n <input-select-internal-option [model]=\"item\" *cdkVirtualFor=\"let item of lstSearchItens()\" [isSelected]=\"IsSelected(item)\">\r\n <ion-label class=\"truncate\">{{bindLabel()(item)}}</ion-label>\r\n </input-select-internal-option>\r\n </cdk-virtual-scroll-viewport>\r\n }\r\n @else {\r\n <div class=\"size-full overflow-y-auto overflow-x-hidden mask-y\">\r\n <ng-content select=\"input-select-option\"></ng-content>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n</ion-popover>", styles: [".no-items-opacity{--color: color-mix(in srgb, var(--ion-color-dark) 60%, transparent 40%)}.rounded-2xl,.\\!rounded-2xl{--border-radius: 1rem}.rounded-r-2xl,.\\!rounded-r-2xl{--border-radius: 0rem 1rem 1rem 0rem}.rounded-l-2xl,.\\!rounded-l-2xl{--border-radius: 1rem 0rem 0rem 1rem}.rounded-tr-none,.\\!rounded-tr-none{--border-radius: 0rem 0rem 1rem 0rem}\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"] }]
|
|
285
|
+
}], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{
|
|
286
|
+
type: Optional
|
|
287
|
+
}, {
|
|
288
|
+
type: Host
|
|
289
|
+
}, {
|
|
290
|
+
type: SkipSelf
|
|
291
|
+
}] }, { type: i0.ElementRef }], propDecorators: { lstOptions: [{
|
|
292
|
+
type: ContentChildren,
|
|
293
|
+
args: [InputSelectOptionComponent]
|
|
294
|
+
}], lstInternalOptions: [{
|
|
295
|
+
type: ViewChildren,
|
|
296
|
+
args: [InputSelectInternalOptionComponent]
|
|
297
|
+
}], cdkVirtualScrollViewport: [{
|
|
298
|
+
type: ViewChild,
|
|
299
|
+
args: [CdkVirtualScrollViewport, { read: (ElementRef) }]
|
|
300
|
+
}], inputContainer: [{
|
|
301
|
+
type: ViewChild,
|
|
302
|
+
args: ['container', { read: ElementRef }]
|
|
303
|
+
}], ionPopoverComponent: [{
|
|
304
|
+
type: ViewChild,
|
|
305
|
+
args: [IonPopover]
|
|
306
|
+
}], ionPopoverElement: [{
|
|
307
|
+
type: ViewChild,
|
|
308
|
+
args: [IonPopover, { read: ElementRef }]
|
|
309
|
+
}], searchbarComponent: [{
|
|
310
|
+
type: ViewChild,
|
|
311
|
+
args: [IonSearchbar]
|
|
312
|
+
}], inputComponent: [{
|
|
313
|
+
type: ViewChild,
|
|
314
|
+
args: [IonInput]
|
|
315
|
+
}], itemComponent: [{
|
|
316
|
+
type: ViewChild,
|
|
317
|
+
args: [IonItem, { read: ElementRef }]
|
|
318
|
+
}], HandleKeyboardEvent: [{
|
|
319
|
+
type: HostListener,
|
|
320
|
+
args: ['document:keydown', ['$event']]
|
|
321
|
+
}] } });
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NhcHBoaXJlLWlvbi1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0cy9pbnB1dC1zZWxlY3QvaW5wdXQtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NhcHBoaXJlLWlvbi1mcmFtZXdvcmsvc3JjL2xpYi9jb21wb25lbnRzL2lucHV0cy9pbnB1dC1zZWxlY3QvaW5wdXQtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFrQyxRQUFRLEVBQUUsU0FBUyxFQUFVLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFrQixRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hQLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUE0QixRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUF1Qix3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2pJLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQzNILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ2pHLE9BQU8s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RUFDOUIsWUFBWSxpRkE4QlosUUFBUSxnRkFDUixPQUFPLDJCQUFVLFVBQVUscURBck54QixrQ0FBa0MsdUVDbkNsRCw0dkhBaUVjOzs0RkR2Q0Qsb0JBQW9CO2tCQVpoQyxTQUFTOytCQUNFLGNBQWMsYUFHYixDQUFDLG9CQUFvQixDQUFDLFdBQVcsdUJBQzFDOzRCQUNFO2dDQUNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUM7NkJBQ3RFO3lCQUNGLENBQ0YsQ0FBQzs7MEJBeUJDLFFBQVE7OzBCQUFJLElBQUk7OzBCQUFJLFFBQVE7a0VBZmMsVUFBVTtzQkFBdEQsZUFBZTt1QkFBQywwQkFBMEI7Z0JBQ08sa0JBQWtCO3NCQUFuRSxZQUFZO3VCQUFDLGtDQUFrQztnQkFDZ0Isd0JBQXdCO3NCQUF2RixTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUEsVUFBZSxDQUFBLEVBQUU7Z0JBa0xoQixjQUFjO3NCQUEzRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ3JCLG1CQUFtQjtzQkFBekMsU0FBUzt1QkFBQyxVQUFVO2dCQUN3QixpQkFBaUI7c0JBQTdELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDbEIsa0JBQWtCO3NCQUExQyxTQUFTO3VCQUFDLFlBQVk7Z0JBOEJGLGNBQWM7c0JBQWxDLFNBQVM7dUJBQUMsUUFBUTtnQkFDd0IsYUFBYTtzQkFBdkQsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUVsQyxtQkFBbUI7c0JBRHhCLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgSG9zdCwgSG9zdExpc3RlbmVyLCBNb2RlbFNpZ25hbCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBRdWVyeUxpc3QsIFNpZ25hbCwgU2tpcFNlbGYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBXcml0YWJsZVNpZ25hbCwgY29tcHV0ZWQsIGVmZmVjdCwgZm9yd2FyZFJlZiwgbW9kZWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJb25JbnB1dCwgSW9uSXRlbSwgSW9uUG9wb3ZlciwgSW9uU2VhcmNoYmFyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xyXG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBpbnRlcnZhbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuXHJcbmltcG9ydCB7IEJpbmRMYWJlbEZhY3RvcnksIEJpbmRWYWx1ZUZhY3RvcnksIERlZmF1bHRNb2RlbE9wdGlvbnMsIElucHV0U2VsZWN0Q29uZmlndXJhdGlvbiB9IGZyb20gJy4vaW5wdXQuc2VsZWN0LmNvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBJbnB1dFNlbGVjdEludGVybmFsT3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9pbnB1dC1zZWxlY3QtaW50ZXJuYWwtb3B0aW9uL2lucHV0LXNlbGVjdC1pbnRlcm5hbC1vcHRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgSW5wdXRTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2lucHV0LXNlbGVjdC1vcHRpb24vaW5wdXQtc2VsZWN0LW9wdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJU2VsZWN0LCBJU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi9JU2VsZWN0JztcclxuaW1wb3J0IHsgSW5wdXRQcm92aWRlckZhY3RvcnkgfSBmcm9tICcuLi9pbnB1dC1wcm92aWRlci1mYWN0b3J5JztcclxuaW1wb3J0IHsgQ3VzdG9tU2lnbmFsSW5wdXQgfSBmcm9tICcuLi9jdXN0b20tc2lnbmFsLWlucHV0JztcclxuaW1wb3J0IHsgU2VhcmNoIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2lucHV0LXNlbGVjdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtc2VsZWN0LmNvbXBvbmVudC5zY3NzJywgJy4uL2lucHV0cy5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbSW5wdXRQcm92aWRlckZhY3RvcnkuR2V0UHJvdmlkZXIoSW5wdXRTZWxlY3RDb21wb25lbnQsIFxyXG4gICAgW1xyXG4gICAgICB7IFxyXG4gICAgICAgIHByb3ZpZGU6IElTZWxlY3QsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElucHV0U2VsZWN0Q29tcG9uZW50KVxyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgKV1cclxufSlcclxuZXhwb3J0IGNsYXNzIElucHV0U2VsZWN0Q29tcG9uZW50IGV4dGVuZHMgQ3VzdG9tU2lnbmFsSW5wdXQ8YW55PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgSVNlbGVjdCB7XHJcblxyXG4gIC8qKiBJdGVtcyBkaXNwb27DrXZlaXMgbm8gc2VsZWN0ICovXHJcbiAgcHVibGljIGl0ZW1zICAgICAgICAgICAgOiBNb2RlbFNpZ25hbDxhbnlbXT4gICAgICAgICAgICAgICAgICAgID0gbW9kZWw8YW55W10+KFtdKTtcclxuICAvKiogQ29uZmlndXJhw6fDo28gZG8gc2VsZWN0ICovXHJcbiAgcHVibGljIGNvbmZpZ3VyYXRpb24gICAgOiBNb2RlbFNpZ25hbDxJbnB1dFNlbGVjdENvbmZpZ3VyYXRpb24+ID0gbW9kZWw8SW5wdXRTZWxlY3RDb25maWd1cmF0aW9uPihuZXcgSW5wdXRTZWxlY3RDb25maWd1cmF0aW9uKCkpOyBcclxuICBwdWJsaWMgbG9hZGluZ0Zyb21Mb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihJbnB1dFNlbGVjdE9wdGlvbkNvbXBvbmVudCkgbHN0T3B0aW9uczogUXVlcnlMaXN0PElucHV0U2VsZWN0T3B0aW9uQ29tcG9uZW50PjtcclxuICBAVmlld0NoaWxkcmVuKElucHV0U2VsZWN0SW50ZXJuYWxPcHRpb25Db21wb25lbnQpIGxzdEludGVybmFsT3B0aW9uczogUXVlcnlMaXN0PElucHV0U2VsZWN0SW50ZXJuYWxPcHRpb25Db21wb25lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCB7IHJlYWQ6IEVsZW1lbnRSZWY8YW55PiB9KSBjZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ6IEVsZW1lbnRSZWY8YW55PlxyXG5cclxuICBwcml2YXRlIHVzZURlZmF1bHRNb2RlbE9wdGlvbnM6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcm90ZWN0ZWQgYmluZFZhbHVlOiBTaWduYWw8KChhcmdzOiBhbnkpID0+IGFueSk+ICAgICAgICAgPSBjb21wdXRlZCgoKSA9PiB7IFxyXG4gICAgaWYodGhpcy51c2VEZWZhdWx0TW9kZWxPcHRpb25zKCkpeyByZXR1cm4gKChvYmo6IERlZmF1bHRNb2RlbE9wdGlvbnMpOiBzdHJpbmcgPT4geyByZXR1cm4gb2JqLnZhbHVlOyB9KTsgfVxyXG4gICAgcmV0dXJuIEJpbmRWYWx1ZUZhY3RvcnkodGhpcy5jb25maWd1cmF0aW9uKCkpO1xyXG4gIH0pO1xyXG4gIHByb3RlY3RlZCBiaW5kTGFiZWw6IFNpZ25hbDwoKGFyZ3M6IGFueSkgPT4gc3RyaW5nKT4gICAgICA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGlmKHRoaXMudXNlRGVmYXVsdE1vZGVsT3B0aW9ucygpKXsgcmV0dXJuICgob2JqOiBEZWZhdWx0TW9kZWxPcHRpb25zKTogc3RyaW5nID0+IHsgcmV0dXJuIG9iai5sYWJlbDsgfSk7IH1cclxuICAgIHJldHVybiBCaW5kTGFiZWxGYWN0b3J5KHRoaXMuY29uZmlndXJhdGlvbigpKTtcclxuICB9KTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKSBASG9zdCgpIEBTa2lwU2VsZigpXHJcbiAgICBvdmVycmlkZSBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxyXG4gICAgb3ZlcnJpZGUgZWxlbWVudFJlZiAgICAgIDogRWxlbWVudFJlZlxyXG4gICkgeyBzdXBlcigpO1xyXG4gICAgZWZmZWN0KCgpID0+IHsgdGhpcy5VcGRhdGUoKTsgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUludGVydmFsICAgICA9IGludGVydmFsKDEwMDApO1xyXG4gICAgdGhpcy51cGRhdGVTdWJzY3JpcHRpb24gPSB0aGlzLnVwZGF0ZUludGVydmFsLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmKHRoaXMubGFzdEl0ZW1zUXRkICE9IHRoaXMuaXRlbXMoKS5sZW5ndGgpe1xyXG4gICAgICAgIHRoaXMubGFzdEl0ZW1zUXRkID0gdGhpcy5pdGVtcygpLmxlbmd0aDtcclxuICAgICAgICB0aGlzLlVwZGF0ZSgpO1xyXG4gICAgICB9IFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVJbnRlcnZhbDogT2JzZXJ2YWJsZTxudW1iZXI+IHwgbnVsbDtcclxuICB1cGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgbGFzdEl0ZW1zUXRkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBcclxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgdGhpcy5jb25maWd1cmF0aW9uKCkubG9hZGVyLkFkZENvbXBvbmVudCh0aGlzKTtcclxuICAgIHRoaXMuY29uZmlndXJhdGlvbigpLmxvYWRlci5SZWZyZXNoKHRoaXMuaXRlbXMoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ2xlYXIoKTogdm9pZHsgXHJcbiAgICB0aGlzLm1vZGVsID0gbnVsbDsgXHJcbiAgICB0aGlzLlVwZGF0ZSgpO1xyXG4gIH1cclxuICBcclxuICBwcm90ZWN0ZWQgQ3VycmVudExhYmVsICAgICAgOiBzdHJpbmcgID0gXCJcIjtcclxuICBwcm90ZWN0ZWQgQ3VycmVudGx5Tm9WYWx1ZSAgOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgcHVibGljIFVwZGF0ZSgpe1xyXG4gICAgdGhpcy5VcGRhdGVTZWxlY3RlZCgpO1xyXG4gICAgdGhpcy5VcGRhdGVDdXJyZW50TGFiZWwoKTsgXHJcbiAgfVxyXG4gIHByaXZhdGUgVXBkYXRlQ3VycmVudExhYmVsKCk6IHZvaWR7XHJcbiAgICBpZih0aGlzLl9tb2RlbCA9PSBudWxsKXsgXHJcbiAgICAgIHRoaXMuQ3VycmVudExhYmVsID0gdGhpcy5jb25maWd1cmF0aW9uKCkucGxhY2Vob2xkZXI7XHJcbiAgICAgIHRoaXMuQ3VycmVudGx5Tm9WYWx1ZSA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmKCF0aGlzLmNvbmZpZ3VyYXRpb24oKS5tdWx0aXBsZSl7XHJcbiAgICAgIGNvbnN0IG06IGFueSB8IG51bGwgPSB0aGlzLml0ZW1zKCkuZmluZChwID0+IHRoaXMuYmluZFZhbHVlKCkocCkgPT0gdGhpcy5fbW9kZWwpO1xyXG4gICAgICBpZihtKXsgXHJcbiAgICAgICAgdGhpcy5DdXJyZW50TGFiZWwgICAgID0gdGhpcy5iaW5kTGFiZWwoKShtKTtcclxuICAgICAgICB0aGlzLkN1cnJlbnRseU5vVmFsdWUgPSBmYWxzZTsgXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIGlmKCF0aGlzLl9tb2RlbCl7IFxyXG4gICAgICAgIHRoaXMuQ3VycmVudExhYmVsID0gdGhpcy5jb25maWd1cmF0aW9uKCkucGxhY2Vob2xkZXI7IFxyXG4gICAgICAgIHRoaXMuQ3VycmVudGx5Tm9WYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuOyBcclxuICAgICAgfWVsc2VcclxuICAgICAgaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1vZGVsKSAmJiAhdGhpcy5tb2RlbC5sZW5ndGgpeyBcclxuICAgICAgICB0aGlzLkN1cnJlbnRMYWJlbCA9IHRoaXMuY29uZmlndXJhdGlvbigpLnBsYWNlaG9sZGVyOyBcclxuICAgICAgICB0aGlzLkN1cnJlbnRseU5vVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjsgXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5DdXJyZW50TGFiZWwgICAgID0gXCJcIjsgXHJcbiAgICAgIHRoaXMuQ3VycmVudGx5Tm9WYWx1ZSA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgVXBkYXRlU2VsZWN0ZWQoKXtcclxuICAgIGlmKHRoaXMubHN0T3B0aW9ucyAmJiB0aGlzLmxzdE9wdGlvbnMubGVuZ3RoKXtcclxuICAgICAgdGhpcy5sc3RPcHRpb25zLmZvckVhY2gocCA9PiBwLmlzU2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgIHRoaXMubHN0T3B0aW9ucy5maWx0ZXIocCA9PiBBcnJheS5pc0FycmF5KHRoaXMuX21vZGVsKSA/IHRoaXMuX21vZGVsLmluY2x1ZGVzKHAudmFsdWUpIDogdGhpcy5fbW9kZWwgPT0gcC52YWx1ZSkuZm9yRWFjaChwID0+IHAuaXNTZWxlY3RlZCA9IHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgSXNTZWxlY3RlZChpdGVtOiBhbnkpe1xyXG4gICAgaWYoQXJyYXkuaXNBcnJheSh0aGlzLl9tb2RlbCkpe1xyXG4gICAgICByZXR1cm4gdGhpcy5fbW9kZWwuaW5jbHVkZXModGhpcy5iaW5kVmFsdWUoKShpdGVtKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZWwgPT0gdGhpcy5iaW5kVmFsdWUoKShpdGVtKTtcclxuICB9XHJcblxyXG4gIC8qKiBBcHBsaWVzIG9ubHkgb24gbXVsdGlwbGUgKi9cclxuICBwcm90ZWN0ZWQgR2V0U2VsZWN0ZWRJdGVucygpOiBhbnlbXXtcclxuICAgIGlmKHRoaXMuX21vZGVsICYmIHRoaXMubHN0T3B0aW9ucy5sZW5ndGgpe1xyXG4gICAgICByZXR1cm4gdGhpcy5sc3RPcHRpb25zLmZpbHRlcihwID0+IHAuaXNTZWxlY3RlZCkubWFwKHAgPT4gcC5tb2RlbCgpKTsgXHJcbiAgICB9XHJcbiAgICBpZih0aGlzLl9tb2RlbCAmJiB0aGlzLml0ZW1zKCkpe1xyXG4gICAgICByZXR1cm4gdGhpcy5pdGVtcygpLmZpbHRlcihwID0+IEFycmF5LmlzQXJyYXkodGhpcy5fbW9kZWwpID8gdGhpcy5fbW9kZWwuaW5jbHVkZXModGhpcy5iaW5kVmFsdWUoKShwKSkgOiB0aGlzLl9tb2RlbCA9PSB0aGlzLmJpbmRWYWx1ZSgpKHApKTsgXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgLy9bIE1vZGVsIF1cclxuICBvdmVycmlkZSBfbW9kZWw6IGFueSA9IG51bGw7XHJcbiAgb3ZlcnJpZGUgZ2V0IG1vZGVsKCk6IGFueSAgICAgIHsgcmV0dXJuIHRoaXMuX21vZGVsOyAgfVxyXG4gIG92ZXJyaWRlIHNldCBtb2RlbCh2YWx1ZTogYW55KSB7IFxyXG4gICAgdGhpcy5TZXRNb2RlbCh2YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLl9tb2RlbCk7IFxyXG4gIH1cclxuICBwcm90ZWN0ZWQgU2V0TW9kZWwodmFsdWU6IGFueSk6IHZvaWQgeyBcclxuICAgIGlmKHZhbHVlID09IG51bGwgKXsgdGhpcy5fbW9kZWwgPSBudWxsOyByZXR1cm47IH1cclxuXHJcbiAgICB0aGlzLl9tb2RlbCA9IHZhbHVlO1xyXG5cclxuICAgIHRoaXMuVXBkYXRlKCk7XHJcbiAgICByZXR1cm47IFxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIFNlYXJjaENoYW5nZWQoKTogdm9pZHtcclxuICAgIGlmKHRoaXMubHN0T3B0aW9ucy5sZW5ndGgpe1xyXG4gICAgICB0aGlzLnVzZURlZmF1bHRNb2RlbE9wdGlvbnMuc2V0KHRydWUpO1xyXG4gICAgICB2YXIgbHN0ID0gU2VhcmNoKHRoaXMubHN0T3B0aW9ucy5tYXAocCA9PiBwLm1vZGVsKCkpLCB0aGlzLlNlYXJjaCgpLCB0aGlzLmJpbmRMYWJlbCgpKTsgXHJcbiAgICAgIHRoaXMubHN0T3B0aW9ucy5mb3JFYWNoKHAgPT4gcC5oaWRkZW4gPSAhbHN0LmluY2x1ZGVzKHAubW9kZWwoKSkpXHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHByb3RlY3RlZCBHZXRVc2VEZWZhdWx0TW9kZWxPcHRpb25zKCk6IGJvb2xlYW57XHJcbiAgICBpZih0aGlzLmxzdE9wdGlvbnMgJiYgdGhpcy5sc3RPcHRpb25zLmxlbmd0aCl7IHJldHVybiB0cnVlOyB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgVXBkYXRlVXNlRGVmYXVsdE1vZGVsT3B0aW9ucygpOiB2b2lke1xyXG4gICAgdGhpcy51c2VEZWZhdWx0TW9kZWxPcHRpb25zLnNldCh0aGlzLkdldFVzZURlZmF1bHRNb2RlbE9wdGlvbnMoKSk7XHJcbiAgICBpZih0aGlzLnVzZURlZmF1bHRNb2RlbE9wdGlvbnMoKSl7IFxyXG4gICAgICBpZih0aGlzLml0ZW1zKCkubGVuZ3RoICE9IHRoaXMubHN0T3B0aW9ucy5sZW5ndGgpe1xyXG4gICAgICAgIHRoaXMuaXRlbXMuc2V0KHRoaXMubHN0T3B0aW9ucy5tYXAocCA9PiBwLm1vZGVsKCkpKTsgXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vWyBTZWxlY3QgXVxyXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHsgdGhpcy5TZXRNb2RlbChvYmopOyB9XHJcblxyXG4gIHB1YmxpYyBTZWxlY3QoaXRlbTogYW55KTogdm9pZHtcclxuICAgIHRoaXMuVXBkYXRlVXNlRGVmYXVsdE1vZGVsT3B0aW9ucygpO1xyXG4gICAgXHJcbiAgICBpZighdGhpcy5jb25maWd1cmF0aW9uKCkubXVsdGlwbGUpeyBcclxuICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuYmluZFZhbHVlKCkoaXRlbSk7IFxyXG4gICAgfSBcclxuICAgIGVsc2V7XHJcbiAgICAgIHZhciB2YWx1ZSA9ICB0aGlzLmJpbmRWYWx1ZSgpKGl0ZW0pO1xyXG5cclxuICAgICAgaWYodGhpcy5fbW9kZWwpe1xyXG4gICAgICAgIGlmKHRoaXMuX21vZGVsLmluY2x1ZGVzKHZhbHVlKSl7IFxyXG4gICAgICAgICAgdGhpcy5tb2RlbCA9IFsuLi50aGlzLl9tb2RlbC5maWx0ZXIocCA9PiBwICE9IHZhbHVlKV07IFxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgdGhpcy5tb2RlbCA9IFsuLi50aGlzLl9tb2RlbCwgdmFsdWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubW9kZWwgPSBbdmFsdWVdO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW50ZXJmYWNlT3B0aW9ucyA9IHsgY3NzQ2xhc3MgOiAnd2lkZXItcG9wb3ZlcicgfVxyXG5cclxuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgaW5wdXRDb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoSW9uUG9wb3ZlcikgaW9uUG9wb3ZlckNvbXBvbmVudDogSW9uUG9wb3ZlcjtcclxuICBAVmlld0NoaWxkKElvblBvcG92ZXIsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBpb25Qb3BvdmVyRWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZChJb25TZWFyY2hiYXIpIHNlYXJjaGJhckNvbXBvbmVudDogSW9uU2VhcmNoYmFyO1xyXG5cclxuICBwdWJsaWMgYXN5bmMgUHJlc2VudFBvcG92ZXIoJGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoJGV2ZW50LCAndGFyZ2V0JywgeyB3cml0YWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzLmlucHV0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgfSk7XHJcbiAgICBjb25zdCBQb3BvdmVyICAgICAgICA9IHRoaXMuaW9uUG9wb3ZlckNvbXBvbmVudDtcclxuICAgIGNvbnN0IFBvcG92ZXJFbGVtZW50ID0gdGhpcy5pb25Qb3BvdmVyRWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgXHJcbiAgICBjb25zdCBQb3BvdmVyQ29udGVudCA9IEFycmF5LmZyb20oXHJcbiAgICAgIEFycmF5LmZyb20oUG9wb3ZlckVsZW1lbnQuc2hhZG93Um9vdC5jaGlsZHJlbikuZmluZChcclxuICAgICAgICBwID0+IHAuY2xhc3NMaXN0LmNvbnRhaW5zKFwicG9wb3Zlci13cmFwcGVyXCIpXHJcbiAgICAgICkuY2hpbGRyZW5cclxuICAgICkuZmluZChcclxuICAgICAgcCA9PiBwLmNsYXNzTGlzdC5jb250YWlucyhcInBvcG92ZXItY29udGVudFwiKVxyXG4gICAgKSBhcyBIVE1MRWxlbWVudFxyXG4gICAgUG9wb3ZlckNvbnRlbnQuc3R5bGUud2lkdGggPSB0aGlzLmlucHV0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xyXG4gICAgYXdhaXQgUG9wb3Zlci5wcmVzZW50KCRldmVudCk7XHJcbiAgICB0aGlzLnNlYXJjaGJhckNvbXBvbmVudC5zZXRGb2N1cygpO1xyXG5cclxuICAgIGlmKHRoaXMuY2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KXtcclxuICAgICAgdGhpcy5jZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQubmF0aXZlRWxlbWVudC5zY3JvbGwoeyB0b3A6IDEsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZvY3VzZWRNb2RlbCA9IG51bGw7XHJcbiAgICB0aGlzLlVwZGF0ZVVzZURlZmF1bHRNb2RlbE9wdGlvbnMoKTtcclxuICB9O1xyXG5cclxuICBwcm90ZWN0ZWQgU2VhcmNoICAgICAgICA6IE1vZGVsU2lnbmFsPHN0cmluZz4gPSBtb2RlbDxzdHJpbmc+KFwiXCIpO1xyXG4gIHByb3RlY3RlZCBsc3RTZWFyY2hJdGVuczogU2lnbmFsPGFueVtdPiAgICAgICA9IGNvbXB1dGVkPGFueVtdPigoKSA9PiB7IHJldHVybiBTZWFyY2godGhpcy5pdGVtcygpLCB0aGlzLlNlYXJjaCgpLCB0aGlzLmJpbmRMYWJlbCgpKTsgfSlcclxuXHJcbiAgLy8jcmVnaW9uIFsgQXJyb3cvVGFiIENvbnRyb2wgXVxyXG4gIEBWaWV3Q2hpbGQoSW9uSW5wdXQpIGlucHV0Q29tcG9uZW50OiBJb25JbnB1dDtcclxuICBAVmlld0NoaWxkKElvbkl0ZW0sIHsgcmVhZDogRWxlbWVudFJlZiB9KSAgaXRlbUNvbXBvbmVudCA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIGFzeW5jIEhhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmKCF0aGlzLmlucHV0Q29tcG9uZW50IHx8ICF0aGlzLnNlYXJjaGJhckNvbXBvbmVudCl7IHJldHVybjsgfVxyXG4gICAgXHJcbiAgICBjb25zdCBpbnB1dENvbXBvbmVudCAgICAgPSBhd2FpdCB0aGlzLmlucHV0Q29tcG9uZW50LmdldElucHV0RWxlbWVudCgpO1xyXG4gICAgY29uc3Qgc2VhcmNoYmFyQ29tcG9uZW50ID0gYXdhaXQgdGhpcy5zZWFyY2hiYXJDb21wb25lbnQuZ2V0SW5wdXRFbGVtZW50KCk7XHJcbiAgICBcclxuICAgIGlmKGV2ZW50LnRhcmdldCA9PSBpbnB1dENvbXBvbmVudCAmJiBldmVudC5rZXkgPT0gXCJBcnJvd0Rvd25cIiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24oKS5zZWFyY2hlYWJsZSl7XHJcbiAgICAgIHRoaXMuaXRlbUNvbXBvbmVudC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9ZWxzZVxyXG4gICAgaWYoZXZlbnQudGFyZ2V0ID09IHNlYXJjaGJhckNvbXBvbmVudCl7XHJcbiAgICAgIHRoaXMuVXBkYXRlVXNlRGVmYXVsdE1vZGVsT3B0aW9ucygpO1xyXG5cclxuICAgICAgY29uc3QgaXRlbXMgID0gdGhpcy5sc3RTZWFyY2hJdGVucygpO1xyXG4gICAgICBpZihldmVudC5rZXkgPT0gXCJBcnJvd0Rvd25cIil7XHJcbiAgICAgICAgaWYodGhpcy5mb2N1c2VkTW9kZWwpe1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5pbmRleE9mKHRoaXMuZm9jdXNlZE1vZGVsKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYoaXRlbXNbaW5kZXggKyAxXSl7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0Rm9jdXNlZEVsZW1lbnQoaXRlbXNbaW5kZXggKyAxXSk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5TZXRGb2N1c2VkRWxlbWVudChpdGVtc1swXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBpZihpdGVtc1swXSl7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0Rm9jdXNlZEVsZW1lbnQoaXRlbXNbMF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2VcclxuICAgICAgaWYoZXZlbnQua2V5ID09IFwiQXJyb3dVcFwiKXtcclxuICAgICAgICBpZih0aGlzLmZvY3VzZWRNb2RlbCl7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmluZGV4T2YodGhpcy5mb2N1c2VkTW9kZWwpO1xyXG5cclxuICAgICAgICAgIGlmKGl0ZW1zW2luZGV4IC0gMV0pe1xyXG4gICAgICAgICAgICB0aGlzLlNldEZvY3VzZWRFbGVtZW50KGl0ZW1zW2luZGV4IC0gMV0pO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0Rm9jdXNlZEVsZW1lbnQoaXRlbXNbaXRlbXMubGVuZ3RoIC0xXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZVxyXG4gICAgICBpZihldmVudC5rZXkgPT0gXCJFbnRlclwiKXtcclxuICAgICAgICB2YXIgT3B0aW9uOiBJU2VsZWN0T3B0aW9uO1xyXG4gICAgICAgIGlmKHRoaXMudXNlRGVmYXVsdE1vZGVsT3B0aW9ucygpKXtcclxuICAgICAgICAgIE9wdGlvbiA9IHRoaXMubHN0T3B0aW9ucy5maW5kKHAgPT4gcC5tb2RlbCgpID09IHRoaXMuZm9jdXNlZE1vZGVsKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIE9wdGlvbiA9IHRoaXMubHN0SW50ZXJuYWxPcHRpb25zLmZpbmQocCA9PiBwLm1vZGVsID09IHRoaXMuZm9jdXNlZE1vZGVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIU9wdGlvbi5kaXNhYmxlZCl7XHJcbiAgICAgICAgICB0aGlzLlNlbGVjdCh0aGlzLmZvY3VzZWRNb2RlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFNldEZvY3VzZWRFbGVtZW50KGZvY3VzZWRNb2RlbDogYW55LCBzY3JvbGw6IGJvb2xlYW4gPSB0cnVlLCk6IHZvaWR7XHJcbiAgICB0aGlzLmZvY3VzZWRNb2RlbCA9IGZvY3VzZWRNb2RlbDtcclxuICAgIFxyXG4gICAgdmFyIE9wdGlvbjogSVNlbGVjdE9wdGlvbjtcclxuICAgIGlmKHRoaXMudXNlRGVmYXVsdE1vZGVsT3B0aW9ucygpKXtcclxuICAgICAgT3B0aW9uID0gdGhpcy5sc3RPcHRpb25zLmZpbmQocCA9PiBwLm1vZGVsKCkgPT0gZm9jdXNlZE1vZGVsKTtcclxuICAgICAgdGhpcy5sc3RPcHRpb25zLmZpbHRlcihwID0+IHAub25Gb2N1cykuZm9yRWFjaChwID0+IHAub25Gb2N1cyA9IGZhbHNlKTtcclxuICAgICAgT3B0aW9uLm9uRm9jdXMgPSB0cnVlO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIE9wdGlvbiA9IHRoaXMubHN0SW50ZXJuYWxPcHRpb25zLmZpbmQocCA9PiBwLm1vZGVsID09IGZvY3VzZWRNb2RlbCk7XHJcbiAgICAgIHRoaXMubHN0SW50ZXJuYWxPcHRpb25zLmZpbHRlcihwID0+IHAub25Gb2N1cykuZm9yRWFjaChwID0+IHAub25Gb2N1cyA9IGZhbHNlKTtcclxuICAgICAgT3B0aW9uLm9uRm9jdXMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZihzY3JvbGwpeyBPcHRpb24uR2V0TmF0aXZlRWxlbWVudCgpLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOyB9XHJcbiAgfVxyXG5cclxuICBmb2N1c2VkTW9kZWw6IGFueSB8IG51bGw7XHJcbiAgLy8jZW5kcmVnaW9uIFsgQXJyb3cvVGFiIENvbnRyb2wgXVxyXG59IiwiPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggb3ZlcmZsb3ctaGlkZGVuXCIgI2NvbnRhaW5lcj5cclxuICA8aW9uLWNhcmQgXHJcbiAgICAgIGNsYXNzPVwiZm9jdXMtd2l0aGluOm9uLWZvY3VzIGlvbi1jYXJkLWlucHV0XCIgXHJcbiAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8IGxvYWRpbmdGcm9tTG9hZGVyIHx8IGRpc2FibGVkXCIgXHJcbiAgICAgIFtjbGFzcy5pbnZhbGlkXT1cImludmFsaWRcIlxyXG4gICAgICBbY2xhc3Muc3VibWl0dGVkXT1cInN1Ym1pdHRlZFwiXHJcbiAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnIXJvdW5kZWQtbC0yeGwgIXJvdW5kZWQtci1ub25lICFib3JkZXItci0wJzogY29uZmlndXJhdGlvbigpLmNsZWFyYWJsZX1cIlxyXG4gICAgPlxyXG4gICAgPGlvbi1jYXJkLWNvbnRlbnQ+XHJcbiAgICAgIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIiBjbGFzcz1cInJvdW5kZWQtMnhsIHctZnVsbCByZWxhdGl2ZVwiIChjbGljayk9XCJQcmVzZW50UG9wb3ZlcigkZXZlbnQpXCIgW25nQ2xhc3NdPVwieychcm91bmRlZC1sLTJ4bCAhcm91bmRlZC1yLW5vbmUnOiBjb25maWd1cmF0aW9uKCkuY2xlYXJhYmxlIH1cIj5cclxuICAgICAgICA8aW9uLWlucHV0IGZpbGw9XCJub25lXCIgW3JlYWRvbmx5XT1cInRydWVcIiBsYWJlbFBsYWNlbWVudD1cInN0YWNrZWRcIiBbdmFsdWVdPVwiQ3VycmVudExhYmVsXCIgW2NsYXNzLm5vLWl0ZW1zLW9wYWNpdHldPVwiQ3VycmVudGx5Tm9WYWx1ZVwiPlxyXG4gICAgICAgICAgPGlvbi10ZXh0IGlkPVwibGFiZWxcIiBbbmdDbGFzc109XCJ7J3JlcXVpcmVkJzogcmVxdWlyZWQoKSB9XCIgc2xvdD1cImxhYmVsXCIgY2xhc3M9XCIhdGV4dC1kYXJrXCI+IFxyXG4gICAgICAgICAgICB7e2xhYmVsfX0gXHJcbiAgICAgICAgICA8L2lvbi10ZXh0PlxyXG4gICAgICAgIDwvaW9uLWlucHV0PlxyXG4gICAgICAgIEBpZihjb25maWd1cmF0aW9uKCkubXVsdGlwbGUpe1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGxlZnQtMCBib3R0b20tMCBoLTYgdy1mdWxsIGZsZXggei1bOTBdIG92ZXJmbG93LXgtYXV0b1wiPlxyXG4gICAgICAgICAgICBAZm9yKGl0ZW0gb2YgR2V0U2VsZWN0ZWRJdGVucygpOyB0cmFjayAkaW5kZXgpe1xyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgZmxleCBiZy1tZWRpdW0vMTAgYm9yZGVyIHRyYW5zbHVjaWQtYm9yZGVyIHJvdW5kZWQtbGcgbXItMSBhbmltYXRlZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiU2VsZWN0KGl0ZW0pOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiBjbGFzcz1cImJnLW1lZGl1bS8xMCBjdXJzb3ItcG9pbnRlciB0cmFuc2x1Y2lkLWJvcmRlciBtaW4tdy1taW4gIWJvcmRlci1sLTAgIWJvcmRlci15LTAgaC1mdWxsIGFzcGVjdC1zcXVhcmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1yLWxnXCI+IFxyXG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIG5hbWU9XCJjbG9zZVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgcHgtMSBzZWxlY3Qtbm9uZVwiPiB7e2JpbmRMYWJlbCgpKGl0ZW0pfX0gPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgPC9pb24taXRlbT5cclxuICAgICAgXHJcbiAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XHJcbiAgPC9pb24tY2FyZD5cclxuICA8aW5wdXQtbG9hZGluZyBbbG9hZGluZ109XCJsb2FkaW5nIHx8IGxvYWRpbmdGcm9tTG9hZGVyXCI+PC9pbnB1dC1sb2FkaW5nPlxyXG4gIEBpZihjb25maWd1cmF0aW9uKCkuY2xlYXJhYmxlKXtcclxuICAgIDxkaXYgY2xhc3M9XCJ3LTEyXCI+XHJcbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJDbGVhcigpXCIgW2Rpc2FibGVkXT1cImxvYWRpbmcgfHwgZGlzYWJsZWQgfHwgbG9hZGluZ0Zyb21Mb2FkZXJcIiBzaXplPVwic21hbGxcIiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwibWVkaXVtXCIgY2xhc3M9XCJyb3VuZGVkLXItMnhsIGgtZnVsbCB3LWZ1bGxcIiBzdHlsZT1cIi0tYm9yZGVyLXdpZHRoOiAxcHggMXB4IDJweCAxcHg7XCI+XHJcbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJiYWNrc3BhY2VcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cclxuICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxuXHJcbjxpb24tcG9wb3ZlciBjbGFzcz1cImlucHV0LXNlbGVjdC1wb3BvdmVyXCIgW2tlZXBDb250ZW50c01vdW50ZWRdPVwiZmFsc2VcIiBbZGlzbWlzc09uU2VsZWN0XT1cIiFjb25maWd1cmF0aW9uKCkubXVsdGlwbGVcIiAoZGlkRGlzbWlzcyk9XCJTZWFyY2guc2V0KCcnKVwiPlxyXG4gIDxuZy10ZW1wbGF0ZT5cclxuICAgIDxkaXYgY2xhc3M9XCJzaXplLWZ1bGwgZmxleCBmbGV4LWNvbCBiZy1wcmltYXJ5LzEwXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgc2hyaW5rLTBcIiBbaGlkZGVuXT1cIiFjb25maWd1cmF0aW9uKCkuc2VhcmNoZWFibGVcIj5cclxuICAgICAgICA8aW9uLXNlYXJjaGJhciBbKG5nTW9kZWwpXT1cIlNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIlNlYXJjaENoYW5nZWQoKVwiIHBsYWNlaG9sZGVyPVwiUGVzcXVpc2EuLi5cIiBjbGFzcz1cInNpemUtZnVsbCBiZy10cmFuc3BhcmVudFwiIFtkZWJvdW5jZV09XCIxMDBcIj48L2lvbi1zZWFyY2hiYXI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImgtNDggdy1mdWxsIG92ZXJmbG93LWhpZGRlbiB0cmFuc2x1Y2lkLWJvcmRlciAhYm9yZGVyLXgtMCAhYm9yZGVyLWItMCByb3VuZGVkLXQtMnhsIGJnLWxpZ2h0XCIgW25nQ2xhc3NdPVwieychYm9yZGVyLTAnOiAhY29uZmlndXJhdGlvbigpLnNlYXJjaGVhYmxlfVwiPlxyXG4gICAgICAgIEBpZighbHN0T3B0aW9ucyB8fCAhbHN0T3B0aW9ucy5sZW5ndGgpe1xyXG4gICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCBpdGVtU2l6ZT1cIjQ1XCIgW21pbkJ1ZmZlclB4XT1cIjIwMFwiIFttYXhCdWZmZXJQeF09XCIzMDBcIiBjbGFzcz1cInNpemUtZnVsbFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQtc2VsZWN0LWludGVybmFsLW9wdGlvbiBbbW9kZWxdPVwiaXRlbVwiICpjZGtWaXJ0dWFsRm9yPVwibGV0IGl0ZW0gb2YgbHN0U2VhcmNoSXRlbnMoKVwiIFtpc1NlbGVjdGVkXT1cIklzU2VsZWN0ZWQoaXRlbSlcIj5cclxuICAgICAgICAgICAgICA8aW9uLWxhYmVsIGNsYXNzPVwidHJ1bmNhdGVcIj57e2JpbmRMYWJlbCgpKGl0ZW0pfX08L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgPC9pbnB1dC1zZWxlY3QtaW50ZXJuYWwtb3B0aW9uPlxyXG4gICAgICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBlbHNlIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXplLWZ1bGwgb3ZlcmZsb3cteS1hdXRvIG92ZXJmbG93LXgtaGlkZGVuIG1hc2steVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJpbnB1dC1zZWxlY3Qtb3B0aW9uXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvaW9uLXBvcG92ZXI+Il19
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { firstValueFrom } from "rxjs";
|
|
2
|
+
import { HttpService } from "../../../services/web/http.service";
|
|
3
|
+
import { HttpServiceAtivo } from "../../../services/web/http.ativo.service";
|
|
4
|
+
import { ViewFiltros } from "../../../classes/filters/view-filtros";
|
|
5
|
+
import { INT_MAX } from "../../../services/utils.service";
|
|
6
|
+
export class InputSelectConfiguration {
|
|
7
|
+
constructor(
|
|
8
|
+
/** Valor que será setado no formControl */
|
|
9
|
+
bindValue = "id",
|
|
10
|
+
/** Valor que será exibido */
|
|
11
|
+
bindLabel = "nome",
|
|
12
|
+
/** Indica se o select pode ser nulo e limpavel */
|
|
13
|
+
clearable = true,
|
|
14
|
+
/** Indica se o select pode ser pesquisado */
|
|
15
|
+
searcheable = true,
|
|
16
|
+
/**
|
|
17
|
+
* Se LoadFrom instanceof HttpService -> Os dados serão carregados do List()
|
|
18
|
+
* Se LoadFrom instanceof HttpServiceAtivo -> Os dados serão carregados do ListAtivo()
|
|
19
|
+
* Se LoadFrom instanceof Observable -> Os dados serão carregados da função indicada
|
|
20
|
+
* Se LoadFrom instanceof Array -> Os dados serão o array
|
|
21
|
+
*/
|
|
22
|
+
loadFrom,
|
|
23
|
+
/** Se = true Os valores no form control seráo um array dos items selecionados */
|
|
24
|
+
multiple = false,
|
|
25
|
+
/** Aplica os filtros na pesquisa */
|
|
26
|
+
vFiltros = null,
|
|
27
|
+
/** Desativa os items que estão de acordo com a função */
|
|
28
|
+
disableConditional = null) {
|
|
29
|
+
this.bindValue = bindValue;
|
|
30
|
+
this.bindLabel = bindLabel;
|
|
31
|
+
this.clearable = clearable;
|
|
32
|
+
this.searcheable = searcheable;
|
|
33
|
+
this.loadFrom = loadFrom;
|
|
34
|
+
this.multiple = multiple;
|
|
35
|
+
this.disableConditional = disableConditional;
|
|
36
|
+
this.placeholder = "Selecione um item...";
|
|
37
|
+
this.noItensFoundText = "Sem items encontrados...";
|
|
38
|
+
this.vFiltros = null;
|
|
39
|
+
this.clearable = clearable;
|
|
40
|
+
this.searcheable = searcheable;
|
|
41
|
+
this.multiple = multiple;
|
|
42
|
+
if (vFiltros != null) {
|
|
43
|
+
const v = vFiltros;
|
|
44
|
+
if (v.ascending == null || v.ascending == undefined) {
|
|
45
|
+
v.ascending = true;
|
|
46
|
+
}
|
|
47
|
+
this.vFiltros = new ViewFiltros(INT_MAX, v.search, 1, v.orderByProperty, v.ascending);
|
|
48
|
+
this.vFiltros.filter = v.filter;
|
|
49
|
+
}
|
|
50
|
+
if (loadFrom) {
|
|
51
|
+
if (Array.isArray(loadFrom)) {
|
|
52
|
+
this.loadFromArray = loadFrom;
|
|
53
|
+
}
|
|
54
|
+
else if (loadFrom instanceof HttpService || loadFrom instanceof HttpServiceAtivo) {
|
|
55
|
+
this.loadFromService = loadFrom;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
this.loadFromFunction = loadFrom;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
this.loader = new InputSelectDataLoader(this);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class InputSelectDataLoader {
|
|
65
|
+
constructor(configuration) {
|
|
66
|
+
this.lstComponents = [];
|
|
67
|
+
/** Valor que será setado no formControl */
|
|
68
|
+
this.bindValue = null;
|
|
69
|
+
/** Valor que será exibido */
|
|
70
|
+
this.bindLabel = null;
|
|
71
|
+
this._isLoaded = false;
|
|
72
|
+
this.items = [];
|
|
73
|
+
this.configuration = configuration;
|
|
74
|
+
this.bindValue = BindValueFactory(configuration);
|
|
75
|
+
this.bindLabel = BindLabelFactory(configuration);
|
|
76
|
+
}
|
|
77
|
+
GetLabel(value) {
|
|
78
|
+
if (!this.items || !this.bindValue || !this.bindLabel) {
|
|
79
|
+
return "";
|
|
80
|
+
}
|
|
81
|
+
const item = this.items.find(p => this.bindValue(p) == value);
|
|
82
|
+
if (!item) {
|
|
83
|
+
return "";
|
|
84
|
+
}
|
|
85
|
+
return this.bindLabel(item);
|
|
86
|
+
}
|
|
87
|
+
AddComponent(component) {
|
|
88
|
+
this.lstComponents.push(component);
|
|
89
|
+
}
|
|
90
|
+
async Refresh(items) {
|
|
91
|
+
this.lstComponents.forEach(component => { component.loadingFromLoader = true; });
|
|
92
|
+
if (!this.configuration.loadFromService && !this.configuration.loadFromFunction && (!this.configuration.loadFromArray || !(this.configuration.loadFromArray.length > 0))) {
|
|
93
|
+
this.items = items;
|
|
94
|
+
this._isLoaded = true;
|
|
95
|
+
this.lstComponents.forEach(component => { component.items.set(this.items); });
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
await this.Load();
|
|
99
|
+
this._isLoaded = true;
|
|
100
|
+
this.lstComponents.forEach(component => { component.items.set(this.items); });
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
this.lstComponents.forEach(component => { component.loadingFromLoader = false; });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
SetLstComponentsThisItens() {
|
|
107
|
+
this.lstComponents.forEach(component => { component.items.set(this.items); return; });
|
|
108
|
+
}
|
|
109
|
+
async Load() {
|
|
110
|
+
if (this._isLoaded) {
|
|
111
|
+
this.SetLstComponentsThisItens();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
//[ Load from Array ]
|
|
115
|
+
if (this.configuration.loadFromArray != undefined && this.configuration.loadFromArray.length) {
|
|
116
|
+
this.items = this.configuration.loadFromArray;
|
|
117
|
+
this.SetLstComponentsThisItens();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
//[ Load from api ]
|
|
121
|
+
var vFiltros = this.configuration.vFiltros;
|
|
122
|
+
try {
|
|
123
|
+
var lstDados = [];
|
|
124
|
+
if (this.configuration.loadFromService) {
|
|
125
|
+
lstDados = (await firstValueFrom(this.configuration.loadFromService.List(vFiltros))).lstDados;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
lstDados = (await firstValueFrom(this.configuration.loadFromFunction)).lstDados;
|
|
129
|
+
}
|
|
130
|
+
this.items = lstDados;
|
|
131
|
+
this.SetLstComponentsThisItens();
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export function BindValueFactory(configuration) {
|
|
139
|
+
const cBindValue = configuration.bindValue;
|
|
140
|
+
var bindValue = null;
|
|
141
|
+
if (typeof (cBindValue) == 'string') {
|
|
142
|
+
var bvS = cBindValue;
|
|
143
|
+
bindValue = ((obj) => { return obj[bvS]; });
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
var bvF = cBindValue;
|
|
147
|
+
bindValue = ((obj) => { return bvF(obj); });
|
|
148
|
+
}
|
|
149
|
+
return bindValue;
|
|
150
|
+
}
|
|
151
|
+
export function BindLabelFactory(configuration) {
|
|
152
|
+
const cBindLabel = configuration.bindLabel;
|
|
153
|
+
var bindLabel = null;
|
|
154
|
+
if (typeof (cBindLabel) == 'string') {
|
|
155
|
+
var blS = cBindLabel;
|
|
156
|
+
bindLabel = ((obj) => { return obj[blS] + ''; });
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
var blF = cBindLabel;
|
|
160
|
+
bindLabel = ((obj) => { return blF(obj) + ''; });
|
|
161
|
+
}
|
|
162
|
+
return bindLabel;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuc2VsZWN0LmNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zYXBwaGlyZS1pb24tZnJhbWV3b3JrL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dHMvaW5wdXQtc2VsZWN0L2lucHV0LnNlbGVjdC5jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEQsT0FBTyxFQUFFLFdBQVcsRUFBZSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFNMUQsTUFBTSxPQUFPLHdCQUF3QjtJQVduQztJQUNFLDJDQUEyQztJQUNwQyxZQUE4QyxJQUFJO0lBQ3pELDZCQUE2QjtJQUN0QixZQUE4QyxNQUFNO0lBRTNELGtEQUFrRDtJQUMzQyxZQUF1QixJQUFJO0lBQ2xDLDZDQUE2QztJQUN0QyxjQUF1QixJQUFJO0lBRWxDOzs7OztPQUtHO0lBQ0ksUUFBNEU7SUFDbkYsaUZBQWlGO0lBQzFFLFdBQXFCLEtBQUs7SUFDakMsb0NBQW9DO0lBQ3BDLFdBU1ksSUFBSTtJQUNoQix5REFBeUQ7SUFDbEQscUJBQXFELElBQUk7UUE5QnpELGNBQVMsR0FBVCxTQUFTLENBQXlDO1FBRWxELGNBQVMsR0FBVCxTQUFTLENBQTJDO1FBR3BELGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBRTNCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQVEzQixhQUFRLEdBQVIsUUFBUSxDQUFvRTtRQUU1RSxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQWExQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXVD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QUF5QixVQUFVLENBQUM7UUFDM0MsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQVUsRUFBRSxHQUFHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuaW1wb3J0IHsgSHR0cFNlcnZpY2UsIFZpZXdSZXRvcm5vIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3dlYi9odHRwLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2VBdGl2byB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy93ZWIvaHR0cC5hdGl2by5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFZpZXdGaWx0cm9zIH0gZnJvbSBcIi4uLy4uLy4uL2NsYXNzZXMvZmlsdGVycy92aWV3LWZpbHRyb3NcIjtcclxuaW1wb3J0IHsgSU5UX01BWCB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy91dGlscy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IElTZWxlY3QgfSBmcm9tIFwiLi9JU2VsZWN0XCI7XHJcbmltcG9ydCB7IENvbXBhcmlzb24gfSBmcm9tIFwiLi4vLi4vLi4vY2xhc3Nlcy9jb21wYXJpc29uL2NvbXBhcmlzb25cIjtcclxuXHJcbmV4cG9ydCB0eXBlIERlZmF1bHRNb2RlbE9wdGlvbnMgPSB7IHZhbHVlOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcgfTtcclxuXHJcbmV4cG9ydCBjbGFzcyBJbnB1dFNlbGVjdENvbmZpZ3VyYXRpb257XHJcbiAgcGxhY2Vob2xkZXIgICAgIDogc3RyaW5nID0gXCJTZWxlY2lvbmUgdW0gaXRlbS4uLlwiXHJcbiAgbm9JdGVuc0ZvdW5kVGV4dDogc3RyaW5nID0gXCJTZW0gaXRlbXMgZW5jb250cmFkb3MuLi5cIlxyXG5cclxuICBsb2FkZXI6IElucHV0U2VsZWN0RGF0YUxvYWRlcjtcclxuICBsb2FkRnJvbUFycmF5ICAgOiBhbnlbXTtcclxuICBsb2FkRnJvbVNlcnZpY2UgOiBIdHRwU2VydmljZSB8IEh0dHBTZXJ2aWNlQXRpdm9cclxuICBsb2FkRnJvbUZ1bmN0aW9uOiBPYnNlcnZhYmxlPGFueT5cclxuXHJcbiAgcHVibGljIHZGaWx0cm9zOiBWaWV3RmlsdHJvcyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8qKiBWYWxvciBxdWUgc2Vyw6Egc2V0YWRvIG5vIGZvcm1Db250cm9sICovXHJcbiAgICBwdWJsaWMgYmluZFZhbHVlOiBzdHJpbmcgfCAoKG9iajogYW55KSA9PiBhbnkpICAgICA9IFwiaWRcIiAgLFxyXG4gICAgLyoqIFZhbG9yIHF1ZSBzZXLDoSBleGliaWRvICovXHJcbiAgICBwdWJsaWMgYmluZExhYmVsOiBzdHJpbmcgfCAoKG9iajogYW55KSA9PiBzdHJpbmcpICA9IFwibm9tZVwiLCBcclxuICAgIFxyXG4gICAgLyoqIEluZGljYSBzZSBvIHNlbGVjdCBwb2RlIHNlciBudWxvIGUgbGltcGF2ZWwgKi9cclxuICAgIHB1YmxpYyBjbGVhcmFibGUgIDogYm9vbGVhbiA9IHRydWUsIFxyXG4gICAgLyoqIEluZGljYSBzZSBvIHNlbGVjdCBwb2RlIHNlciBwZXNxdWlzYWRvICovXHJcbiAgICBwdWJsaWMgc2VhcmNoZWFibGU6IGJvb2xlYW4gPSB0cnVlLCBcclxuICAgIFxyXG4gICAgLyoqIFxyXG4gICAgICogU2UgTG9hZEZyb20gaW5zdGFuY2VvZiBIdHRwU2VydmljZSAgICAgIC0+IE9zIGRhZG9zIHNlcsOjbyBjYXJyZWdhZG9zIGRvIExpc3QoKVxyXG4gICAgICogU2UgTG9hZEZyb20gaW5zdGFuY2VvZiBIdHRwU2VydmljZUF0aXZvIC0+IE9zIGRhZG9zIHNlcsOjbyBjYXJyZWdhZG9zIGRvIExpc3RBdGl2bygpXHJcbiAgICAgKiBTZSBMb2FkRnJvbSBpbnN0YW5jZW9mIE9ic2VydmFibGUgICAgICAgLT4gT3MgZGFkb3Mgc2Vyw6NvIGNhcnJlZ2Fkb3MgZGEgZnVuw6fDo28gaW5kaWNhZGFcclxuICAgICAqIFNlIExvYWRGcm9tIGluc3RhbmNlb2YgQXJyYXkgICAgICAgICAgICAtPiBPcyBkYWRvcyBzZXLDo28gbyBhcnJheVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbG9hZEZyb20/OiAgSHR0cFNlcnZpY2UgfCBIdHRwU2VydmljZUF0aXZvIHwgT2JzZXJ2YWJsZTxWaWV3UmV0b3Jubz4gfCBhbnlbXSwgXHJcbiAgICAvKiogU2UgPSB0cnVlIE9zIHZhbG9yZXMgbm8gZm9ybSBjb250cm9sIHNlcsOhbyB1bSBhcnJheSBkb3MgaXRlbXMgc2VsZWNpb25hZG9zICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbGUgOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAvKiogQXBsaWNhIG9zIGZpbHRyb3MgbmEgcGVzcXVpc2EgKi9cclxuICAgIHZGaWx0cm9zIDogUGFydGlhbDx7IFxyXG4gICAgICAvKiogQXBsaWNhIHVtYSBwZXNxdWlzYSBlbSB0ZXh0byAgKi9cclxuICAgICAgc2VhcmNoOiBzdHJpbmdcclxuICAgICAgLyoqIFByb3ByaWVkYWRlIGRlIG9yZGVuYcOnw6NvICovXHJcbiAgICAgIG9yZGVyQnlQcm9wZXJ0eTogc3RyaW5nXHJcbiAgICAgIC8qKiBPcmllbnRhw6fDo28gZGUgb3JkZW5hw6fDo28gKi9cclxuICAgICAgYXNjZW5kaW5nOiBib29sZWFuLFxyXG4gICAgICAvKiogRmlsdHJvICAqL1xyXG4gICAgICBmaWx0ZXI6IENvbXBhcmlzb25bXVxyXG4gICAgfT4gfCBudWxsID0gbnVsbCxcclxuICAgIC8qKiBEZXNhdGl2YSBvcyBpdGVtcyBxdWUgZXN0w6NvIGRlIGFjb3JkbyBjb20gYSBmdW7Dp8OjbyAqL1xyXG4gICAgcHVibGljIGRpc2FibGVDb25kaXRpb25hbDogKChvYmo6IGFueSkgPT4gYm9vbGVhbikgfCBudWxsID0gbnVsbFxyXG4gICl7XHJcbiAgICB0aGlzLmNsZWFyYWJsZSAgID0gY2xlYXJhYmxlO1xyXG4gICAgdGhpcy5zZWFyY2hlYWJsZSA9IHNlYXJjaGVhYmxlO1xyXG4gICAgdGhpcy5tdWx0aXBsZSAgICA9IG11bHRpcGxlO1xyXG5cclxuICAgIGlmKHZGaWx0cm9zICE9IG51bGwpe1xyXG4gICAgICBjb25zdCB2ID0gdkZpbHRyb3M7XHJcbiAgICAgIGlmKHYuYXNjZW5kaW5nID09IG51bGwgfHwgdi5hc2NlbmRpbmcgPT0gdW5kZWZpbmVkKXsgdi5hc2NlbmRpbmcgPSB0cnVlOyB9XHJcbiAgICAgIHRoaXMudkZpbHRyb3MgPSBuZXcgVmlld0ZpbHRyb3MoSU5UX01BWCwgdi5zZWFyY2gsIDEsIHYub3JkZXJCeVByb3BlcnR5LCB2LmFzY2VuZGluZyk7XHJcbiAgICAgICh0aGlzLnZGaWx0cm9zIGFzIFZpZXdGaWx0cm9zKS5maWx0ZXIgPSB2LmZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBpZihsb2FkRnJvbSl7XHJcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkobG9hZEZyb20pKXsgXHJcbiAgICAgICAgdGhpcy5sb2FkRnJvbUFycmF5ICAgID0gbG9hZEZyb207IFxyXG4gICAgICB9IGVsc2VcclxuICAgICAgaWYobG9hZEZyb20gaW5zdGFuY2VvZiBIdHRwU2VydmljZSB8fCBsb2FkRnJvbSBpbnN0YW5jZW9mIEh0dHBTZXJ2aWNlQXRpdm8peyBcclxuICAgICAgICB0aGlzLmxvYWRGcm9tU2VydmljZSAgPSBsb2FkRnJvbTtcclxuICAgICAgfSBlbHNlIHsgIFxyXG4gICAgICAgIHRoaXMubG9hZEZyb21GdW5jdGlvbiA9IGxvYWRGcm9tO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmxvYWRlciA9IG5ldyBJbnB1dFNlbGVjdERhdGFMb2FkZXIodGhpcyk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5wdXRTZWxlY3REYXRhTG9hZGVye1xyXG4gIGxzdENvbXBvbmVudHM6IElTZWxlY3RbXSA9IFtdO1xyXG4gIGNvbmZpZ3VyYXRpb246IElucHV0U2VsZWN0Q29uZmlndXJhdGlvbjtcclxuXHJcbiAgLyoqIFZhbG9yIHF1ZSBzZXLDoSBzZXRhZG8gbm8gZm9ybUNvbnRyb2wgKi9cclxuICBwdWJsaWMgYmluZFZhbHVlOiAoKG9iajogYW55KSA9PiBhbnkpICAgfCBudWxsID0gbnVsbDtcclxuICAvKiogVmFsb3IgcXVlIHNlcsOhIGV4aWJpZG8gKi9cclxuICBwdWJsaWMgYmluZExhYmVsOiAoKG9iajogYW55KSA9PiBzdHJpbmcpfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbjogSW5wdXRTZWxlY3RDb25maWd1cmF0aW9uKXsgXHJcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOyBcclxuICAgIHRoaXMuYmluZFZhbHVlID0gQmluZFZhbHVlRmFjdG9yeShjb25maWd1cmF0aW9uKVxyXG4gICAgdGhpcy5iaW5kTGFiZWwgPSBCaW5kTGFiZWxGYWN0b3J5KGNvbmZpZ3VyYXRpb24pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0TGFiZWwodmFsdWU6IGFueSl7XHJcbiAgICBpZighdGhpcy5pdGVtcyB8fCAhdGhpcy5iaW5kVmFsdWUgfHwgIXRoaXMuYmluZExhYmVsKXsgcmV0dXJuIFwiXCI7IH1cclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQocCA9PiB0aGlzLmJpbmRWYWx1ZShwKSA9PSB2YWx1ZSk7XHJcbiAgICBpZighaXRlbSl7IHJldHVybiBcIlwiIDt9XHJcbiAgICByZXR1cm4gdGhpcy5iaW5kTGFiZWwoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBBZGRDb21wb25lbnQoY29tcG9uZW50OiBJU2VsZWN0KXsgXHJcbiAgICB0aGlzLmxzdENvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgYXN5bmMgUmVmcmVzaChpdGVtcz86IGFueVtdKTogUHJvbWlzZTx2b2lkPntcclxuICAgIHRoaXMubHN0Q29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7IGNvbXBvbmVudC5sb2FkaW5nRnJvbUxvYWRlciA9IHRydWU7IH0pO1xyXG4gICAgXHJcbiAgICBpZighdGhpcy5jb25maWd1cmF0aW9uLmxvYWRGcm9tU2VydmljZSAmJiAhdGhpcy5jb25maWd1cmF0aW9uLmxvYWRGcm9tRnVuY3Rpb24gJiYgKCF0aGlzLmNvbmZpZ3VyYXRpb24ubG9hZEZyb21BcnJheSB8fCAhKHRoaXMuY29uZmlndXJhdGlvbi5sb2FkRnJvbUFycmF5Lmxlbmd0aCA+IDApKSl7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSBpdGVtcztcclxuICAgICAgdGhpcy5faXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmxzdENvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4geyBjb21wb25lbnQuaXRlbXMuc2V0KHRoaXMuaXRlbXMpOyB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdHJ5e1xyXG4gICAgICBhd2FpdCB0aGlzLkxvYWQoKTtcclxuICAgICAgdGhpcy5faXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmxzdENvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4geyBjb21wb25lbnQuaXRlbXMuc2V0KHRoaXMuaXRlbXMpOyB9KTtcclxuICAgIH1cclxuICAgIGZpbmFsbHl7XHJcbiAgICAgIHRoaXMubHN0Q29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7IGNvbXBvbmVudC5sb2FkaW5nRnJvbUxvYWRlciA9IGZhbHNlOyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgU2V0THN0Q29tcG9uZW50c1RoaXNJdGVucygpe1xyXG4gICAgdGhpcy5sc3RDb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHsgY29tcG9uZW50Lml0ZW1zLnNldCh0aGlzLml0ZW1zKTsgcmV0dXJuOyB9KTtcclxuICB9XHJcblxyXG4gIGl0ZW1zOiBhbnlbXSA9IFtdO1xyXG4gIGFzeW5jIExvYWQoKTogUHJvbWlzZTx2b2lkPntcclxuICAgIGlmKHRoaXMuX2lzTG9hZGVkKXtcclxuICAgICAgdGhpcy5TZXRMc3RDb21wb25lbnRzVGhpc0l0ZW5zKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL1sgTG9hZCBmcm9tIEFycmF5IF1cclxuICAgIGlmKHRoaXMuY29uZmlndXJhdGlvbi5sb2FkRnJvbUFycmF5ICE9IHVuZGVmaW5lZCAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubG9hZEZyb21BcnJheS5sZW5ndGgpe1xyXG4gICAgICB0aGlzLml0ZW1zID0gdGhpcy5jb25maWd1cmF0aW9uLmxvYWRGcm9tQXJyYXk7XHJcbiAgICAgIHRoaXMuU2V0THN0Q29tcG9uZW50c1RoaXNJdGVucygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy9bIExvYWQgZnJvbSBhcGkgXVxyXG4gICAgdmFyIHZGaWx0cm9zOiBWaWV3RmlsdHJvcyB8IG51bGwgPSB0aGlzLmNvbmZpZ3VyYXRpb24udkZpbHRyb3M7XHJcbiAgICB0cnl7XHJcbiAgICAgIHZhciBsc3REYWRvczogYW55W10gPSBbXTtcclxuICAgICAgXHJcbiAgICAgIGlmKHRoaXMuY29uZmlndXJhdGlvbi5sb2FkRnJvbVNlcnZpY2Upe1xyXG4gICAgICAgIGxzdERhZG9zID0gKGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuY29uZmlndXJhdGlvbi5sb2FkRnJvbVNlcnZpY2UuTGlzdCh2RmlsdHJvcykpKS5sc3REYWRvc1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBsc3REYWRvcyA9IChhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmNvbmZpZ3VyYXRpb24ubG9hZEZyb21GdW5jdGlvbikpLmxzdERhZG9zO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLml0ZW1zID0gbHN0RGFkb3M7XHJcbiAgICAgIHRoaXMuU2V0THN0Q29tcG9uZW50c1RoaXNJdGVucygpO1xyXG4gICAgfWZpbmFsbHl7IHJldHVybjsgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEJpbmRWYWx1ZUZhY3RvcnkoY29uZmlndXJhdGlvbjogSW5wdXRTZWxlY3RDb25maWd1cmF0aW9uKTogKChvYmo6IGFueSkgPT4gYW55KSB7XHJcbiAgY29uc3QgY0JpbmRWYWx1ZSA9IGNvbmZpZ3VyYXRpb24uYmluZFZhbHVlO1xyXG4gIHZhciBiaW5kVmFsdWU6ICgoYXJnczogYW55KSA9PiBhbnkpID0gbnVsbDtcclxuICBpZih0eXBlb2YoY0JpbmRWYWx1ZSkgPT0gJ3N0cmluZycpe1xyXG4gICAgdmFyIGJ2Uzogc3RyaW5nICAgICAgICAgICAgICAgPSBjQmluZFZhbHVlO1xyXG4gICAgYmluZFZhbHVlID0gKChvYmo6IGFueSk6IGFueSA9PiB7IHJldHVybiBvYmpbYnZTXTsgfSk7XHJcbiAgfWVsc2V7XHJcbiAgICB2YXIgYnZGOiAoKGFyZ3M6IGFueSkgPT4gYW55KSA9IGNCaW5kVmFsdWU7XHJcbiAgICBiaW5kVmFsdWUgPSAoKG9iajogYW55KTogYW55ID0+IHsgcmV0dXJuIGJ2RihvYmopOyB9KTtcclxuICB9XHJcbiAgcmV0dXJuIGJpbmRWYWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEJpbmRMYWJlbEZhY3RvcnkoY29uZmlndXJhdGlvbjogSW5wdXRTZWxlY3RDb25maWd1cmF0aW9uKTogKChvYmo6IGFueSkgPT4gc3RyaW5nKXtcclxuICBjb25zdCBjQmluZExhYmVsID0gY29uZmlndXJhdGlvbi5iaW5kTGFiZWw7XHJcbiAgdmFyIGJpbmRMYWJlbDogKChhcmdzOiBhbnkpID0+IHN0cmluZykgPSBudWxsO1xyXG4gIGlmKHR5cGVvZihjQmluZExhYmVsKSA9PSAnc3RyaW5nJyl7XHJcbiAgICB2YXIgYmxTOiBzdHJpbmcgICAgICAgICAgICAgICA9IGNCaW5kTGFiZWw7XHJcbiAgICBiaW5kTGFiZWwgPSAoKG9iajogYW55KTogc3RyaW5nID0+IHsgcmV0dXJuIG9ialtibFNdICsgJyc7IH0pO1xyXG4gIH1lbHNle1xyXG4gICAgdmFyIGJsRjogKChhcmdzOiBhbnkpID0+IGFueSkgPSBjQmluZExhYmVsO1xyXG4gICAgYmluZExhYmVsID0gKChvYmo6IGFueSk6IHN0cmluZyA9PiB7IHJldHVybiBibEYob2JqKSArICcnOyB9KTtcclxuICB9XHJcbiAgcmV0dXJuIGJpbmRMYWJlbDtcclxufSJdfQ==
|