valtech-components 2.0.404 → 2.0.407
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 +71 -0
- package/esm2022/lib/components/atoms/avatar/avatar.component.mjs +4 -4
- package/esm2022/lib/components/atoms/avatar/types.mjs +1 -1
- package/esm2022/lib/components/atoms/box/box.component.mjs +4 -4
- package/esm2022/lib/components/atoms/box/types.mjs +1 -1
- package/esm2022/lib/components/atoms/button/button.component.mjs +6 -6
- package/esm2022/lib/components/atoms/button/factory.mjs +1 -1
- package/esm2022/lib/components/atoms/countdown/countdown.component.mjs +343 -0
- package/esm2022/lib/components/atoms/countdown/types.mjs +27 -0
- package/esm2022/lib/components/atoms/display/display.component.mjs +4 -4
- package/esm2022/lib/components/atoms/display/types.mjs +1 -1
- package/esm2022/lib/components/atoms/divider/divider.component.mjs +4 -4
- package/esm2022/lib/components/atoms/divider/types.mjs +1 -1
- package/esm2022/lib/components/atoms/fab/fab.component.mjs +152 -0
- package/esm2022/lib/components/atoms/fab/types.mjs +2 -0
- package/esm2022/lib/components/atoms/href/href.component.mjs +4 -4
- package/esm2022/lib/components/atoms/href/types.mjs +1 -1
- package/esm2022/lib/components/atoms/icon/icon.component.mjs +4 -4
- package/esm2022/lib/components/atoms/icon/types.mjs +1 -1
- package/esm2022/lib/components/atoms/image/image.component.mjs +6 -6
- package/esm2022/lib/components/atoms/image/types.mjs +1 -1
- package/esm2022/lib/components/atoms/price-tag/price-tag.component.mjs +245 -0
- package/esm2022/lib/components/atoms/price-tag/types.mjs +15 -0
- package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +4 -4
- package/esm2022/lib/components/atoms/progress-bar/types.mjs +1 -1
- package/esm2022/lib/components/atoms/progress-ring/progress-ring.component.mjs +149 -0
- package/esm2022/lib/components/atoms/progress-ring/types.mjs +2 -0
- package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +417 -0
- package/esm2022/lib/components/atoms/qr-code/types.mjs +2 -0
- package/esm2022/lib/components/atoms/skeleton/skeleton.component.mjs +193 -0
- package/esm2022/lib/components/atoms/skeleton/types.mjs +13 -0
- package/esm2022/lib/components/atoms/text/text.component.mjs +4 -4
- package/esm2022/lib/components/atoms/text/types.mjs +1 -1
- package/esm2022/lib/components/atoms/title/title.component.mjs +4 -4
- package/esm2022/lib/components/atoms/title/types.mjs +1 -1
- package/esm2022/lib/components/molecules/accordion/accordion.component.mjs +139 -0
- package/esm2022/lib/components/molecules/accordion/types.mjs +2 -0
- package/esm2022/lib/components/molecules/action-header/action-header.component.mjs +4 -4
- package/esm2022/lib/components/molecules/action-header/types.mjs +1 -1
- package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +4 -4
- package/esm2022/lib/components/molecules/alert-box/types.mjs +1 -1
- package/esm2022/lib/components/molecules/breadcrumb/breadcrumb.component.mjs +137 -0
- package/esm2022/lib/components/molecules/breadcrumb/types.mjs +2 -0
- package/esm2022/lib/components/molecules/button-group/button-group.component.mjs +4 -4
- package/esm2022/lib/components/molecules/button-group/types.mjs +1 -1
- package/esm2022/lib/components/molecules/card/card.component.mjs +5 -5
- package/esm2022/lib/components/molecules/card/types.mjs +1 -1
- package/esm2022/lib/components/molecules/check-input/check-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +174 -0
- package/esm2022/lib/components/molecules/chip-group/types.mjs +2 -0
- package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +4 -4
- package/esm2022/lib/components/molecules/code-display/types.mjs +1 -1
- package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +4 -4
- package/esm2022/lib/components/molecules/command-display/types.mjs +1 -1
- package/esm2022/lib/components/molecules/comment/comment.component.mjs +634 -0
- package/esm2022/lib/components/molecules/comment/types.mjs +2 -0
- package/esm2022/lib/components/molecules/comment-input/comment-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +4 -4
- package/esm2022/lib/components/molecules/content-loader/types.mjs +1 -1
- package/esm2022/lib/components/molecules/currency-input/currency-input.component.mjs +368 -0
- package/esm2022/lib/components/molecules/currency-input/types.mjs +18 -0
- package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +5 -5
- package/esm2022/lib/components/molecules/date-range-input/date-range-input.component.mjs +418 -0
- package/esm2022/lib/components/molecules/date-range-input/types.mjs +2 -0
- package/esm2022/lib/components/molecules/email-input/email-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/expandable-text/expandable-text.component.mjs +4 -4
- package/esm2022/lib/components/molecules/expandable-text/types.mjs +1 -1
- package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +279 -0
- package/esm2022/lib/components/molecules/glow-card/types.mjs +11 -0
- package/esm2022/lib/components/molecules/hint/hint.component.mjs +4 -4
- package/esm2022/lib/components/molecules/hour-input/hour-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/info/info.component.mjs +4 -4
- package/esm2022/lib/components/molecules/info/types.mjs +1 -1
- package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +4 -4
- package/esm2022/lib/components/molecules/language-selector/types.mjs +1 -1
- package/esm2022/lib/components/molecules/layered-card/layered-card.component.mjs +4 -4
- package/esm2022/lib/components/molecules/layered-card/types.mjs +1 -1
- package/esm2022/lib/components/molecules/link/link.component.mjs +4 -4
- package/esm2022/lib/components/molecules/link/types.mjs +1 -1
- package/esm2022/lib/components/molecules/links-cake/links-cake.component.mjs +4 -4
- package/esm2022/lib/components/molecules/links-cake/types.mjs +1 -1
- package/esm2022/lib/components/molecules/multi-select-search/multi-select-search.component.mjs +5 -5
- package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +4 -4
- package/esm2022/lib/components/molecules/notes-box/types.mjs +1 -1
- package/esm2022/lib/components/molecules/number-from-to/number-from-to.component.mjs +4 -4
- package/esm2022/lib/components/molecules/number-input/number-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/number-stepper/number-stepper.component.mjs +377 -0
- package/esm2022/lib/components/molecules/number-stepper/types.mjs +2 -0
- package/esm2022/lib/components/molecules/pagination/pagination.component.mjs +253 -0
- package/esm2022/lib/components/molecules/pagination/types.mjs +2 -0
- package/esm2022/lib/components/molecules/participant-card/participant-card.component.mjs +486 -0
- package/esm2022/lib/components/molecules/participant-card/types.mjs +21 -0
- package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/phone-input/phone-input.component.mjs +336 -0
- package/esm2022/lib/components/molecules/phone-input/types.mjs +19 -0
- package/esm2022/lib/components/molecules/pill/pill.component.mjs +4 -4
- package/esm2022/lib/components/molecules/pill/types.mjs +1 -1
- package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/plain-code-box/plain-code-box.component.mjs +4 -4
- package/esm2022/lib/components/molecules/plain-code-box/types.mjs +1 -1
- package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +5 -5
- package/esm2022/lib/components/molecules/popover-selector/types.mjs +1 -1
- package/esm2022/lib/components/molecules/progress-status/progress-status.component.mjs +4 -4
- package/esm2022/lib/components/molecules/progress-status/types.mjs +1 -1
- package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +4 -4
- package/esm2022/lib/components/molecules/prompter/types.mjs +1 -1
- package/esm2022/lib/components/molecules/quote-box/quote-box.component.mjs +155 -0
- package/esm2022/lib/components/molecules/radio-input/radio-input.component.mjs +5 -5
- package/esm2022/lib/components/molecules/raffle-status-card/raffle-status-card.component.mjs +484 -0
- package/esm2022/lib/components/molecules/raffle-status-card/types.mjs +23 -0
- package/esm2022/lib/components/molecules/range-input/range-input.component.mjs +148 -0
- package/esm2022/lib/components/molecules/range-input/types.mjs +2 -0
- package/esm2022/lib/components/molecules/rating/rating.component.mjs +149 -0
- package/esm2022/lib/components/molecules/rating/types.mjs +2 -0
- package/esm2022/lib/components/molecules/searchbar/searchbar.component.mjs +4 -4
- package/esm2022/lib/components/molecules/segment-control/segment-control.component.mjs +145 -0
- package/esm2022/lib/components/molecules/segment-control/types.mjs +2 -0
- package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +5 -5
- package/esm2022/lib/components/molecules/select-search/select-search.component.mjs +5 -5
- package/esm2022/lib/components/molecules/share-buttons/share-buttons.component.mjs +277 -0
- package/esm2022/lib/components/molecules/share-buttons/types.mjs +88 -0
- package/esm2022/lib/components/molecules/stats-card/stats-card.component.mjs +165 -0
- package/esm2022/lib/components/molecules/stats-card/types.mjs +2 -0
- package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +239 -0
- package/esm2022/lib/components/molecules/stepper/types.mjs +2 -0
- package/esm2022/lib/components/molecules/tabs/tabs.component.mjs +135 -0
- package/esm2022/lib/components/molecules/tabs/types.mjs +2 -0
- package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +4 -4
- package/esm2022/lib/components/molecules/textarea-input/textarea-input.component.mjs +204 -0
- package/esm2022/lib/components/molecules/textarea-input/types.mjs +2 -0
- package/esm2022/lib/components/molecules/ticket-grid/ticket-grid.component.mjs +497 -0
- package/esm2022/lib/components/molecules/ticket-grid/types.mjs +11 -0
- package/esm2022/lib/components/molecules/timeline/timeline.component.mjs +140 -0
- package/esm2022/lib/components/molecules/timeline/types.mjs +2 -0
- package/esm2022/lib/components/molecules/title-block/title-block.component.mjs +4 -4
- package/esm2022/lib/components/molecules/title-block/types.mjs +1 -1
- package/esm2022/lib/components/molecules/toggle-input/toggle-input.component.mjs +89 -0
- package/esm2022/lib/components/molecules/toggle-input/types.mjs +2 -0
- package/esm2022/lib/components/molecules/winner-display/types.mjs +9 -0
- package/esm2022/lib/components/molecules/winner-display/winner-display.component.mjs +370 -0
- package/esm2022/lib/components/organisms/article/article.component.mjs +4 -4
- package/esm2022/lib/components/organisms/article/types.mjs +1 -1
- package/esm2022/lib/components/organisms/banner/banner.component.mjs +4 -4
- package/esm2022/lib/components/organisms/banner/types.mjs +1 -1
- package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +578 -0
- package/esm2022/lib/components/organisms/comment-section/types.mjs +2 -0
- package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +853 -0
- package/esm2022/lib/components/organisms/data-table/types.mjs +13 -0
- package/esm2022/lib/components/organisms/footer/footer.component.mjs +4 -4
- package/esm2022/lib/components/organisms/footer/types.mjs +1 -1
- package/esm2022/lib/components/organisms/form/factory.mjs +1 -1
- package/esm2022/lib/components/organisms/form/form-footer/form-footer.component.mjs +4 -4
- package/esm2022/lib/components/organisms/form/form.component.mjs +4 -4
- package/esm2022/lib/components/organisms/header/header.component.mjs +4 -4
- package/esm2022/lib/components/organisms/header/types.mjs +1 -1
- package/esm2022/lib/components/organisms/item-list/item-list.component.mjs +4 -4
- package/esm2022/lib/components/organisms/item-list/types.mjs +1 -1
- package/esm2022/lib/components/organisms/no-content/no-content.component.mjs +4 -4
- package/esm2022/lib/components/organisms/no-content/types.mjs +1 -1
- package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +4 -4
- package/esm2022/lib/components/organisms/toolbar/types.mjs +1 -1
- package/esm2022/lib/components/organisms/wizard/types.mjs +1 -1
- package/esm2022/lib/components/organisms/wizard/wizard-footer/wizard-footer.component.mjs +4 -4
- package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +4 -4
- package/esm2022/lib/components/templates/layout/layout.component.mjs +4 -4
- package/esm2022/lib/components/templates/simple/simple.component.mjs +5 -5
- package/esm2022/lib/components/templates/simple/types.mjs +1 -1
- package/esm2022/lib/components/types.mjs +22 -16
- package/esm2022/lib/services/confirmation-dialog/confirmation-dialog.service.mjs +180 -0
- package/esm2022/lib/services/confirmation-dialog/types.mjs +14 -0
- package/esm2022/lib/services/download.service.mjs +4 -4
- package/esm2022/lib/services/icons.service.mjs +4 -4
- package/esm2022/lib/services/in-app-browser.service.mjs +4 -4
- package/esm2022/lib/services/lang-provider/components/lang-settings.mjs +1 -1
- package/esm2022/lib/services/lang-provider/content.mjs +1 -1
- package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +4 -4
- package/esm2022/lib/services/lang-provider/types.mjs +1 -1
- package/esm2022/lib/services/link-processor.service.mjs +4 -4
- package/esm2022/lib/services/local-storage.service.mjs +1 -1
- package/esm2022/lib/services/modal/modal.service.mjs +213 -0
- package/esm2022/lib/services/modal/simple-modal-content.component.mjs +133 -0
- package/esm2022/lib/services/modal/types.mjs +26 -0
- package/esm2022/lib/services/navigation.service.mjs +4 -4
- package/esm2022/lib/services/qr-generator/qr-generator.service.mjs +341 -0
- package/esm2022/lib/services/qr-generator/types.mjs +46 -0
- package/esm2022/lib/services/theme.service.mjs +4 -4
- package/esm2022/lib/services/toast.service.mjs +4 -4
- package/esm2022/lib/services/types.mjs +1 -1
- package/esm2022/lib/shared/constants/storage.mjs +1 -1
- package/esm2022/lib/shared/pipes/process-links.pipe.mjs +4 -4
- package/esm2022/lib/shared/utils/content.mjs +1 -1
- package/esm2022/lib/shared/utils/dom.mjs +1 -1
- package/esm2022/lib/shared/utils/form-defaults.mjs +1 -1
- package/esm2022/lib/shared/utils/simple-content.mjs +1 -1
- package/esm2022/lib/shared/utils/styles.mjs +1 -1
- package/esm2022/lib/shared/utils/text.mjs +1 -1
- package/esm2022/public-api.mjs +73 -3
- package/esm2022/valtech-components.mjs +1 -1
- package/fesm2022/valtech-components-simple-modal-content.component-DQhEgUmS.mjs +136 -0
- package/fesm2022/valtech-components-simple-modal-content.component-DQhEgUmS.mjs.map +1 -0
- package/fesm2022/valtech-components.mjs +14848 -4293
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/countdown/countdown.component.d.ts +38 -0
- package/lib/components/atoms/countdown/types.d.ts +108 -0
- package/lib/components/atoms/fab/fab.component.d.ts +16 -0
- package/lib/components/atoms/fab/types.d.ts +45 -0
- package/lib/components/atoms/price-tag/price-tag.component.d.ts +16 -0
- package/lib/components/atoms/price-tag/types.d.ts +59 -0
- package/lib/components/atoms/progress-ring/progress-ring.component.d.ts +20 -0
- package/lib/components/atoms/progress-ring/types.d.ts +24 -0
- package/lib/components/atoms/qr-code/qr-code.component.d.ts +36 -0
- package/lib/components/atoms/qr-code/types.d.ts +124 -0
- package/lib/components/atoms/skeleton/skeleton.component.d.ts +12 -0
- package/lib/components/atoms/skeleton/types.d.ts +29 -0
- package/lib/components/molecules/accordion/accordion.component.d.ts +19 -0
- package/lib/components/molecules/accordion/types.d.ts +47 -0
- package/lib/components/molecules/breadcrumb/breadcrumb.component.d.ts +22 -0
- package/lib/components/molecules/breadcrumb/types.d.ts +45 -0
- package/lib/components/molecules/chip-group/chip-group.component.d.ts +22 -0
- package/lib/components/molecules/chip-group/types.d.ts +65 -0
- package/lib/components/molecules/comment/comment.component.d.ts +42 -0
- package/lib/components/molecules/comment/types.d.ts +171 -0
- package/lib/components/molecules/currency-input/currency-input.component.d.ts +43 -0
- package/lib/components/molecules/currency-input/types.d.ts +96 -0
- package/lib/components/molecules/date-range-input/date-range-input.component.d.ts +42 -0
- package/lib/components/molecules/date-range-input/types.d.ts +109 -0
- package/lib/components/molecules/glow-card/glow-card.component.d.ts +51 -0
- package/lib/components/molecules/glow-card/types.d.ts +92 -0
- package/lib/components/molecules/number-stepper/number-stepper.component.d.ts +34 -0
- package/lib/components/molecules/number-stepper/types.d.ts +88 -0
- package/lib/components/molecules/pagination/pagination.component.d.ts +15 -0
- package/lib/components/molecules/pagination/types.d.ts +41 -0
- package/lib/components/molecules/participant-card/participant-card.component.d.ts +26 -0
- package/lib/components/molecules/participant-card/types.d.ts +132 -0
- package/lib/components/molecules/phone-input/phone-input.component.d.ts +38 -0
- package/lib/components/molecules/phone-input/types.d.ts +98 -0
- package/lib/components/molecules/quote-box/quote-box.component.d.ts +26 -0
- package/lib/components/molecules/raffle-status-card/raffle-status-card.component.d.ts +22 -0
- package/lib/components/molecules/raffle-status-card/types.d.ts +108 -0
- package/lib/components/molecules/range-input/range-input.component.d.ts +30 -0
- package/lib/components/molecules/range-input/types.d.ts +59 -0
- package/lib/components/molecules/rating/rating.component.d.ts +17 -0
- package/lib/components/molecules/rating/types.d.ts +41 -0
- package/lib/components/molecules/segment-control/segment-control.component.d.ts +30 -0
- package/lib/components/molecules/segment-control/types.d.ts +46 -0
- package/lib/components/molecules/share-buttons/share-buttons.component.d.ts +22 -0
- package/lib/components/molecules/share-buttons/types.d.ts +108 -0
- package/lib/components/molecules/stats-card/stats-card.component.d.ts +14 -0
- package/lib/components/molecules/stats-card/types.d.ts +41 -0
- package/lib/components/molecules/stepper/stepper.component.d.ts +21 -0
- package/lib/components/molecules/stepper/types.d.ts +66 -0
- package/lib/components/molecules/tabs/tabs.component.d.ts +17 -0
- package/lib/components/molecules/tabs/types.d.ts +45 -0
- package/lib/components/molecules/textarea-input/textarea-input.component.d.ts +27 -0
- package/lib/components/molecules/textarea-input/types.d.ts +74 -0
- package/lib/components/molecules/ticket-grid/ticket-grid.component.d.ts +41 -0
- package/lib/components/molecules/ticket-grid/types.d.ts +122 -0
- package/lib/components/molecules/timeline/timeline.component.d.ts +14 -0
- package/lib/components/molecules/timeline/types.d.ts +39 -0
- package/lib/components/molecules/toggle-input/toggle-input.component.d.ts +24 -0
- package/lib/components/molecules/toggle-input/types.d.ts +30 -0
- package/lib/components/molecules/winner-display/types.d.ts +103 -0
- package/lib/components/molecules/winner-display/winner-display.component.d.ts +37 -0
- package/lib/components/organisms/article/article.component.d.ts +1 -1
- package/lib/components/organisms/comment-section/comment-section.component.d.ts +52 -0
- package/lib/components/organisms/comment-section/types.d.ts +144 -0
- package/lib/components/organisms/data-table/data-table.component.d.ts +46 -0
- package/lib/components/organisms/data-table/types.d.ts +205 -0
- package/lib/components/types.d.ts +21 -15
- package/lib/services/confirmation-dialog/confirmation-dialog.service.d.ts +71 -0
- package/lib/services/confirmation-dialog/types.d.ts +61 -0
- package/lib/services/modal/modal.service.d.ts +98 -0
- package/lib/services/modal/simple-modal-content.component.d.ts +19 -0
- package/lib/services/modal/types.d.ts +155 -0
- package/lib/services/qr-generator/qr-generator.service.d.ts +115 -0
- package/lib/services/qr-generator/types.d.ts +141 -0
- package/package.json +11 -4
- package/public-api.d.ts +72 -2
- package/LICENSE +0 -21
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, Input, Output, EventEmitter, inject } from '@angular/core';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { IonButton, IonIcon, IonSearchbar } from '@ionic/angular/standalone';
|
|
5
|
+
import { addIcons } from 'ionicons';
|
|
6
|
+
import { shuffleOutline } from 'ionicons/icons';
|
|
7
|
+
import { LangService } from '../../../services/lang-provider/lang-provider.service';
|
|
8
|
+
import { DEFAULT_LEGEND_LABELS, } from './types';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
addIcons({ shuffleOutline });
|
|
11
|
+
/**
|
|
12
|
+
* val-ticket-grid
|
|
13
|
+
*
|
|
14
|
+
* A grid for selecting ticket numbers, commonly used in raffles and lotteries.
|
|
15
|
+
*
|
|
16
|
+
* @example Basic usage
|
|
17
|
+
* ```html
|
|
18
|
+
* <val-ticket-grid
|
|
19
|
+
* [props]="{
|
|
20
|
+
* totalTickets: 100,
|
|
21
|
+
* soldTickets: [1, 5, 12, 23],
|
|
22
|
+
* selectionMode: 'multiple',
|
|
23
|
+
* maxSelection: 10
|
|
24
|
+
* }"
|
|
25
|
+
* (selectionChange)="onSelectionChange($event)"
|
|
26
|
+
* ></val-ticket-grid>
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @example With legend and search
|
|
30
|
+
* ```html
|
|
31
|
+
* <val-ticket-grid
|
|
32
|
+
* [props]="{
|
|
33
|
+
* totalTickets: 500,
|
|
34
|
+
* soldTickets: soldNumbers,
|
|
35
|
+
* reservedTickets: reservedNumbers,
|
|
36
|
+
* columns: 20,
|
|
37
|
+
* showLegend: true,
|
|
38
|
+
* showSearch: true,
|
|
39
|
+
* showRandomSelect: true,
|
|
40
|
+
* randomSelectCount: 5,
|
|
41
|
+
* maxSelection: 10
|
|
42
|
+
* }"
|
|
43
|
+
* ></val-ticket-grid>
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export class TicketGridComponent {
|
|
47
|
+
constructor() {
|
|
48
|
+
this.selectionChange = new EventEmitter();
|
|
49
|
+
this.ticketClick = new EventEmitter();
|
|
50
|
+
this.tickets = [];
|
|
51
|
+
this.displayedTickets = [];
|
|
52
|
+
this.selectedTickets = [];
|
|
53
|
+
this.searchTerm = '';
|
|
54
|
+
this.highlightedNumbers = [];
|
|
55
|
+
this.langService = inject(LangService);
|
|
56
|
+
}
|
|
57
|
+
ngOnInit() {
|
|
58
|
+
this.buildTickets();
|
|
59
|
+
}
|
|
60
|
+
ngOnChanges(changes) {
|
|
61
|
+
if (changes['props']) {
|
|
62
|
+
this.buildTickets();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
buildTickets() {
|
|
66
|
+
const start = this.props.startNumber ?? 1;
|
|
67
|
+
const total = this.props.totalTickets;
|
|
68
|
+
const soldSet = new Set(this.props.soldTickets || []);
|
|
69
|
+
const reservedSet = new Set(this.props.reservedTickets || []);
|
|
70
|
+
const disabledSet = new Set(this.props.disabledTickets || []);
|
|
71
|
+
const selectedSet = new Set(this.props.selectedTickets || []);
|
|
72
|
+
// Initialize selected tickets from props
|
|
73
|
+
this.selectedTickets = [...(this.props.selectedTickets || [])];
|
|
74
|
+
// Build ticket array
|
|
75
|
+
if (this.props.ticketData?.length) {
|
|
76
|
+
// Use custom ticket data
|
|
77
|
+
this.tickets = [...this.props.ticketData];
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Generate from numbers
|
|
81
|
+
this.tickets = [];
|
|
82
|
+
for (let i = start; i < start + total; i++) {
|
|
83
|
+
let status = 'available';
|
|
84
|
+
if (disabledSet.has(i)) {
|
|
85
|
+
status = 'disabled';
|
|
86
|
+
}
|
|
87
|
+
else if (soldSet.has(i)) {
|
|
88
|
+
status = 'sold';
|
|
89
|
+
}
|
|
90
|
+
else if (reservedSet.has(i)) {
|
|
91
|
+
status = 'reserved';
|
|
92
|
+
}
|
|
93
|
+
else if (selectedSet.has(i)) {
|
|
94
|
+
status = 'selected';
|
|
95
|
+
}
|
|
96
|
+
this.tickets.push({ number: i, status });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
this.applySearch();
|
|
100
|
+
}
|
|
101
|
+
applySearch() {
|
|
102
|
+
if (!this.searchTerm) {
|
|
103
|
+
this.displayedTickets = [...this.tickets];
|
|
104
|
+
this.highlightedNumbers = [];
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Filter/highlight tickets matching search
|
|
108
|
+
const term = this.searchTerm.trim();
|
|
109
|
+
this.highlightedNumbers = this.tickets
|
|
110
|
+
.filter(t => this.formatNumber(t.number).includes(term))
|
|
111
|
+
.map(t => t.number);
|
|
112
|
+
this.displayedTickets = [...this.tickets];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
onSearch(event) {
|
|
116
|
+
this.searchTerm = event.detail.value || '';
|
|
117
|
+
this.applySearch();
|
|
118
|
+
}
|
|
119
|
+
isHighlighted(number) {
|
|
120
|
+
return this.highlightedNumbers.includes(number);
|
|
121
|
+
}
|
|
122
|
+
isSelectable(ticket) {
|
|
123
|
+
if (this.props.selectionMode === 'none')
|
|
124
|
+
return false;
|
|
125
|
+
// Check if sold/reserved and admin override
|
|
126
|
+
if (ticket.status === 'sold' || ticket.status === 'reserved') {
|
|
127
|
+
return this.props.allowSelectSold === true;
|
|
128
|
+
}
|
|
129
|
+
if (ticket.status === 'disabled')
|
|
130
|
+
return false;
|
|
131
|
+
// Check max selection
|
|
132
|
+
if (ticket.status !== 'selected' &&
|
|
133
|
+
this.props.maxSelection &&
|
|
134
|
+
this.selectedTickets.length >= this.props.maxSelection) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
onTicketClick(ticket) {
|
|
140
|
+
const isSelected = this.selectedTickets.includes(ticket.number);
|
|
141
|
+
// Emit click event regardless
|
|
142
|
+
this.ticketClick.emit({
|
|
143
|
+
number: ticket.number,
|
|
144
|
+
status: ticket.status,
|
|
145
|
+
selected: this.isSelectable(ticket) ? !isSelected : null,
|
|
146
|
+
});
|
|
147
|
+
if (!this.isSelectable(ticket) && ticket.status !== 'selected') {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Handle selection
|
|
151
|
+
if (isSelected) {
|
|
152
|
+
// Deselect
|
|
153
|
+
this.selectedTickets = this.selectedTickets.filter(n => n !== ticket.number);
|
|
154
|
+
ticket.status = 'available';
|
|
155
|
+
this.selectionChange.emit({
|
|
156
|
+
selectedTickets: [...this.selectedTickets],
|
|
157
|
+
changedTicket: ticket.number,
|
|
158
|
+
action: 'deselect',
|
|
159
|
+
count: this.selectedTickets.length,
|
|
160
|
+
maxReached: false,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// Select
|
|
165
|
+
if (this.props.selectionMode === 'single') {
|
|
166
|
+
// Deselect previous
|
|
167
|
+
this.selectedTickets.forEach(num => {
|
|
168
|
+
const t = this.tickets.find(x => x.number === num);
|
|
169
|
+
if (t)
|
|
170
|
+
t.status = 'available';
|
|
171
|
+
});
|
|
172
|
+
this.selectedTickets = [ticket.number];
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.selectedTickets.push(ticket.number);
|
|
176
|
+
}
|
|
177
|
+
ticket.status = 'selected';
|
|
178
|
+
this.selectionChange.emit({
|
|
179
|
+
selectedTickets: [...this.selectedTickets],
|
|
180
|
+
changedTicket: ticket.number,
|
|
181
|
+
action: 'select',
|
|
182
|
+
count: this.selectedTickets.length,
|
|
183
|
+
maxReached: this.props.maxSelection
|
|
184
|
+
? this.selectedTickets.length >= this.props.maxSelection
|
|
185
|
+
: false,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
selectRandom() {
|
|
190
|
+
const count = this.props.randomSelectCount || 1;
|
|
191
|
+
const available = this.tickets.filter(t => t.status === 'available' && !this.selectedTickets.includes(t.number));
|
|
192
|
+
// Determine how many we can select
|
|
193
|
+
const maxCanSelect = this.props.maxSelection
|
|
194
|
+
? Math.min(count, this.props.maxSelection - this.selectedTickets.length)
|
|
195
|
+
: count;
|
|
196
|
+
if (available.length === 0 || maxCanSelect <= 0)
|
|
197
|
+
return;
|
|
198
|
+
// Random shuffle and pick
|
|
199
|
+
const shuffled = [...available].sort(() => Math.random() - 0.5);
|
|
200
|
+
const toSelect = shuffled.slice(0, Math.min(maxCanSelect, available.length));
|
|
201
|
+
toSelect.forEach(ticket => {
|
|
202
|
+
ticket.status = 'selected';
|
|
203
|
+
this.selectedTickets.push(ticket.number);
|
|
204
|
+
});
|
|
205
|
+
this.selectionChange.emit({
|
|
206
|
+
selectedTickets: [...this.selectedTickets],
|
|
207
|
+
changedTicket: toSelect[toSelect.length - 1].number,
|
|
208
|
+
action: 'select',
|
|
209
|
+
count: this.selectedTickets.length,
|
|
210
|
+
maxReached: this.props.maxSelection
|
|
211
|
+
? this.selectedTickets.length >= this.props.maxSelection
|
|
212
|
+
: false,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Clear all selections.
|
|
217
|
+
*/
|
|
218
|
+
clearSelection() {
|
|
219
|
+
this.selectedTickets.forEach(num => {
|
|
220
|
+
const ticket = this.tickets.find(t => t.number === num);
|
|
221
|
+
if (ticket)
|
|
222
|
+
ticket.status = 'available';
|
|
223
|
+
});
|
|
224
|
+
this.selectedTickets = [];
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get selected ticket numbers.
|
|
228
|
+
*/
|
|
229
|
+
getSelectedTickets() {
|
|
230
|
+
return [...this.selectedTickets];
|
|
231
|
+
}
|
|
232
|
+
get availableCount() {
|
|
233
|
+
return this.tickets.filter(t => t.status === 'available').length;
|
|
234
|
+
}
|
|
235
|
+
get soldCount() {
|
|
236
|
+
return this.tickets.filter(t => t.status === 'sold').length;
|
|
237
|
+
}
|
|
238
|
+
getLegendItems() {
|
|
239
|
+
if (this.props.legendItems) {
|
|
240
|
+
return this.props.legendItems;
|
|
241
|
+
}
|
|
242
|
+
const items = [
|
|
243
|
+
{ status: 'available', label: DEFAULT_LEGEND_LABELS.available, count: this.availableCount },
|
|
244
|
+
{ status: 'selected', label: DEFAULT_LEGEND_LABELS.selected, count: this.selectedTickets.length },
|
|
245
|
+
];
|
|
246
|
+
if (this.props.soldTickets?.length) {
|
|
247
|
+
items.push({ status: 'sold', label: DEFAULT_LEGEND_LABELS.sold, count: this.soldCount });
|
|
248
|
+
}
|
|
249
|
+
if (this.props.reservedTickets?.length) {
|
|
250
|
+
items.push({
|
|
251
|
+
status: 'reserved',
|
|
252
|
+
label: DEFAULT_LEGEND_LABELS.reserved,
|
|
253
|
+
count: this.props.reservedTickets.length,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return items;
|
|
257
|
+
}
|
|
258
|
+
formatNumber(num) {
|
|
259
|
+
if (this.props.numberPadding) {
|
|
260
|
+
return String(num).padStart(this.props.numberPadding, '0');
|
|
261
|
+
}
|
|
262
|
+
return String(num);
|
|
263
|
+
}
|
|
264
|
+
getTicketAriaLabel(ticket) {
|
|
265
|
+
const statusLabel = DEFAULT_LEGEND_LABELS[ticket.status];
|
|
266
|
+
return `Boleto ${this.formatNumber(ticket.number)}, ${statusLabel}`;
|
|
267
|
+
}
|
|
268
|
+
getSearchPlaceholder() {
|
|
269
|
+
if (this.props.searchPlaceholderContentKey && this.props.contentClass) {
|
|
270
|
+
return this.langService.getText(this.props.contentClass, this.props.searchPlaceholderContentKey, this.props.searchPlaceholder || 'Buscar número...');
|
|
271
|
+
}
|
|
272
|
+
return this.props.searchPlaceholder || 'Buscar número...';
|
|
273
|
+
}
|
|
274
|
+
getRandomSelectLabel() {
|
|
275
|
+
if (this.props.randomSelectLabelContentKey && this.props.contentClass) {
|
|
276
|
+
return this.langService.getText(this.props.contentClass, this.props.randomSelectLabelContentKey, this.props.randomSelectLabel || 'Aleatorio');
|
|
277
|
+
}
|
|
278
|
+
return this.props.randomSelectLabel || 'Aleatorio';
|
|
279
|
+
}
|
|
280
|
+
getColor() {
|
|
281
|
+
if (this.props.color) {
|
|
282
|
+
return `var(--ion-color-${this.props.color})`;
|
|
283
|
+
}
|
|
284
|
+
return 'var(--ion-color-primary)';
|
|
285
|
+
}
|
|
286
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
287
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TicketGridComponent, isStandalone: true, selector: "val-ticket-grid", inputs: { props: "props" }, outputs: { selectionChange: "selectionChange", ticketClick: "ticketClick" }, usesOnChanges: true, ngImport: i0, template: `
|
|
288
|
+
<div
|
|
289
|
+
class="ticket-grid-container"
|
|
290
|
+
[class]="props.cssClass"
|
|
291
|
+
[class.size-small]="props.ticketSize === 'small'"
|
|
292
|
+
[class.size-medium]="props.ticketSize === 'medium' || !props.ticketSize"
|
|
293
|
+
[class.size-large]="props.ticketSize === 'large'"
|
|
294
|
+
[style.--grid-columns]="props.columns || 10"
|
|
295
|
+
[style.--grid-gap]="(props.gap || 4) + 'px'"
|
|
296
|
+
[style.--selected-color]="getColor()"
|
|
297
|
+
>
|
|
298
|
+
<!-- Search and controls -->
|
|
299
|
+
@if (props.showSearch || props.showRandomSelect) {
|
|
300
|
+
<div class="grid-controls">
|
|
301
|
+
@if (props.showSearch) {
|
|
302
|
+
<ion-searchbar
|
|
303
|
+
[placeholder]="getSearchPlaceholder()"
|
|
304
|
+
[debounce]="300"
|
|
305
|
+
(ionInput)="onSearch($event)"
|
|
306
|
+
class="ticket-search"
|
|
307
|
+
></ion-searchbar>
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
@if (props.showRandomSelect && props.selectionMode !== 'none') {
|
|
311
|
+
<ion-button
|
|
312
|
+
fill="outline"
|
|
313
|
+
[color]="props.color || 'primary'"
|
|
314
|
+
(click)="selectRandom()"
|
|
315
|
+
[disabled]="availableCount < (props.randomSelectCount || 1)"
|
|
316
|
+
>
|
|
317
|
+
<ion-icon slot="start" name="shuffle-outline"></ion-icon>
|
|
318
|
+
{{ getRandomSelectLabel() }}
|
|
319
|
+
</ion-button>
|
|
320
|
+
}
|
|
321
|
+
</div>
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
<!-- Legend (top) -->
|
|
325
|
+
@if (props.showLegend && props.legendPosition !== 'bottom') {
|
|
326
|
+
<div class="ticket-legend">
|
|
327
|
+
@for (item of getLegendItems(); track item.status) {
|
|
328
|
+
<div class="legend-item">
|
|
329
|
+
<span class="legend-color" [class]="'status-' + item.status"></span>
|
|
330
|
+
<span class="legend-label">{{ item.label }}</span>
|
|
331
|
+
@if (item.count !== undefined) {
|
|
332
|
+
<span class="legend-count">({{ item.count }})</span>
|
|
333
|
+
}
|
|
334
|
+
</div>
|
|
335
|
+
}
|
|
336
|
+
</div>
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
<!-- Summary -->
|
|
340
|
+
@if (props.showSummary) {
|
|
341
|
+
<div class="ticket-summary">
|
|
342
|
+
<span class="summary-item">
|
|
343
|
+
<strong>{{ selectedTickets.length }}</strong> seleccionado{{ selectedTickets.length !== 1 ? 's' : '' }}
|
|
344
|
+
</span>
|
|
345
|
+
@if (props.maxSelection) {
|
|
346
|
+
<span class="summary-item">
|
|
347
|
+
(máx: {{ props.maxSelection }})
|
|
348
|
+
</span>
|
|
349
|
+
}
|
|
350
|
+
</div>
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
<!-- Grid -->
|
|
354
|
+
<div class="ticket-grid" role="grid">
|
|
355
|
+
@for (ticket of displayedTickets; track ticket.number) {
|
|
356
|
+
<button
|
|
357
|
+
type="button"
|
|
358
|
+
class="ticket-cell"
|
|
359
|
+
[class]="'status-' + ticket.status"
|
|
360
|
+
[class.highlighted]="isHighlighted(ticket.number)"
|
|
361
|
+
[disabled]="!isSelectable(ticket)"
|
|
362
|
+
[attr.aria-label]="getTicketAriaLabel(ticket)"
|
|
363
|
+
[attr.aria-pressed]="ticket.status === 'selected'"
|
|
364
|
+
(click)="onTicketClick(ticket)"
|
|
365
|
+
>
|
|
366
|
+
{{ formatNumber(ticket.number) }}
|
|
367
|
+
</button>
|
|
368
|
+
}
|
|
369
|
+
</div>
|
|
370
|
+
|
|
371
|
+
<!-- Legend (bottom) -->
|
|
372
|
+
@if (props.showLegend && props.legendPosition === 'bottom') {
|
|
373
|
+
<div class="ticket-legend bottom">
|
|
374
|
+
@for (item of getLegendItems(); track item.status) {
|
|
375
|
+
<div class="legend-item">
|
|
376
|
+
<span class="legend-color" [class]="'status-' + item.status"></span>
|
|
377
|
+
<span class="legend-label">{{ item.label }}</span>
|
|
378
|
+
@if (item.count !== undefined) {
|
|
379
|
+
<span class="legend-count">({{ item.count }})</span>
|
|
380
|
+
}
|
|
381
|
+
</div>
|
|
382
|
+
}
|
|
383
|
+
</div>
|
|
384
|
+
}
|
|
385
|
+
</div>
|
|
386
|
+
`, isInline: true, styles: ["@charset \"UTF-8\";:host{display:block}.ticket-grid-container{--grid-columns: 10;--grid-gap: 4px;--selected-color: var(--ion-color-primary);display:flex;flex-direction:column;gap:16px}.grid-controls{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between}.ticket-search{flex:1;min-width:200px;max-width:300px;--border-radius: 8px}.ticket-legend{display:flex;flex-wrap:wrap;gap:16px;padding:8px 0}.ticket-legend.bottom{border-top:1px solid var(--ion-color-light-shade);padding-top:12px;margin-top:8px}.legend-item{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ion-color-medium-shade)}.legend-color{width:16px;height:16px;border-radius:4px;border:1px solid var(--ion-color-medium)}.legend-color.status-available{background:var(--ion-color-light);border-color:var(--ion-color-medium)}.legend-color.status-selected{background:var(--selected-color);border-color:var(--selected-color)}.legend-color.status-sold{background:var(--ion-color-medium);border-color:var(--ion-color-medium-shade)}.legend-color.status-reserved{background:var(--ion-color-warning-tint);border-color:var(--ion-color-warning)}.legend-color.status-disabled{background:var(--ion-color-light-shade);border-color:var(--ion-color-medium);opacity:.5}.legend-count{color:var(--ion-color-medium);font-size:11px}.ticket-summary{display:flex;gap:8px;align-items:center;font-size:14px;color:var(--ion-color-dark);padding:8px 12px;background:var(--ion-color-light);border-radius:8px}.summary-item:not(:last-child):after{content:\"\\2022\";margin-left:8px;color:var(--ion-color-medium)}.ticket-grid{display:grid;grid-template-columns:repeat(var(--grid-columns),1fr);gap:var(--grid-gap)}.ticket-cell{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border:1px solid var(--ion-color-medium);border-radius:4px;background:var(--ion-color-light);font-size:12px;font-weight:500;color:var(--ion-color-dark);cursor:pointer;transition:all .15s ease;padding:0;font-family:inherit}.ticket-cell:hover:not(:disabled){border-color:var(--selected-color);transform:scale(1.05);z-index:1}.ticket-cell:focus{outline:2px solid var(--selected-color);outline-offset:1px}.ticket-cell.status-available{background:var(--ion-color-light);border-color:var(--ion-color-medium)}.ticket-cell.status-available:hover:not(:disabled){background:var(--ion-color-light-shade)}.ticket-cell.status-selected{background:var(--selected-color);border-color:var(--selected-color);color:#fff;font-weight:600}.ticket-cell.status-sold{background:var(--ion-color-medium);border-color:var(--ion-color-medium-shade);color:var(--ion-color-medium-contrast);cursor:not-allowed;opacity:.7}.ticket-cell.status-reserved{background:var(--ion-color-warning-tint);border-color:var(--ion-color-warning);color:var(--ion-color-warning-shade);cursor:not-allowed}.ticket-cell.status-disabled{background:var(--ion-color-light-shade);border-color:var(--ion-color-medium);color:var(--ion-color-medium);cursor:not-allowed;opacity:.5}.ticket-cell.highlighted{box-shadow:0 0 0 2px var(--ion-color-tertiary);z-index:2}.ticket-cell:disabled{cursor:not-allowed}.size-small .ticket-grid{--grid-gap: 2px}.size-small .ticket-cell{font-size:10px;border-radius:2px}.size-small .ticket-legend{gap:12px}.size-small .legend-color{width:12px;height:12px}.size-small .legend-item{font-size:11px}.size-large .ticket-grid{--grid-gap: 6px}.size-large .ticket-cell{font-size:14px;border-radius:6px;font-weight:600}.size-large .ticket-legend{gap:20px}.size-large .legend-color{width:20px;height:20px}.size-large .legend-item{font-size:14px}@media (max-width: 576px){.grid-controls{flex-direction:column;align-items:stretch}.ticket-search{max-width:100%}.ticket-legend{justify-content:center}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSearchbar, selector: "ion-searchbar", inputs: ["animated", "autocomplete", "autocorrect", "cancelButtonIcon", "cancelButtonText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "mode", "name", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value"] }] }); }
|
|
387
|
+
}
|
|
388
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TicketGridComponent, decorators: [{
|
|
389
|
+
type: Component,
|
|
390
|
+
args: [{ selector: 'val-ticket-grid', standalone: true, imports: [CommonModule, FormsModule, IonButton, IonIcon, IonSearchbar], template: `
|
|
391
|
+
<div
|
|
392
|
+
class="ticket-grid-container"
|
|
393
|
+
[class]="props.cssClass"
|
|
394
|
+
[class.size-small]="props.ticketSize === 'small'"
|
|
395
|
+
[class.size-medium]="props.ticketSize === 'medium' || !props.ticketSize"
|
|
396
|
+
[class.size-large]="props.ticketSize === 'large'"
|
|
397
|
+
[style.--grid-columns]="props.columns || 10"
|
|
398
|
+
[style.--grid-gap]="(props.gap || 4) + 'px'"
|
|
399
|
+
[style.--selected-color]="getColor()"
|
|
400
|
+
>
|
|
401
|
+
<!-- Search and controls -->
|
|
402
|
+
@if (props.showSearch || props.showRandomSelect) {
|
|
403
|
+
<div class="grid-controls">
|
|
404
|
+
@if (props.showSearch) {
|
|
405
|
+
<ion-searchbar
|
|
406
|
+
[placeholder]="getSearchPlaceholder()"
|
|
407
|
+
[debounce]="300"
|
|
408
|
+
(ionInput)="onSearch($event)"
|
|
409
|
+
class="ticket-search"
|
|
410
|
+
></ion-searchbar>
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
@if (props.showRandomSelect && props.selectionMode !== 'none') {
|
|
414
|
+
<ion-button
|
|
415
|
+
fill="outline"
|
|
416
|
+
[color]="props.color || 'primary'"
|
|
417
|
+
(click)="selectRandom()"
|
|
418
|
+
[disabled]="availableCount < (props.randomSelectCount || 1)"
|
|
419
|
+
>
|
|
420
|
+
<ion-icon slot="start" name="shuffle-outline"></ion-icon>
|
|
421
|
+
{{ getRandomSelectLabel() }}
|
|
422
|
+
</ion-button>
|
|
423
|
+
}
|
|
424
|
+
</div>
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
<!-- Legend (top) -->
|
|
428
|
+
@if (props.showLegend && props.legendPosition !== 'bottom') {
|
|
429
|
+
<div class="ticket-legend">
|
|
430
|
+
@for (item of getLegendItems(); track item.status) {
|
|
431
|
+
<div class="legend-item">
|
|
432
|
+
<span class="legend-color" [class]="'status-' + item.status"></span>
|
|
433
|
+
<span class="legend-label">{{ item.label }}</span>
|
|
434
|
+
@if (item.count !== undefined) {
|
|
435
|
+
<span class="legend-count">({{ item.count }})</span>
|
|
436
|
+
}
|
|
437
|
+
</div>
|
|
438
|
+
}
|
|
439
|
+
</div>
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
<!-- Summary -->
|
|
443
|
+
@if (props.showSummary) {
|
|
444
|
+
<div class="ticket-summary">
|
|
445
|
+
<span class="summary-item">
|
|
446
|
+
<strong>{{ selectedTickets.length }}</strong> seleccionado{{ selectedTickets.length !== 1 ? 's' : '' }}
|
|
447
|
+
</span>
|
|
448
|
+
@if (props.maxSelection) {
|
|
449
|
+
<span class="summary-item">
|
|
450
|
+
(máx: {{ props.maxSelection }})
|
|
451
|
+
</span>
|
|
452
|
+
}
|
|
453
|
+
</div>
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
<!-- Grid -->
|
|
457
|
+
<div class="ticket-grid" role="grid">
|
|
458
|
+
@for (ticket of displayedTickets; track ticket.number) {
|
|
459
|
+
<button
|
|
460
|
+
type="button"
|
|
461
|
+
class="ticket-cell"
|
|
462
|
+
[class]="'status-' + ticket.status"
|
|
463
|
+
[class.highlighted]="isHighlighted(ticket.number)"
|
|
464
|
+
[disabled]="!isSelectable(ticket)"
|
|
465
|
+
[attr.aria-label]="getTicketAriaLabel(ticket)"
|
|
466
|
+
[attr.aria-pressed]="ticket.status === 'selected'"
|
|
467
|
+
(click)="onTicketClick(ticket)"
|
|
468
|
+
>
|
|
469
|
+
{{ formatNumber(ticket.number) }}
|
|
470
|
+
</button>
|
|
471
|
+
}
|
|
472
|
+
</div>
|
|
473
|
+
|
|
474
|
+
<!-- Legend (bottom) -->
|
|
475
|
+
@if (props.showLegend && props.legendPosition === 'bottom') {
|
|
476
|
+
<div class="ticket-legend bottom">
|
|
477
|
+
@for (item of getLegendItems(); track item.status) {
|
|
478
|
+
<div class="legend-item">
|
|
479
|
+
<span class="legend-color" [class]="'status-' + item.status"></span>
|
|
480
|
+
<span class="legend-label">{{ item.label }}</span>
|
|
481
|
+
@if (item.count !== undefined) {
|
|
482
|
+
<span class="legend-count">({{ item.count }})</span>
|
|
483
|
+
}
|
|
484
|
+
</div>
|
|
485
|
+
}
|
|
486
|
+
</div>
|
|
487
|
+
}
|
|
488
|
+
</div>
|
|
489
|
+
`, styles: ["@charset \"UTF-8\";:host{display:block}.ticket-grid-container{--grid-columns: 10;--grid-gap: 4px;--selected-color: var(--ion-color-primary);display:flex;flex-direction:column;gap:16px}.grid-controls{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between}.ticket-search{flex:1;min-width:200px;max-width:300px;--border-radius: 8px}.ticket-legend{display:flex;flex-wrap:wrap;gap:16px;padding:8px 0}.ticket-legend.bottom{border-top:1px solid var(--ion-color-light-shade);padding-top:12px;margin-top:8px}.legend-item{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ion-color-medium-shade)}.legend-color{width:16px;height:16px;border-radius:4px;border:1px solid var(--ion-color-medium)}.legend-color.status-available{background:var(--ion-color-light);border-color:var(--ion-color-medium)}.legend-color.status-selected{background:var(--selected-color);border-color:var(--selected-color)}.legend-color.status-sold{background:var(--ion-color-medium);border-color:var(--ion-color-medium-shade)}.legend-color.status-reserved{background:var(--ion-color-warning-tint);border-color:var(--ion-color-warning)}.legend-color.status-disabled{background:var(--ion-color-light-shade);border-color:var(--ion-color-medium);opacity:.5}.legend-count{color:var(--ion-color-medium);font-size:11px}.ticket-summary{display:flex;gap:8px;align-items:center;font-size:14px;color:var(--ion-color-dark);padding:8px 12px;background:var(--ion-color-light);border-radius:8px}.summary-item:not(:last-child):after{content:\"\\2022\";margin-left:8px;color:var(--ion-color-medium)}.ticket-grid{display:grid;grid-template-columns:repeat(var(--grid-columns),1fr);gap:var(--grid-gap)}.ticket-cell{aspect-ratio:1;display:flex;align-items:center;justify-content:center;border:1px solid var(--ion-color-medium);border-radius:4px;background:var(--ion-color-light);font-size:12px;font-weight:500;color:var(--ion-color-dark);cursor:pointer;transition:all .15s ease;padding:0;font-family:inherit}.ticket-cell:hover:not(:disabled){border-color:var(--selected-color);transform:scale(1.05);z-index:1}.ticket-cell:focus{outline:2px solid var(--selected-color);outline-offset:1px}.ticket-cell.status-available{background:var(--ion-color-light);border-color:var(--ion-color-medium)}.ticket-cell.status-available:hover:not(:disabled){background:var(--ion-color-light-shade)}.ticket-cell.status-selected{background:var(--selected-color);border-color:var(--selected-color);color:#fff;font-weight:600}.ticket-cell.status-sold{background:var(--ion-color-medium);border-color:var(--ion-color-medium-shade);color:var(--ion-color-medium-contrast);cursor:not-allowed;opacity:.7}.ticket-cell.status-reserved{background:var(--ion-color-warning-tint);border-color:var(--ion-color-warning);color:var(--ion-color-warning-shade);cursor:not-allowed}.ticket-cell.status-disabled{background:var(--ion-color-light-shade);border-color:var(--ion-color-medium);color:var(--ion-color-medium);cursor:not-allowed;opacity:.5}.ticket-cell.highlighted{box-shadow:0 0 0 2px var(--ion-color-tertiary);z-index:2}.ticket-cell:disabled{cursor:not-allowed}.size-small .ticket-grid{--grid-gap: 2px}.size-small .ticket-cell{font-size:10px;border-radius:2px}.size-small .ticket-legend{gap:12px}.size-small .legend-color{width:12px;height:12px}.size-small .legend-item{font-size:11px}.size-large .ticket-grid{--grid-gap: 6px}.size-large .ticket-cell{font-size:14px;border-radius:6px;font-weight:600}.size-large .ticket-legend{gap:20px}.size-large .legend-color{width:20px;height:20px}.size-large .legend-item{font-size:14px}@media (max-width: 576px){.grid-controls{flex-direction:column;align-items:stretch}.ticket-search{max-width:100%}.ticket-legend{justify-content:center}}\n"] }]
|
|
490
|
+
}], propDecorators: { props: [{
|
|
491
|
+
type: Input
|
|
492
|
+
}], selectionChange: [{
|
|
493
|
+
type: Output
|
|
494
|
+
}], ticketClick: [{
|
|
495
|
+
type: Output
|
|
496
|
+
}] } });
|
|
497
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy90aWNrZXQtZ3JpZC90aWNrZXQtZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3BGLE9BQU8sRUFPTCxxQkFBcUIsR0FDdEIsTUFBTSxTQUFTLENBQUM7O0FBRWpCLFFBQVEsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7QUE0RzdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQTdJaEM7UUFnSlksb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUMvRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBRWpFLFlBQU8sR0FBaUIsRUFBRSxDQUFDO1FBQzNCLHFCQUFnQixHQUFpQixFQUFFLENBQUM7UUFDcEMsb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFDL0IsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQix1QkFB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QUssQ0FBQyxZQUFZLEVBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksV0FBVyxDQUM1QyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxXQUFXLENBQUM7SUFDckQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsT0FBTyxtQkFBbUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTywwQkFBMEIsQ0FBQztJQUNwQyxDQUFDOytHQTVSVSxtQkFBbUI7bUdBQW5CLG1CQUFtQix5TUF6SXBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtR1QsOHRIQXBHUyxZQUFZLDhCQUFFLFdBQVcsK0JBQUUsU0FBUyxvUEFBRSxPQUFPLDJKQUFFLFlBQVk7OzRGQTBJMUQsbUJBQW1CO2tCQTdJL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLFlBQzVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtR1Q7OEJBdUNRLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uLCBJb25TZWFyY2hiYXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgc2h1ZmZsZU91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBMYW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvbGFuZy1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFRpY2tldEdyaWRNZXRhZGF0YSxcbiAgVGlja2V0R3JpZFNlbGVjdGlvbkV2ZW50LFxuICBUaWNrZXRHcmlkQ2xpY2tFdmVudCxcbiAgVGlja2V0U3RhdHVzLFxuICBUaWNrZXREYXRhLFxuICBUaWNrZXRHcmlkTGVnZW5kSXRlbSxcbiAgREVGQVVMVF9MRUdFTkRfTEFCRUxTLFxufSBmcm9tICcuL3R5cGVzJztcblxuYWRkSWNvbnMoeyBzaHVmZmxlT3V0bGluZSB9KTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXRpY2tldC1ncmlkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElvbkJ1dHRvbiwgSW9uSWNvbiwgSW9uU2VhcmNoYmFyXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRpY2tldC1ncmlkLWNvbnRhaW5lclwiXG4gICAgICBbY2xhc3NdPVwicHJvcHMuY3NzQ2xhc3NcIlxuICAgICAgW2NsYXNzLnNpemUtc21hbGxdPVwicHJvcHMudGlja2V0U2l6ZSA9PT0gJ3NtYWxsJ1wiXG4gICAgICBbY2xhc3Muc2l6ZS1tZWRpdW1dPVwicHJvcHMudGlja2V0U2l6ZSA9PT0gJ21lZGl1bScgfHwgIXByb3BzLnRpY2tldFNpemVcIlxuICAgICAgW2NsYXNzLnNpemUtbGFyZ2VdPVwicHJvcHMudGlja2V0U2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICBbc3R5bGUuLS1ncmlkLWNvbHVtbnNdPVwicHJvcHMuY29sdW1ucyB8fCAxMFwiXG4gICAgICBbc3R5bGUuLS1ncmlkLWdhcF09XCIocHJvcHMuZ2FwIHx8IDQpICsgJ3B4J1wiXG4gICAgICBbc3R5bGUuLS1zZWxlY3RlZC1jb2xvcl09XCJnZXRDb2xvcigpXCJcbiAgICA+XG4gICAgICA8IS0tIFNlYXJjaCBhbmQgY29udHJvbHMgLS0+XG4gICAgICBAaWYgKHByb3BzLnNob3dTZWFyY2ggfHwgcHJvcHMuc2hvd1JhbmRvbVNlbGVjdCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1jb250cm9sc1wiPlxuICAgICAgICAgIEBpZiAocHJvcHMuc2hvd1NlYXJjaCkge1xuICAgICAgICAgICAgPGlvbi1zZWFyY2hiYXJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFNlYXJjaFBsYWNlaG9sZGVyKClcIlxuICAgICAgICAgICAgICBbZGVib3VuY2VdPVwiMzAwXCJcbiAgICAgICAgICAgICAgKGlvbklucHV0KT1cIm9uU2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cInRpY2tldC1zZWFyY2hcIlxuICAgICAgICAgICAgPjwvaW9uLXNlYXJjaGJhcj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKHByb3BzLnNob3dSYW5kb21TZWxlY3QgJiYgcHJvcHMuc2VsZWN0aW9uTW9kZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBmaWxsPVwib3V0bGluZVwiXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJwcm9wcy5jb2xvciB8fCAncHJpbWFyeSdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UmFuZG9tKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYXZhaWxhYmxlQ291bnQgPCAocHJvcHMucmFuZG9tU2VsZWN0Q291bnQgfHwgMSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgbmFtZT1cInNodWZmbGUtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgIHt7IGdldFJhbmRvbVNlbGVjdExhYmVsKCkgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIExlZ2VuZCAodG9wKSAtLT5cbiAgICAgIEBpZiAocHJvcHMuc2hvd0xlZ2VuZCAmJiBwcm9wcy5sZWdlbmRQb3NpdGlvbiAhPT0gJ2JvdHRvbScpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpY2tldC1sZWdlbmRcIj5cbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGdldExlZ2VuZEl0ZW1zKCk7IHRyYWNrIGl0ZW0uc3RhdHVzKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsZWdlbmQtY29sb3JcIiBbY2xhc3NdPVwiJ3N0YXR1cy0nICsgaXRlbS5zdGF0dXNcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGVnZW5kLWxhYmVsXCI+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgQGlmIChpdGVtLmNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxlZ2VuZC1jb3VudFwiPih7eyBpdGVtLmNvdW50IH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBTdW1tYXJ5IC0tPlxuICAgICAgQGlmIChwcm9wcy5zaG93U3VtbWFyeSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidGlja2V0LXN1bW1hcnlcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktaXRlbVwiPlxuICAgICAgICAgICAgPHN0cm9uZz57eyBzZWxlY3RlZFRpY2tldHMubGVuZ3RoIH19PC9zdHJvbmc+IHNlbGVjY2lvbmFkb3t7IHNlbGVjdGVkVGlja2V0cy5sZW5ndGggIT09IDEgPyAncycgOiAnJyB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICBAaWYgKHByb3BzLm1heFNlbGVjdGlvbikge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LWl0ZW1cIj5cbiAgICAgICAgICAgICAgKG3DoXg6IHt7IHByb3BzLm1heFNlbGVjdGlvbiB9fSlcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIEdyaWQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGlja2V0LWdyaWRcIiByb2xlPVwiZ3JpZFwiPlxuICAgICAgICBAZm9yICh0aWNrZXQgb2YgZGlzcGxheWVkVGlja2V0czsgdHJhY2sgdGlja2V0Lm51bWJlcikge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ0aWNrZXQtY2VsbFwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiJ3N0YXR1cy0nICsgdGlja2V0LnN0YXR1c1wiXG4gICAgICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0ZWRdPVwiaXNIaWdobGlnaHRlZCh0aWNrZXQubnVtYmVyKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzU2VsZWN0YWJsZSh0aWNrZXQpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0VGlja2V0QXJpYUxhYmVsKHRpY2tldClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInRpY2tldC5zdGF0dXMgPT09ICdzZWxlY3RlZCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVGlja2V0Q2xpY2sodGlja2V0KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZm9ybWF0TnVtYmVyKHRpY2tldC5udW1iZXIpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExlZ2VuZCAoYm90dG9tKSAtLT5cbiAgICAgIEBpZiAocHJvcHMuc2hvd0xlZ2VuZCAmJiBwcm9wcy5sZWdlbmRQb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpY2tldC1sZWdlbmQgYm90dG9tXCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBnZXRMZWdlbmRJdGVtcygpOyB0cmFjayBpdGVtLnN0YXR1cykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGVnZW5kLWNvbG9yXCIgW2NsYXNzXT1cIidzdGF0dXMtJyArIGl0ZW0uc3RhdHVzXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxlZ2VuZC1sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAoaXRlbS5jb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsZWdlbmQtY291bnRcIj4oe3sgaXRlbS5jb3VudCB9fSk8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL3RpY2tldC1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuLyoqXG4gKiB2YWwtdGlja2V0LWdyaWRcbiAqXG4gKiBBIGdyaWQgZm9yIHNlbGVjdGluZyB0aWNrZXQgbnVtYmVycywgY29tbW9ubHkgdXNlZCBpbiByYWZmbGVzIGFuZCBsb3R0ZXJpZXMuXG4gKlxuICogQGV4YW1wbGUgQmFzaWMgdXNhZ2VcbiAqIGBgYGh0bWxcbiAqIDx2YWwtdGlja2V0LWdyaWRcbiAqICAgW3Byb3BzXT1cIntcbiAqICAgICB0b3RhbFRpY2tldHM6IDEwMCxcbiAqICAgICBzb2xkVGlja2V0czogWzEsIDUsIDEyLCAyM10sXG4gKiAgICAgc2VsZWN0aW9uTW9kZTogJ211bHRpcGxlJyxcbiAqICAgICBtYXhTZWxlY3Rpb246IDEwXG4gKiAgIH1cIlxuICogICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICogPjwvdmFsLXRpY2tldC1ncmlkPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgV2l0aCBsZWdlbmQgYW5kIHNlYXJjaFxuICogYGBgaHRtbFxuICogPHZhbC10aWNrZXQtZ3JpZFxuICogICBbcHJvcHNdPVwie1xuICogICAgIHRvdGFsVGlja2V0czogNTAwLFxuICogICAgIHNvbGRUaWNrZXRzOiBzb2xkTnVtYmVycyxcbiAqICAgICByZXNlcnZlZFRpY2tldHM6IHJlc2VydmVkTnVtYmVycyxcbiAqICAgICBjb2x1bW5zOiAyMCxcbiAqICAgICBzaG93TGVnZW5kOiB0cnVlLFxuICogICAgIHNob3dTZWFyY2g6IHRydWUsXG4gKiAgICAgc2hvd1JhbmRvbVNlbGVjdDogdHJ1ZSxcbiAqICAgICByYW5kb21TZWxlY3RDb3VudDogNSxcbiAqICAgICBtYXhTZWxlY3Rpb246IDEwXG4gKiAgIH1cIlxuICogPjwvdmFsLXRpY2tldC1ncmlkPlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUaWNrZXRHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBwcm9wczogVGlja2V0R3JpZE1ldGFkYXRhO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRpY2tldEdyaWRTZWxlY3Rpb25FdmVudD4oKTtcbiAgQE91dHB1dCgpIHRpY2tldENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxUaWNrZXRHcmlkQ2xpY2tFdmVudD4oKTtcblxuICB0aWNrZXRzOiBUaWNrZXREYXRhW10gPSBbXTtcbiAgZGlzcGxheWVkVGlja2V0czogVGlja2V0RGF0YVtdID0gW107XG4gIHNlbGVjdGVkVGlja2V0czogbnVtYmVyW10gPSBbXTtcbiAgc2VhcmNoVGVybSA9ICcnO1xuICBoaWdobGlnaHRlZE51bWJlcnM6IG51bWJlcltdID0gW107XG5cbiAgcHJpdmF0ZSBsYW5nU2VydmljZSA9IGluamVjdChMYW5nU2VydmljZSk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZFRpY2tldHMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXSkge1xuICAgICAgdGhpcy5idWlsZFRpY2tldHMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGlja2V0cygpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMucHJvcHMuc3RhcnROdW1iZXIgPz8gMTtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMucHJvcHMudG90YWxUaWNrZXRzO1xuICAgIGNvbnN0IHNvbGRTZXQgPSBuZXcgU2V0KHRoaXMucHJvcHMuc29sZFRpY2tldHMgfHwgW10pO1xuICAgIGNvbnN0IHJlc2VydmVkU2V0ID0gbmV3IFNldCh0aGlzLnByb3BzLnJlc2VydmVkVGlja2V0cyB8fCBbXSk7XG4gICAgY29uc3QgZGlzYWJsZWRTZXQgPSBuZXcgU2V0KHRoaXMucHJvcHMuZGlzYWJsZWRUaWNrZXRzIHx8IFtdKTtcbiAgICBjb25zdCBzZWxlY3RlZFNldCA9IG5ldyBTZXQodGhpcy5wcm9wcy5zZWxlY3RlZFRpY2tldHMgfHwgW10pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZWxlY3RlZCB0aWNrZXRzIGZyb20gcHJvcHNcbiAgICB0aGlzLnNlbGVjdGVkVGlja2V0cyA9IFsuLi4odGhpcy5wcm9wcy5zZWxlY3RlZFRpY2tldHMgfHwgW10pXTtcblxuICAgIC8vIEJ1aWxkIHRpY2tldCBhcnJheVxuICAgIGlmICh0aGlzLnByb3BzLnRpY2tldERhdGE/Lmxlbmd0aCkge1xuICAgICAgLy8gVXNlIGN1c3RvbSB0aWNrZXQgZGF0YVxuICAgICAgdGhpcy50aWNrZXRzID0gWy4uLnRoaXMucHJvcHMudGlja2V0RGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEdlbmVyYXRlIGZyb20gbnVtYmVyc1xuICAgICAgdGhpcy50aWNrZXRzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIHRvdGFsOyBpKyspIHtcbiAgICAgICAgbGV0IHN0YXR1czogVGlja2V0U3RhdHVzID0gJ2F2YWlsYWJsZSc7XG5cbiAgICAgICAgaWYgKGRpc2FibGVkU2V0LmhhcyhpKSkge1xuICAgICAgICAgIHN0YXR1cyA9ICdkaXNhYmxlZCc7XG4gICAgICAgIH0gZWxzZSBpZiAoc29sZFNldC5oYXMoaSkpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnc29sZCc7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzZXJ2ZWRTZXQuaGFzKGkpKSB7XG4gICAgICAgICAgc3RhdHVzID0gJ3Jlc2VydmVkJztcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFNldC5oYXMoaSkpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnc2VsZWN0ZWQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aWNrZXRzLnB1c2goeyBudW1iZXI6IGksIHN0YXR1cyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFwcGx5U2VhcmNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2VhcmNoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFyY2hUZXJtKSB7XG4gICAgICB0aGlzLmRpc3BsYXllZFRpY2tldHMgPSBbLi4udGhpcy50aWNrZXRzXTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWROdW1iZXJzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbHRlci9oaWdobGlnaHQgdGlja2V0cyBtYXRjaGluZyBzZWFyY2hcbiAgICAgIGNvbnN0IHRlcm0gPSB0aGlzLnNlYXJjaFRlcm0udHJpbSgpO1xuICAgICAgdGhpcy5oaWdobGlnaHRlZE51bWJlcnMgPSB0aGlzLnRpY2tldHNcbiAgICAgICAgLmZpbHRlcih0ID0+IHRoaXMuZm9ybWF0TnVtYmVyKHQubnVtYmVyKS5pbmNsdWRlcyh0ZXJtKSlcbiAgICAgICAgLm1hcCh0ID0+IHQubnVtYmVyKTtcbiAgICAgIHRoaXMuZGlzcGxheWVkVGlja2V0cyA9IFsuLi50aGlzLnRpY2tldHNdO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoKGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVGVybSA9IGV2ZW50LmRldGFpbC52YWx1ZSB8fCAnJztcbiAgICB0aGlzLmFwcGx5U2VhcmNoKCk7XG4gIH1cblxuICBpc0hpZ2hsaWdodGVkKG51bWJlcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWROdW1iZXJzLmluY2x1ZGVzKG51bWJlcik7XG4gIH1cblxuICBpc1NlbGVjdGFibGUodGlja2V0OiBUaWNrZXREYXRhKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2VsZWN0aW9uTW9kZSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiBzb2xkL3Jlc2VydmVkIGFuZCBhZG1pbiBvdmVycmlkZVxuICAgIGlmICh0aWNrZXQuc3RhdHVzID09PSAnc29sZCcgfHwgdGlja2V0LnN0YXR1cyA9PT0gJ3Jlc2VydmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuYWxsb3dTZWxlY3RTb2xkID09PSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aWNrZXQuc3RhdHVzID09PSAnZGlzYWJsZWQnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBtYXggc2VsZWN0aW9uXG4gICAgaWYgKFxuICAgICAgdGlja2V0LnN0YXR1cyAhPT0gJ3NlbGVjdGVkJyAmJlxuICAgICAgdGhpcy5wcm9wcy5tYXhTZWxlY3Rpb24gJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaWNrZXRzLmxlbmd0aCA+PSB0aGlzLnByb3BzLm1heFNlbGVjdGlvblxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25UaWNrZXRDbGljayh0aWNrZXQ6IFRpY2tldERhdGEpOiB2b2lkIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFRpY2tldHMuaW5jbHVkZXModGlja2V0Lm51bWJlcik7XG5cbiAgICAvLyBFbWl0IGNsaWNrIGV2ZW50IHJlZ2FyZGxlc3NcbiAgICB0aGlzLnRpY2tldENsaWNrLmVtaXQoe1xuICAgICAgbnVtYmVyOiB0aWNrZXQubnVtYmVyLFxuICAgICAgc3RhdHVzOiB0aWNrZXQuc3RhdHVzLFxuICAgICAgc2VsZWN0ZWQ6IHRoaXMuaXNTZWxlY3RhYmxlKHRpY2tldCkgPyAhaXNTZWxlY3RlZCA6IG51bGwsXG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMuaXNTZWxlY3RhYmxlKHRpY2tldCkgJiYgdGlja2V0LnN0YXR1cyAhPT0gJ3NlbGVjdGVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3Rpb25cbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgLy8gRGVzZWxlY3RcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaWNrZXRzID0gdGhpcy5zZWxlY3RlZFRpY2tldHMuZmlsdGVyKG4gPT4gbiAhPT0gdGlja2V0Lm51bWJlcik7XG4gICAgICB0aWNrZXQuc3RhdHVzID0gJ2F2YWlsYWJsZSc7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAgICBzZWxlY3RlZFRpY2tldHM6IFsuLi50aGlzLnNlbGVjdGVkVGlja2V0c10sXG4gICAgICAgIGNoYW5nZWRUaWNrZXQ6IHRpY2tldC5udW1iZXIsXG4gICAgICAgIGFjdGlvbjogJ2Rlc2VsZWN0JyxcbiAgICAgICAgY291bnQ6IHRoaXMuc2VsZWN0ZWRUaWNrZXRzLmxlbmd0aCxcbiAgICAgICAgbWF4UmVhY2hlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VsZWN0XG4gICAgICBpZiAodGhpcy5wcm9wcy5zZWxlY3Rpb25Nb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgICAvLyBEZXNlbGVjdCBwcmV2aW91c1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGlja2V0cy5mb3JFYWNoKG51bSA9PiB7XG4gICAgICAgICAgY29uc3QgdCA9IHRoaXMudGlja2V0cy5maW5kKHggPT4geC5udW1iZXIgPT09IG51bSk7XG4gICAgICAgICAgaWYgKHQpIHQuc3RhdHVzID0gJ2F2YWlsYWJsZSc7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGlja2V0cyA9IFt0aWNrZXQubnVtYmVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaWNrZXRzLnB1c2godGlja2V0Lm51bWJlcik7XG4gICAgICB9XG5cbiAgICAgIHRpY2tldC5zdGF0dXMgPSAnc2VsZWN0ZWQnO1xuXG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgc2VsZWN0ZWRUaWNrZXRzOiBbLi4udGhpcy5zZWxlY3RlZFRpY2tldHNdLFxuICAgICAgICBjaGFuZ2VkVGlja2V0OiB0aWNrZXQubnVtYmVyLFxuICAgICAgICBhY3Rpb246ICdzZWxlY3QnLFxuICAgICAgICBjb3VudDogdGhpcy5zZWxlY3RlZFRpY2tldHMubGVuZ3RoLFxuICAgICAgICBtYXhSZWFjaGVkOiB0aGlzLnByb3BzLm1heFNlbGVjdGlvblxuICAgICAgICAgID8gdGhpcy5zZWxlY3RlZFRpY2tldHMubGVuZ3RoID49IHRoaXMucHJvcHMubWF4U2VsZWN0aW9uXG4gICAgICAgICAgOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdFJhbmRvbSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucHJvcHMucmFuZG9tU2VsZWN0Q291bnQgfHwgMTtcbiAgICBjb25zdCBhdmFpbGFibGUgPSB0aGlzLnRpY2tldHMuZmlsdGVyKFxuICAgICAgdCA9PiB0LnN0YXR1cyA9PT0gJ2F2YWlsYWJsZScgJiYgIXRoaXMuc2VsZWN0ZWRUaWNrZXRzLmluY2x1ZGVzKHQubnVtYmVyKVxuICAgICk7XG5cbiAgICAvLyBEZXRlcm1pbmUgaG93IG1hbnkgd2UgY2FuIHNlbGVjdFxuICAgIGNvbnN0IG1heENhblNlbGVjdCA9IHRoaXMucHJvcHMubWF4U2VsZWN0aW9uXG4gICAgICA/IE1hdGgubWluKGNvdW50LCB0aGlzLnByb3BzLm1heFNlbGVjdGlvbiAtIHRoaXMuc2VsZWN0ZWRUaWNrZXRzLmxlbmd0aClcbiAgICAgIDogY291bnQ7XG5cbiAgICBpZiAoYXZhaWxhYmxlLmxlbmd0aCA9PT0gMCB8fCBtYXhDYW5TZWxlY3QgPD0gMCkgcmV0dXJuO1xuXG4gICAgLy8gUmFuZG9tIHNodWZmbGUgYW5kIHBpY2tcbiAgICBjb25zdCBzaHVmZmxlZCA9IFsuLi5hdmFpbGFibGVdLnNvcnQoKCkgPT4gTWF0aC5yYW5kb20oKSAtIDAuNSk7XG4gICAgY29uc3QgdG9TZWxlY3QgPSBzaHVmZmxlZC5zbGljZSgwLCBNYXRoLm1pbihtYXhDYW5TZWxlY3QsIGF2YWlsYWJsZS5sZW5ndGgpKTtcblxuICAgIHRvU2VsZWN0LmZvckVhY2godGlja2V0ID0+IHtcbiAgICAgIHRpY2tldC5zdGF0dXMgPSAnc2VsZWN0ZWQnO1xuICAgICAgdGhpcy5zZWxlY3RlZFRpY2tldHMucHVzaCh0aWNrZXQubnVtYmVyKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAgc2VsZWN0ZWRUaWNrZXRzOiBbLi4udGhpcy5zZWxlY3RlZFRpY2tldHNdLFxuICAgICAgY2hhbmdlZFRpY2tldDogdG9TZWxlY3RbdG9TZWxlY3QubGVuZ3RoIC0gMV0ubnVtYmVyLFxuICAgICAgYWN0aW9uOiAnc2VsZWN0JyxcbiAgICAgIGNvdW50OiB0aGlzLnNlbGVjdGVkVGlja2V0cy5sZW5ndGgsXG4gICAgICBtYXhSZWFjaGVkOiB0aGlzLnByb3BzLm1heFNlbGVjdGlvblxuICAgICAgICA/IHRoaXMuc2VsZWN0ZWRUaWNrZXRzLmxlbmd0aCA+PSB0aGlzLnByb3BzLm1heFNlbGVjdGlvblxuICAgICAgICA6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBzZWxlY3Rpb25zLlxuICAgKi9cbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFRpY2tldHMuZm9yRWFjaChudW0gPT4ge1xuICAgICAgY29uc3QgdGlja2V0ID0gdGhpcy50aWNrZXRzLmZpbmQodCA9PiB0Lm51bWJlciA9PT0gbnVtKTtcbiAgICAgIGlmICh0aWNrZXQpIHRpY2tldC5zdGF0dXMgPSAnYXZhaWxhYmxlJztcbiAgICB9KTtcbiAgICB0aGlzLnNlbGVjdGVkVGlja2V0cyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZWxlY3RlZCB0aWNrZXQgbnVtYmVycy5cbiAgICovXG4gIGdldFNlbGVjdGVkVGlja2V0cygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnNlbGVjdGVkVGlja2V0c107XG4gIH1cblxuICBnZXQgYXZhaWxhYmxlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50aWNrZXRzLmZpbHRlcih0ID0+IHQuc3RhdHVzID09PSAnYXZhaWxhYmxlJykubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IHNvbGRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRpY2tldHMuZmlsdGVyKHQgPT4gdC5zdGF0dXMgPT09ICdzb2xkJykubGVuZ3RoO1xuICB9XG5cbiAgZ2V0TGVnZW5kSXRlbXMoKTogVGlja2V0R3JpZExlZ2VuZEl0ZW1bXSB7XG4gICAgaWYgKHRoaXMucHJvcHMubGVnZW5kSXRlbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmxlZ2VuZEl0ZW1zO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zOiBUaWNrZXRHcmlkTGVnZW5kSXRlbVtdID0gW1xuICAgICAgeyBzdGF0dXM6ICdhdmFpbGFibGUnLCBsYWJlbDogREVGQVVMVF9MRUdFTkRfTEFCRUxTLmF2YWlsYWJsZSwgY291bnQ6IHRoaXMuYXZhaWxhYmxlQ291bnQgfSxcbiAgICAgIHsgc3RhdHVzOiAnc2VsZWN0ZWQnLCBsYWJlbDogREVGQVVMVF9MRUdFTkRfTEFCRUxTLnNlbGVjdGVkLCBjb3VudDogdGhpcy5zZWxlY3RlZFRpY2tldHMubGVuZ3RoIH0sXG4gICAgXTtcblxuICAgIGlmICh0aGlzLnByb3BzLnNvbGRUaWNrZXRzPy5sZW5ndGgpIHtcbiAgICAgIGl0ZW1zLnB1c2goeyBzdGF0dXM6ICdzb2xkJywgbGFiZWw6IERFRkFVTFRfTEVHRU5EX0xBQkVMUy5zb2xkLCBjb3VudDogdGhpcy5zb2xkQ291bnQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMucmVzZXJ2ZWRUaWNrZXRzPy5sZW5ndGgpIHtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBzdGF0dXM6ICdyZXNlcnZlZCcsXG4gICAgICAgIGxhYmVsOiBERUZBVUxUX0xFR0VORF9MQUJFTFMucmVzZXJ2ZWQsXG4gICAgICAgIGNvdW50OiB0aGlzLnByb3BzLnJlc2VydmVkVGlja2V0cy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBmb3JtYXROdW1iZXIobnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnByb3BzLm51bWJlclBhZGRpbmcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcobnVtKS5wYWRTdGFydCh0aGlzLnByb3BzLm51bWJlclBhZGRpbmcsICcwJyk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcobnVtKTtcbiAgfVxuXG4gIGdldFRpY2tldEFyaWFMYWJlbCh0aWNrZXQ6IFRpY2tldERhdGEpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YXR1c0xhYmVsID0gREVGQVVMVF9MRUdFTkRfTEFCRUxTW3RpY2tldC5zdGF0dXNdO1xuICAgIHJldHVybiBgQm9sZXRvICR7dGhpcy5mb3JtYXROdW1iZXIodGlja2V0Lm51bWJlcil9LCAke3N0YXR1c0xhYmVsfWA7XG4gIH1cblxuICBnZXRTZWFyY2hQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnByb3BzLnNlYXJjaFBsYWNlaG9sZGVyQ29udGVudEtleSAmJiB0aGlzLnByb3BzLmNvbnRlbnRDbGFzcykge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dChcbiAgICAgICAgdGhpcy5wcm9wcy5jb250ZW50Q2xhc3MsXG4gICAgICAgIHRoaXMucHJvcHMuc2VhcmNoUGxhY2Vob2xkZXJDb250ZW50S2V5LFxuICAgICAgICB0aGlzLnByb3BzLnNlYXJjaFBsYWNlaG9sZGVyIHx8ICdCdXNjYXIgbsO6bWVyby4uLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb3BzLnNlYXJjaFBsYWNlaG9sZGVyIHx8ICdCdXNjYXIgbsO6bWVyby4uLic7XG4gIH1cblxuICBnZXRSYW5kb21TZWxlY3RMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnByb3BzLnJhbmRvbVNlbGVjdExhYmVsQ29udGVudEtleSAmJiB0aGlzLnByb3BzLmNvbnRlbnRDbGFzcykge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dChcbiAgICAgICAgdGhpcy5wcm9wcy5jb250ZW50Q2xhc3MsXG4gICAgICAgIHRoaXMucHJvcHMucmFuZG9tU2VsZWN0TGFiZWxDb250ZW50S2V5LFxuICAgICAgICB0aGlzLnByb3BzLnJhbmRvbVNlbGVjdExhYmVsIHx8ICdBbGVhdG9yaW8nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5yYW5kb21TZWxlY3RMYWJlbCB8fCAnQWxlYXRvcmlvJztcbiAgfVxuXG4gIGdldENvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucHJvcHMuY29sb3IpIHtcbiAgICAgIHJldHVybiBgdmFyKC0taW9uLWNvbG9yLSR7dGhpcy5wcm9wcy5jb2xvcn0pYDtcbiAgICB9XG4gICAgcmV0dXJuICd2YXIoLS1pb24tY29sb3ItcHJpbWFyeSknO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default legend labels in Spanish.
|
|
3
|
+
*/
|
|
4
|
+
export const DEFAULT_LEGEND_LABELS = {
|
|
5
|
+
available: 'Disponible',
|
|
6
|
+
sold: 'Vendido',
|
|
7
|
+
reserved: 'Reservado',
|
|
8
|
+
selected: 'Seleccionado',
|
|
9
|
+
disabled: 'No disponible',
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL3RpY2tldC1ncmlkL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVJQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFpQztJQUNqRSxTQUFTLEVBQUUsWUFBWTtJQUN2QixJQUFJLEVBQUUsU0FBUztJQUNmLFFBQVEsRUFBRSxXQUFXO0lBQ3JCLFFBQVEsRUFBRSxjQUFjO0lBQ3hCLFFBQVEsRUFBRSxlQUFlO0NBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2xvciB9IGZyb20gJ0Bpb25pYy9jb3JlJztcblxuLyoqXG4gKiBUaWNrZXQgc3RhdHVzIGluIHRoZSBncmlkLlxuICovXG5leHBvcnQgdHlwZSBUaWNrZXRTdGF0dXMgPSAnYXZhaWxhYmxlJyB8ICdzb2xkJyB8ICdyZXNlcnZlZCcgfCAnc2VsZWN0ZWQnIHwgJ2Rpc2FibGVkJztcblxuLyoqXG4gKiBJbmRpdmlkdWFsIHRpY2tldCBkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpY2tldERhdGEge1xuICAvKiogVGlja2V0IG51bWJlciAqL1xuICBudW1iZXI6IG51bWJlcjtcbiAgLyoqIFRpY2tldCBzdGF0dXMgKi9cbiAgc3RhdHVzOiBUaWNrZXRTdGF0dXM7XG4gIC8qKiBPcHRpb25hbCBvd25lciBuYW1lIChmb3Igc29sZCB0aWNrZXRzKSAqL1xuICBvd25lcj86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGN1c3RvbSBsYWJlbCAqL1xuICBsYWJlbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMZWdlbmQgaXRlbSBmb3IgdGlja2V0IGdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGlja2V0R3JpZExlZ2VuZEl0ZW0ge1xuICAvKiogU3RhdHVzIHRoaXMgbGVnZW5kIHJlcHJlc2VudHMgKi9cbiAgc3RhdHVzOiBUaWNrZXRTdGF0dXM7XG4gIC8qKiBEaXNwbGF5IGxhYmVsICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBjb3VudCAqL1xuICBjb3VudD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBmb3IgdGhlIHRpY2tldCBncmlkIGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaWNrZXRHcmlkTWV0YWRhdGEge1xuICAvKiogVG90YWwgbnVtYmVyIG9mIHRpY2tldHMgKi9cbiAgdG90YWxUaWNrZXRzOiBudW1iZXI7XG4gIC8qKiBTdGFydGluZyB0aWNrZXQgbnVtYmVyIChkZWZhdWx0OiAxKSAqL1xuICBzdGFydE51bWJlcj86IG51bWJlcjtcbiAgLyoqIE51bWJlcnMgb2Ygc29sZCB0aWNrZXRzICovXG4gIHNvbGRUaWNrZXRzPzogbnVtYmVyW107XG4gIC8qKiBOdW1iZXJzIG9mIHJlc2VydmVkIHRpY2tldHMgKi9cbiAgcmVzZXJ2ZWRUaWNrZXRzPzogbnVtYmVyW107XG4gIC8qKiBOdW1iZXJzIG9mIGRpc2FibGVkIHRpY2tldHMgKi9cbiAgZGlzYWJsZWRUaWNrZXRzPzogbnVtYmVyW107XG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgdGlja2V0cyAqL1xuICBzZWxlY3RlZFRpY2tldHM/OiBudW1iZXJbXTtcbiAgLyoqIEN1c3RvbSB0aWNrZXQgZGF0YSAob3ZlcnJpZGVzIGNvbXB1dGVkIHN0YXR1cykgKi9cbiAgdGlja2V0RGF0YT86IFRpY2tldERhdGFbXTtcblxuICAvLyA9PT0gU2VsZWN0aW9uID09PVxuICAvKiogU2VsZWN0aW9uIG1vZGUgKi9cbiAgc2VsZWN0aW9uTW9kZT86ICdzaW5nbGUnIHwgJ211bHRpcGxlJyB8ICdub25lJztcbiAgLyoqIE1heGltdW0gdGlja2V0cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCAqL1xuICBtYXhTZWxlY3Rpb24/OiBudW1iZXI7XG4gIC8qKiBNaW5pbXVtIHRpY2tldHMgcmVxdWlyZWQgKi9cbiAgbWluU2VsZWN0aW9uPzogbnVtYmVyO1xuICAvKiogQWxsb3cgc2VsZWN0aW5nIHNvbGQvcmVzZXJ2ZWQgdGlja2V0cyAoZm9yIGFkbWluKSAqL1xuICBhbGxvd1NlbGVjdFNvbGQ/OiBib29sZWFuO1xuXG4gIC8vID09PSBEaXNwbGF5ID09PVxuICAvKiogTnVtYmVyIG9mIGNvbHVtbnMgKi9cbiAgY29sdW1ucz86IG51bWJlcjtcbiAgLyoqIFNob3cgbGVnZW5kICovXG4gIHNob3dMZWdlbmQ/OiBib29sZWFuO1xuICAvKiogTGVnZW5kIHBvc2l0aW9uICovXG4gIGxlZ2VuZFBvc2l0aW9uPzogJ3RvcCcgfCAnYm90dG9tJztcbiAgLyoqIEN1c3RvbSBsZWdlbmQgaXRlbXMgKi9cbiAgbGVnZW5kSXRlbXM/OiBUaWNrZXRHcmlkTGVnZW5kSXRlbVtdO1xuICAvKiogU2hvdyB0aWNrZXQgY291bnQgc3VtbWFyeSAqL1xuICBzaG93U3VtbWFyeT86IGJvb2xlYW47XG4gIC8qKiBTaG93IHNlYXJjaC9maWx0ZXIgaW5wdXQgKi9cbiAgc2hvd1NlYXJjaD86IGJvb2xlYW47XG4gIC8qKiBTZWFyY2ggcGxhY2Vob2xkZXIgKi9cbiAgc2VhcmNoUGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKiBUaWNrZXQgbnVtYmVyIHBhZGRpbmcgKGUuZy4sIDMgPSBcIjAwMVwiKSAqL1xuICBudW1iZXJQYWRkaW5nPzogbnVtYmVyO1xuXG4gIC8vID09PSBTdHlsaW5nID09PVxuICAvKiogQ29tcG9uZW50IGNvbG9yIGZvciBzZWxlY3RlZCBzdGF0ZSAqL1xuICBjb2xvcj86IENvbG9yO1xuICAvKiogVGlja2V0IHNpemUgKi9cbiAgdGlja2V0U2l6ZT86ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZSc7XG4gIC8qKiBHcmlkIGdhcCAqL1xuICBnYXA/OiBudW1iZXI7XG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzICovXG4gIGNzc0NsYXNzPzogc3RyaW5nO1xuXG4gIC8vID09PSBRdWljayBzZWxlY3QgPT09XG4gIC8qKiBTaG93IHJhbmRvbSBzZWxlY3Rpb24gYnV0dG9uICovXG4gIHNob3dSYW5kb21TZWxlY3Q/OiBib29sZWFuO1xuICAvKiogUmFuZG9tIHNlbGVjdGlvbiBjb3VudCAqL1xuICByYW5kb21TZWxlY3RDb3VudD86IG51bWJlcjtcbiAgLyoqIFJhbmRvbSBzZWxlY3QgYnV0dG9uIGxhYmVsICovXG4gIHJhbmRvbVNlbGVjdExhYmVsPzogc3RyaW5nO1xuXG4gIC8vID09PSBSZWFjdGl2ZSBjb250ZW50ID09PVxuICAvKiogQ29udGVudCBrZXkgZm9yIHNlYXJjaCBwbGFjZWhvbGRlciAqL1xuICBzZWFyY2hQbGFjZWhvbGRlckNvbnRlbnRLZXk/OiBzdHJpbmc7XG4gIC8qKiBDb250ZW50IGtleSBmb3IgcmFuZG9tIHNlbGVjdCBsYWJlbCAqL1xuICByYW5kb21TZWxlY3RMYWJlbENvbnRlbnRLZXk/OiBzdHJpbmc7XG4gIC8qKiBDb250ZW50IGNsYXNzIGZvciByZWFjdGl2ZSBjb250ZW50ICovXG4gIGNvbnRlbnRDbGFzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBFdmVudCBlbWl0dGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGlja2V0R3JpZFNlbGVjdGlvbkV2ZW50IHtcbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCB0aWNrZXQgbnVtYmVycyAqL1xuICBzZWxlY3RlZFRpY2tldHM6IG51bWJlcltdO1xuICAvKiogTGFzdCBjaGFuZ2VkIHRpY2tldCBudW1iZXIgKi9cbiAgY2hhbmdlZFRpY2tldDogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGUgdGlja2V0IHdhcyBzZWxlY3RlZCBvciBkZXNlbGVjdGVkICovXG4gIGFjdGlvbjogJ3NlbGVjdCcgfCAnZGVzZWxlY3QnO1xuICAvKiogVG90YWwgY291bnQgb2Ygc2VsZWN0ZWQgdGlja2V0cyAqL1xuICBjb3VudDogbnVtYmVyO1xuICAvKiogV2hldGhlciBtYXggc2VsZWN0aW9uIHJlYWNoZWQgKi9cbiAgbWF4UmVhY2hlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFdmVudCBlbWl0dGVkIHdoZW4gYSB0aWNrZXQgaXMgY2xpY2tlZCAocmVnYXJkbGVzcyBvZiBzZWxlY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpY2tldEdyaWRDbGlja0V2ZW50IHtcbiAgLyoqIFRpY2tldCBudW1iZXIgKi9cbiAgbnVtYmVyOiBudW1iZXI7XG4gIC8qKiBUaWNrZXQgc3RhdHVzICovXG4gIHN0YXR1czogVGlja2V0U3RhdHVzO1xuICAvKiogV2hldGhlciBpdCB3YXMgc2VsZWN0ZWQvZGVzZWxlY3RlZCAobnVsbCBpZiBub3Qgc2VsZWN0YWJsZSkgKi9cbiAgc2VsZWN0ZWQ6IGJvb2xlYW4gfCBudWxsO1xufVxuXG4vKipcbiAqIERlZmF1bHQgbGVnZW5kIGxhYmVscyBpbiBTcGFuaXNoLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9MRUdFTkRfTEFCRUxTOiBSZWNvcmQ8VGlja2V0U3RhdHVzLCBzdHJpbmc+ID0ge1xuICBhdmFpbGFibGU6ICdEaXNwb25pYmxlJyxcbiAgc29sZDogJ1ZlbmRpZG8nLFxuICByZXNlcnZlZDogJ1Jlc2VydmFkbycsXG4gIHNlbGVjdGVkOiAnU2VsZWNjaW9uYWRvJyxcbiAgZGlzYWJsZWQ6ICdObyBkaXNwb25pYmxlJyxcbn07XG4iXX0=
|