@seniorsistemas/data-seniorx-core 2.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/constants/autocomplete.const.d.ts +4 -0
- package/core/constants/context-selector.const.d.ts +1 -0
- package/core/constants/gantt.const.d.ts +7 -0
- package/core/constants/hyperlink.const.d.ts +1 -0
- package/core/constants/inline-edit.const.d.ts +4 -0
- package/core/constants/kanban.const.d.ts +2 -0
- package/core/constants/pin-code-field.const.d.ts +5 -0
- package/core/constants/rating-scale.const.d.ts +1 -0
- package/core/constants/spotlight.const.d.ts +8 -0
- package/core/constants/star-rating.const.d.ts +4 -0
- package/core/constants/stepper.const.d.ts +1 -0
- package/core/constants/tiered-menu.const.d.ts +3 -0
- package/core/types/autocomplete.type.d.ts +9 -0
- package/core/types/chat.type.d.ts +12 -0
- package/core/types/checkbox-list.type.d.ts +12 -0
- package/core/types/gantt.type.d.ts +22 -0
- package/core/types/grid-menu.type.d.ts +13 -0
- package/core/types/hyperlink.type.d.ts +1 -0
- package/core/types/image-cropper.type.d.ts +20 -0
- package/core/types/inline-edit.type.d.ts +26 -0
- package/core/types/kanban.type.d.ts +36 -0
- package/core/types/panel.type.d.ts +16 -0
- package/core/types/profile-picture-picker.type.d.ts +9 -0
- package/core/types/rating-scale.type.d.ts +5 -0
- package/core/types/select-button.type.d.ts +1 -0
- package/core/types/spotlight.type.d.ts +34 -0
- package/core/types/star-rating.type.d.ts +1 -0
- package/core/types/stepper.type.d.ts +20 -0
- package/core/types/table-column.type.d.ts +3 -1
- package/core/types/table-options.type.d.ts +8 -2
- package/core/types/table.type.d.ts +1 -1
- package/core/types/tiered-menu.type.d.ts +16 -0
- package/core/types/tree.type.d.ts +25 -0
- package/core/types/workspace-switch.type.d.ts +6 -0
- package/core/utils/body-scroll.util.d.ts +2 -0
- package/core/utils/roving-focus.util.d.ts +2 -0
- package/core/utils/selection.util.d.ts +3 -0
- package/core/utils/tree.util.d.ts +4 -0
- package/esm2022/core/constants/autocomplete.const.mjs +5 -0
- package/esm2022/core/constants/context-selector.const.mjs +2 -0
- package/esm2022/core/constants/gantt.const.mjs +7 -0
- package/esm2022/core/constants/hyperlink.const.mjs +2 -1
- package/esm2022/core/constants/inline-edit.const.mjs +5 -0
- package/esm2022/core/constants/kanban.const.mjs +3 -0
- package/esm2022/core/constants/pin-code-field.const.mjs +6 -0
- package/esm2022/core/constants/rating-scale.const.mjs +2 -0
- package/esm2022/core/constants/spotlight.const.mjs +9 -0
- package/esm2022/core/constants/star-rating.const.mjs +5 -0
- package/esm2022/core/constants/stepper.const.mjs +2 -0
- package/esm2022/core/constants/table.const.mjs +2 -2
- package/esm2022/core/constants/tiered-menu.const.mjs +4 -0
- package/esm2022/core/types/autocomplete.type.mjs +2 -0
- package/esm2022/core/types/chat.type.mjs +2 -0
- package/esm2022/core/types/checkbox-list.type.mjs +2 -0
- package/esm2022/core/types/gantt.type.mjs +2 -0
- package/esm2022/core/types/grid-menu.type.mjs +2 -0
- package/esm2022/core/types/hyperlink.type.mjs +1 -1
- package/esm2022/core/types/image-cropper.type.mjs +2 -0
- package/esm2022/core/types/inline-edit.type.mjs +2 -0
- package/esm2022/core/types/kanban.type.mjs +2 -0
- package/esm2022/core/types/panel.type.mjs +9 -0
- package/esm2022/core/types/profile-picture-picker.type.mjs +2 -0
- package/esm2022/core/types/rating-scale.type.mjs +2 -0
- package/esm2022/core/types/select-button.type.mjs +1 -1
- package/esm2022/core/types/spotlight.type.mjs +2 -0
- package/esm2022/core/types/star-rating.type.mjs +2 -0
- package/esm2022/core/types/stepper.type.mjs +7 -0
- package/esm2022/core/types/table-column.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/table.type.mjs +1 -1
- package/esm2022/core/types/tiered-menu.type.mjs +2 -0
- package/esm2022/core/types/tree.type.mjs +2 -0
- package/esm2022/core/types/workspace-switch.type.mjs +2 -0
- package/esm2022/core/utils/body-scroll.util.mjs +19 -0
- package/esm2022/core/utils/combobox.util.mjs +3 -2
- package/esm2022/core/utils/roving-focus.util.mjs +20 -0
- package/esm2022/core/utils/selection.util.mjs +13 -0
- package/esm2022/core/utils/string.util.mjs +8 -3
- package/esm2022/core/utils/tree.util.mjs +23 -0
- package/esm2022/features/accordion/accordion.component.mjs +2 -2
- package/esm2022/features/accordion/{accordion-item.component.mjs → components/accordion-item/accordion-item.component.mjs} +7 -7
- package/esm2022/features/autocomplete/autocomplete.component.mjs +501 -0
- package/esm2022/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +30 -0
- package/esm2022/features/breadcrumb/breadcrumb.component.mjs +2 -2
- package/esm2022/features/card-list/card/card.component.mjs +63 -99
- package/esm2022/features/chat/chat.component.mjs +126 -0
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +125 -0
- package/esm2022/features/combobox/combobox.component.mjs +20 -8
- package/esm2022/features/context-selector/context-selector.component.mjs +198 -0
- package/esm2022/features/filters/filters.component.mjs +1 -1
- package/esm2022/features/gantt/components/gantt-side-table/gantt-side-table.component.mjs +17 -0
- package/esm2022/features/gantt/gantt-date.utils.mjs +97 -0
- package/esm2022/features/gantt/gantt.component.mjs +89 -0
- package/esm2022/features/gantt/gantt.engine.mjs +662 -0
- package/esm2022/features/grid-menu/grid-menu.component.mjs +104 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +7 -4
- package/esm2022/features/icon-picker/icon-picker.component.mjs +3 -3
- package/esm2022/features/image-cropper/image-cropper.component.mjs +218 -0
- package/esm2022/features/image-cropper/services/image-cropper.service.mjs +50 -0
- package/esm2022/features/infinite-scroll/infinite-scroll.directive.mjs +89 -0
- package/esm2022/features/info-sign/info-sign.component.mjs +3 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +38 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.mjs +29 -0
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +131 -0
- package/esm2022/features/inline-edit/fields/inline-edit-field.mjs +17 -0
- package/esm2022/features/inline-edit/fields/inline-edit-number-field.mjs +15 -0
- package/esm2022/features/inline-edit/fields/inline-edit-text-field.mjs +11 -0
- package/esm2022/features/inline-edit/fields/inline-edit-textarea-field.mjs +15 -0
- package/esm2022/features/inline-edit/inline-edit.component.mjs +27 -0
- package/esm2022/features/interactive-content/interactive-content.directive.mjs +140 -0
- package/esm2022/features/kanban/components/kanban-column/kanban-column.component.mjs +88 -0
- package/esm2022/features/kanban/components/kanban-item/kanban-item.component.mjs +72 -0
- package/esm2022/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.mjs +19 -0
- package/esm2022/features/kanban/directives/kanban-template.directive.mjs +22 -0
- package/esm2022/features/kanban/kanban.component.mjs +198 -0
- package/esm2022/features/kanban/services/kanban-event.service.mjs +27 -0
- package/esm2022/features/loading-state/loading-state.component.mjs +3 -62
- package/esm2022/features/mouse-events/directives/double-click.directive.mjs +34 -0
- package/esm2022/features/mouse-events/directives/long-press.directive.mjs +61 -0
- package/esm2022/features/paginator/paginator.component.mjs +8 -3
- package/esm2022/features/panel/panel.component.mjs +43 -11
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +234 -0
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +330 -0
- package/esm2022/features/rating-scale/rating-scale.component.mjs +86 -0
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +3 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +4 -6
- package/esm2022/features/select-button/select-button.component.mjs +7 -4
- package/esm2022/features/speech-recognition/services/speech-recognition.service.mjs +148 -0
- package/esm2022/features/speech-recognition/services/text-to-speech.service.mjs +88 -0
- package/esm2022/features/speech-recognition/speech-recognition.component.mjs +243 -0
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +521 -0
- package/esm2022/features/spotlight/directives/spotlight-step.directive.mjs +38 -0
- package/esm2022/features/spotlight/services/spotlight-tour.service.mjs +179 -0
- package/esm2022/features/spotlight/spotlight.component.mjs +160 -0
- package/esm2022/features/star-rating/star-rating.component.mjs +95 -0
- package/esm2022/features/stepper/stepper.component.mjs +86 -0
- package/esm2022/features/switch/switch.component.mjs +12 -8
- package/esm2022/features/tab/{tab-item.component.mjs → components/tab-item/tab-item.component.mjs} +1 -1
- package/esm2022/features/tab/tab.component.mjs +4 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +14 -5
- package/esm2022/features/table/table.component.mjs +220 -29
- package/esm2022/features/table/utils/table-data.util.mjs +71 -8
- package/esm2022/features/table/utils/table-layout.util.mjs +21 -1
- package/esm2022/features/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +367 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.mjs +11 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +97 -0
- package/esm2022/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +181 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +246 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.event.service.mjs +16 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.global.service.mjs +12 -0
- package/esm2022/features/tiered-menu/services/tiered-menu.service.mjs +49 -0
- package/esm2022/features/tree/components/tree-node-item/tree-node-item.component.mjs +169 -0
- package/esm2022/features/tree/tree.component.mjs +211 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.mjs +41 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.mjs +38 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.mjs +29 -0
- package/esm2022/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.mjs +35 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-flow.service.mjs +106 -0
- package/esm2022/features/visual-sql-editor/services/visual-sql-editor-state.service.mjs +230 -0
- package/esm2022/features/visual-sql-editor/types/visual-sql-editor.types.mjs +2 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.mjs +72 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-sql.util.mjs +281 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor-text.util.mjs +37 -0
- package/esm2022/features/visual-sql-editor/utils/visual-sql-editor.constants.mjs +89 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +172 -630
- package/esm2022/locales/en.json +351 -3
- package/esm2022/locales/es-CO.json +351 -3
- package/esm2022/locales/pt.json +351 -3
- package/esm2022/providers/features.provider.mjs +40 -4
- package/esm2022/public-api.mjs +56 -3
- package/features/accordion/accordion.component.d.ts +1 -1
- package/features/accordion/{accordion-item.component.d.ts → components/accordion-item/accordion-item.component.d.ts} +1 -1
- package/features/autocomplete/autocomplete.component.d.ts +102 -0
- package/features/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +11 -0
- package/features/card-list/card/card.component.d.ts +14 -34
- package/features/chat/chat.component.d.ts +31 -0
- package/features/checkbox-list/checkbox-list.component.d.ts +26 -0
- package/features/combobox/combobox.component.d.ts +2 -1
- package/features/context-selector/context-selector.component.d.ts +37 -0
- package/features/gantt/components/gantt-side-table/gantt-side-table.component.d.ts +8 -0
- package/features/gantt/gantt-date.utils.d.ts +36 -0
- package/features/gantt/gantt.component.d.ts +24 -0
- package/features/gantt/gantt.engine.d.ts +52 -0
- package/features/grid-menu/grid-menu.component.d.ts +29 -0
- package/features/hyperlink/hyperlink.component.d.ts +2 -1
- package/features/image-cropper/image-cropper.component.d.ts +43 -0
- package/features/image-cropper/services/image-cropper.service.d.ts +13 -0
- package/features/infinite-scroll/infinite-scroll.directive.d.ts +25 -0
- package/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-text/inline-edit-text.component.d.ts +13 -0
- package/features/inline-edit/components/fields/inline-edit-textarea/inline-edit-textarea.component.d.ts +13 -0
- package/features/inline-edit/components/inline-edit-item/inline-edit-item.component.d.ts +37 -0
- package/features/inline-edit/fields/inline-edit-field.d.ts +12 -0
- package/features/inline-edit/fields/inline-edit-number-field.d.ts +9 -0
- package/features/inline-edit/fields/inline-edit-text-field.d.ts +7 -0
- package/features/inline-edit/fields/inline-edit-textarea-field.d.ts +9 -0
- package/features/inline-edit/inline-edit.component.d.ts +13 -0
- package/features/interactive-content/interactive-content.directive.d.ts +31 -0
- package/features/kanban/components/kanban-column/kanban-column.component.d.ts +22 -0
- package/features/kanban/components/kanban-item/kanban-item.component.d.ts +23 -0
- package/features/kanban/components/kanban-item-dragging/kanban-item-dragging.component.d.ts +8 -0
- package/features/kanban/directives/kanban-template.directive.d.ts +10 -0
- package/features/kanban/kanban.component.d.ts +32 -0
- package/features/kanban/services/kanban-event.service.d.ts +15 -0
- package/features/loading-state/loading-state.component.d.ts +0 -2
- package/features/mouse-events/directives/double-click.directive.d.ts +11 -0
- package/features/mouse-events/directives/long-press.directive.d.ts +14 -0
- package/features/panel/panel.component.d.ts +12 -3
- package/features/pin-code-field/pin-code-field.component.d.ts +44 -0
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +77 -0
- package/features/rating-scale/rating-scale.component.d.ts +24 -0
- package/features/select-button/select-button.component.d.ts +2 -1
- package/features/speech-recognition/services/speech-recognition.service.d.ts +29 -0
- package/features/speech-recognition/services/text-to-speech.service.d.ts +24 -0
- package/features/speech-recognition/speech-recognition.component.d.ts +50 -0
- package/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.d.ts +59 -0
- package/features/spotlight/directives/spotlight-step.directive.d.ts +13 -0
- package/features/spotlight/services/spotlight-tour.service.d.ts +46 -0
- package/features/spotlight/spotlight.component.d.ts +59 -0
- package/features/star-rating/star-rating.component.d.ts +26 -0
- package/features/stepper/stepper.component.d.ts +23 -0
- package/features/switch/switch.component.d.ts +2 -1
- package/features/tab/tab.component.d.ts +1 -1
- package/features/table/components/table-cell-content.component.d.ts +4 -3
- package/features/table/table.component.d.ts +40 -5
- package/features/table/utils/table-data.util.d.ts +1 -0
- package/features/table/utils/table-layout.util.d.ts +1 -0
- package/features/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +49 -0
- package/features/tiered-menu/components/tiered-menu-divider/tiered-menu-divider.component.d.ts +5 -0
- package/features/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.d.ts +19 -0
- package/features/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +26 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +44 -0
- package/features/tiered-menu/services/tiered-menu.event.service.d.ts +13 -0
- package/features/tiered-menu/services/tiered-menu.global.service.d.ts +7 -0
- package/features/tiered-menu/services/tiered-menu.service.d.ts +14 -0
- package/features/tree/components/tree-node-item/tree-node-item.component.d.ts +37 -0
- package/features/tree/tree.component.d.ts +37 -0
- package/features/visual-sql-editor/components/visual-sql-editor-field-modal/visual-sql-editor-field-modal.component.d.ts +18 -0
- package/features/visual-sql-editor/components/visual-sql-editor-filter-modal/visual-sql-editor-filter-modal.component.d.ts +17 -0
- package/features/visual-sql-editor/components/visual-sql-editor-join-modal/visual-sql-editor-join-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-sort-modal/visual-sql-editor-sort-modal.component.d.ts +13 -0
- package/features/visual-sql-editor/components/visual-sql-editor-source-modal/visual-sql-editor-source-modal.component.d.ts +15 -0
- package/features/visual-sql-editor/services/visual-sql-editor-flow.service.d.ts +26 -0
- package/features/visual-sql-editor/services/visual-sql-editor-state.service.d.ts +72 -0
- package/features/visual-sql-editor/types/visual-sql-editor.types.d.ts +182 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sanitize.util.d.ts +14 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-sql.util.d.ts +81 -0
- package/features/visual-sql-editor/utils/visual-sql-editor-text.util.d.ts +15 -0
- package/features/visual-sql-editor/utils/visual-sql-editor.constants.d.ts +36 -0
- package/features/visual-sql-editor/visual-sql-editor.component.d.ts +37 -199
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +14883 -6353
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +8 -8
- package/public-api.d.ts +72 -2
- package/src/locales/en.json +353 -15
- package/src/locales/es-CO.json +352 -14
- package/src/locales/pt.json +352 -14
- package/styles/sdc-global-variables.scss +1 -1
- package/styles.css +1 -1
- /package/features/tab/{tab-item.component.d.ts → components/tab-item/tab-item.component.d.ts} +0 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
+
import { resolveTranslatableText } from '../../core/utils/i18n.util';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
const CHAT_EMPTY_LABEL_KEY = 'platform.datacore.chat.empty';
|
|
9
|
+
export class ChatComponent {
|
|
10
|
+
translate = inject(TranslateService);
|
|
11
|
+
cdr = inject(ChangeDetectorRef);
|
|
12
|
+
messageListElement;
|
|
13
|
+
messages = [];
|
|
14
|
+
autoScroll = true;
|
|
15
|
+
showAvatar = true;
|
|
16
|
+
showTimestamp = true;
|
|
17
|
+
emptyLabel;
|
|
18
|
+
attachmentOpened = new EventEmitter();
|
|
19
|
+
messageClicked = new EventEmitter();
|
|
20
|
+
set messageList(value) {
|
|
21
|
+
this.messageListElement = value;
|
|
22
|
+
this.scheduleAutoScroll();
|
|
23
|
+
}
|
|
24
|
+
get messageList() {
|
|
25
|
+
return this.messageListElement;
|
|
26
|
+
}
|
|
27
|
+
constructor() {
|
|
28
|
+
this.translate.onLangChange.pipe(takeUntilDestroyed()).subscribe(() => this.cdr.markForCheck());
|
|
29
|
+
}
|
|
30
|
+
ngOnChanges() {
|
|
31
|
+
this.scheduleAutoScroll();
|
|
32
|
+
}
|
|
33
|
+
trackByMessageId(_index, message) {
|
|
34
|
+
return message.id;
|
|
35
|
+
}
|
|
36
|
+
get resolvedEmptyLabel() {
|
|
37
|
+
return resolveTranslatableText(this.translate, this.emptyLabel, CHAT_EMPTY_LABEL_KEY);
|
|
38
|
+
}
|
|
39
|
+
get initials() {
|
|
40
|
+
return (message) => this.buildInitials(message.senderName);
|
|
41
|
+
}
|
|
42
|
+
handleMessageClick(message) {
|
|
43
|
+
this.messageClicked.emit(message);
|
|
44
|
+
}
|
|
45
|
+
handleAttachmentClick(message, event) {
|
|
46
|
+
event.stopPropagation();
|
|
47
|
+
this.attachmentOpened.emit(message);
|
|
48
|
+
}
|
|
49
|
+
resolveAttachmentLabel(message) {
|
|
50
|
+
return message.attachmentName?.trim()
|
|
51
|
+
?? this.translate.instant('platform.datacore.chat.attachment');
|
|
52
|
+
}
|
|
53
|
+
resolveStatusLabel(status) {
|
|
54
|
+
if (!status) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return this.translate.instant(`platform.datacore.chat.status.${status}`);
|
|
58
|
+
}
|
|
59
|
+
resolveTimestamp(sentAt) {
|
|
60
|
+
if (!sentAt) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const date = sentAt instanceof Date ? sentAt : new Date(sentAt);
|
|
64
|
+
if (Number.isNaN(date.getTime())) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const locale = resolveChatLocale(this.translate.currentLang);
|
|
68
|
+
return new Intl.DateTimeFormat(locale, {
|
|
69
|
+
day: '2-digit',
|
|
70
|
+
hour: '2-digit',
|
|
71
|
+
minute: '2-digit',
|
|
72
|
+
month: '2-digit'
|
|
73
|
+
}).format(date);
|
|
74
|
+
}
|
|
75
|
+
buildInitials(senderName) {
|
|
76
|
+
const parts = senderName.split(/\s+/).filter(Boolean);
|
|
77
|
+
const first = parts[0]?.charAt(0).toUpperCase() ?? '';
|
|
78
|
+
const last = parts.length > 1 ? parts[parts.length - 1]?.charAt(0).toUpperCase() ?? '' : '';
|
|
79
|
+
return `${first}${last}` || 'U';
|
|
80
|
+
}
|
|
81
|
+
scheduleAutoScroll() {
|
|
82
|
+
if (!this.autoScroll || !this.messages.length) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
queueMicrotask(() => {
|
|
86
|
+
const list = this.messageListElement?.nativeElement;
|
|
87
|
+
if (!list) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
list.scrollTop = list.scrollHeight;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
94
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChatComponent, isStandalone: true, selector: "sdc-chat", inputs: { messages: "messages", autoScroll: "autoScroll", showAvatar: "showAvatar", showTimestamp: "showTimestamp", emptyLabel: "emptyLabel" }, outputs: { attachmentOpened: "attachmentOpened", messageClicked: "messageClicked" }, viewQueries: [{ propertyName: "messageList", first: true, predicate: ["messageList"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-chat\" [class.sdc-chat--empty]=\"!messages.length\">\n <div *ngIf=\"!messages.length\" class=\"sdc-chat__empty\">\n {{ resolvedEmptyLabel }}\n </div>\n\n <ul *ngIf=\"messages.length\" #messageList class=\"sdc-chat__list\">\n <li\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\n class=\"sdc-chat__message\"\n [class.sdc-chat__message--mine]=\"message.isMine\"\n [class.sdc-chat__message--theirs]=\"!message.isMine\"\n (click)=\"handleMessageClick(message)\"\n (keydown.enter)=\"handleMessageClick(message)\"\n (keydown.space)=\"handleMessageClick(message)\"\n >\n <span *ngIf=\"showAvatar\" class=\"sdc-chat__avatar\">\n <img\n *ngIf=\"message.avatarUrl; else initialsTemplate\"\n class=\"sdc-chat__avatarImage\"\n [alt]=\"message.senderName\"\n [src]=\"message.avatarUrl\"\n width=\"32\"\n height=\"32\"\n />\n\n <ng-template #initialsTemplate>\n <span class=\"sdc-chat__avatarFallback\">{{ initials(message) }}</span>\n </ng-template>\n </span>\n\n <span class=\"sdc-chat__bubble\">\n <span class=\"sdc-chat__meta\">\n <span class=\"sdc-chat__sender\">{{ message.senderName }}</span>\n <span *ngIf=\"showTimestamp && resolveTimestamp(message.sentAt) as timestamp\" class=\"sdc-chat__timestamp\">\n {{ timestamp }}\n </span>\n </span>\n\n <span class=\"sdc-chat__text\">{{ message.text }}</span>\n\n <button\n *ngIf=\"message.attachmentUrl\"\n class=\"sdc-chat__attachment\"\n type=\"button\"\n (click)=\"handleAttachmentClick(message, $event)\"\n >\n {{ resolveAttachmentLabel(message) }}\n </button>\n\n <span *ngIf=\"message.isMine && resolveStatusLabel(message.status) as statusLabel\" class=\"sdc-chat__status\">\n {{ statusLabel }}\n </span>\n </span>\n </li>\n </ul>\n</div>\n", styles: [":host{display:block}.sdc-chat{background:var(--sdc-surface-bg, #ffffff);border:1px solid var(--sdc-surface-border-color, #dedce5);border-radius:1rem;min-height:12rem;overflow:hidden}.sdc-chat--empty{align-items:center;display:flex;justify-content:center}.sdc-chat__empty{color:var(--sdc-text-muted, #6b7280);font-size:.95rem;padding:2rem;text-align:center}.sdc-chat__list{display:flex;flex-direction:column;gap:.875rem;max-height:28rem;overflow-y:auto;padding:1rem}.sdc-chat__message{align-items:flex-end;display:flex;gap:.75rem}.sdc-chat__message--mine{flex-direction:row-reverse}.sdc-chat__avatar,.sdc-chat__avatarFallback,.sdc-chat__avatarImage{border-radius:999px;flex:0 0 auto;height:2.25rem;width:2.25rem}.sdc-chat__avatar{align-items:center;display:inline-flex;justify-content:center}.sdc-chat__avatarFallback{align-items:center;background:#428bca1f;color:var(--p-primary-color, #428bca);display:inline-flex;font-size:.8rem;font-weight:700;justify-content:center}.sdc-chat__avatarImage{display:block;object-fit:cover}.sdc-chat__bubble{background:#1118270a;border-radius:1rem;color:var(--sdc-text-default, #111827);display:flex;flex:0 1 75%;flex-direction:column;gap:.45rem;padding:.75rem .9rem}.sdc-chat__message--mine .sdc-chat__bubble{background:#428bca1f}.sdc-chat__meta{align-items:center;display:flex;gap:.5rem;justify-content:space-between}.sdc-chat__sender{font-size:.85rem;font-weight:700}.sdc-chat__timestamp,.sdc-chat__status{color:var(--sdc-text-muted, #6b7280);font-size:.75rem}.sdc-chat__text{line-height:1.5;white-space:pre-wrap;word-break:break-word}.sdc-chat__attachment{align-self:flex-start;background:transparent;border:0;color:var(--p-primary-color, #428bca);cursor:pointer;font-size:.85rem;font-weight:600;padding:0;text-decoration:underline}@media (max-width: 640px){.sdc-chat__bubble{flex-basis:88%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
95
|
+
}
|
|
96
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComponent, decorators: [{
|
|
97
|
+
type: Component,
|
|
98
|
+
args: [{ selector: 'sdc-chat', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div class=\"sdc-chat\" [class.sdc-chat--empty]=\"!messages.length\">\n <div *ngIf=\"!messages.length\" class=\"sdc-chat__empty\">\n {{ resolvedEmptyLabel }}\n </div>\n\n <ul *ngIf=\"messages.length\" #messageList class=\"sdc-chat__list\">\n <li\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\n class=\"sdc-chat__message\"\n [class.sdc-chat__message--mine]=\"message.isMine\"\n [class.sdc-chat__message--theirs]=\"!message.isMine\"\n (click)=\"handleMessageClick(message)\"\n (keydown.enter)=\"handleMessageClick(message)\"\n (keydown.space)=\"handleMessageClick(message)\"\n >\n <span *ngIf=\"showAvatar\" class=\"sdc-chat__avatar\">\n <img\n *ngIf=\"message.avatarUrl; else initialsTemplate\"\n class=\"sdc-chat__avatarImage\"\n [alt]=\"message.senderName\"\n [src]=\"message.avatarUrl\"\n width=\"32\"\n height=\"32\"\n />\n\n <ng-template #initialsTemplate>\n <span class=\"sdc-chat__avatarFallback\">{{ initials(message) }}</span>\n </ng-template>\n </span>\n\n <span class=\"sdc-chat__bubble\">\n <span class=\"sdc-chat__meta\">\n <span class=\"sdc-chat__sender\">{{ message.senderName }}</span>\n <span *ngIf=\"showTimestamp && resolveTimestamp(message.sentAt) as timestamp\" class=\"sdc-chat__timestamp\">\n {{ timestamp }}\n </span>\n </span>\n\n <span class=\"sdc-chat__text\">{{ message.text }}</span>\n\n <button\n *ngIf=\"message.attachmentUrl\"\n class=\"sdc-chat__attachment\"\n type=\"button\"\n (click)=\"handleAttachmentClick(message, $event)\"\n >\n {{ resolveAttachmentLabel(message) }}\n </button>\n\n <span *ngIf=\"message.isMine && resolveStatusLabel(message.status) as statusLabel\" class=\"sdc-chat__status\">\n {{ statusLabel }}\n </span>\n </span>\n </li>\n </ul>\n</div>\n", styles: [":host{display:block}.sdc-chat{background:var(--sdc-surface-bg, #ffffff);border:1px solid var(--sdc-surface-border-color, #dedce5);border-radius:1rem;min-height:12rem;overflow:hidden}.sdc-chat--empty{align-items:center;display:flex;justify-content:center}.sdc-chat__empty{color:var(--sdc-text-muted, #6b7280);font-size:.95rem;padding:2rem;text-align:center}.sdc-chat__list{display:flex;flex-direction:column;gap:.875rem;max-height:28rem;overflow-y:auto;padding:1rem}.sdc-chat__message{align-items:flex-end;display:flex;gap:.75rem}.sdc-chat__message--mine{flex-direction:row-reverse}.sdc-chat__avatar,.sdc-chat__avatarFallback,.sdc-chat__avatarImage{border-radius:999px;flex:0 0 auto;height:2.25rem;width:2.25rem}.sdc-chat__avatar{align-items:center;display:inline-flex;justify-content:center}.sdc-chat__avatarFallback{align-items:center;background:#428bca1f;color:var(--p-primary-color, #428bca);display:inline-flex;font-size:.8rem;font-weight:700;justify-content:center}.sdc-chat__avatarImage{display:block;object-fit:cover}.sdc-chat__bubble{background:#1118270a;border-radius:1rem;color:var(--sdc-text-default, #111827);display:flex;flex:0 1 75%;flex-direction:column;gap:.45rem;padding:.75rem .9rem}.sdc-chat__message--mine .sdc-chat__bubble{background:#428bca1f}.sdc-chat__meta{align-items:center;display:flex;gap:.5rem;justify-content:space-between}.sdc-chat__sender{font-size:.85rem;font-weight:700}.sdc-chat__timestamp,.sdc-chat__status{color:var(--sdc-text-muted, #6b7280);font-size:.75rem}.sdc-chat__text{line-height:1.5;white-space:pre-wrap;word-break:break-word}.sdc-chat__attachment{align-self:flex-start;background:transparent;border:0;color:var(--p-primary-color, #428bca);cursor:pointer;font-size:.85rem;font-weight:600;padding:0;text-decoration:underline}@media (max-width: 640px){.sdc-chat__bubble{flex-basis:88%}}\n"] }]
|
|
99
|
+
}], ctorParameters: () => [], propDecorators: { messages: [{
|
|
100
|
+
type: Input
|
|
101
|
+
}], autoScroll: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], showAvatar: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], showTimestamp: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], emptyLabel: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], attachmentOpened: [{
|
|
110
|
+
type: Output
|
|
111
|
+
}], messageClicked: [{
|
|
112
|
+
type: Output
|
|
113
|
+
}], messageList: [{
|
|
114
|
+
type: ViewChild,
|
|
115
|
+
args: ['messageList']
|
|
116
|
+
}] } });
|
|
117
|
+
function resolveChatLocale(language) {
|
|
118
|
+
if (language === 'en') {
|
|
119
|
+
return 'en-US';
|
|
120
|
+
}
|
|
121
|
+
if (language === 'es-CO') {
|
|
122
|
+
return 'es-CO';
|
|
123
|
+
}
|
|
124
|
+
return 'pt-BR';
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NoYXQvY2hhdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NoYXQvY2hhdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3ZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFFckUsTUFBTSxvQkFBb0IsR0FBRyw4QkFBOEIsQ0FBQztBQVc1RCxNQUFNLE9BQU8sYUFBYTtJQUNQLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyQyxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDekMsa0JBQWtCLENBQThCO0lBRS9DLFFBQVEsR0FBcUIsRUFBRSxDQUFDO0lBQ2hDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDbEIsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNsQixhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLFVBQVUsQ0FBVTtJQUVuQixnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztJQUN0RCxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7SUFFOUQsSUFDSSxXQUFXLENBQUMsS0FBNkM7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Z0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0gsV0FBVztzQkFEZCxTQUFTO3VCQUFDLGFBQWE7O0FBaUcxQixTQUFTLGlCQUFpQixDQUFDLFFBQTRCO0lBQ3JELElBQUksUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN6QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBTZGNDaGF0TWVzc2FnZSwgU2RjQ2hhdE1lc3NhZ2VTdGF0dXMgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2NoYXQudHlwZSc7XG5pbXBvcnQgeyByZXNvbHZlVHJhbnNsYXRhYmxlVGV4dCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvaTE4bi51dGlsJztcblxuY29uc3QgQ0hBVF9FTVBUWV9MQUJFTF9LRVkgPSAncGxhdGZvcm0uZGF0YWNvcmUuY2hhdC5lbXB0eSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NkYy1jaGF0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NoYXQuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRcbn0pXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgbWVzc2FnZUxpc3RFbGVtZW50PzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQElucHV0KCkgbWVzc2FnZXM6IFNkY0NoYXRNZXNzYWdlW10gPSBbXTtcbiAgQElucHV0KCkgYXV0b1Njcm9sbCA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dBdmF0YXIgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93VGltZXN0YW1wID0gdHJ1ZTtcbiAgQElucHV0KCkgZW1wdHlMYWJlbD86IHN0cmluZztcblxuICBAT3V0cHV0KCkgYXR0YWNobWVudE9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2RjQ2hhdE1lc3NhZ2U+KCk7XG4gIEBPdXRwdXQoKSBtZXNzYWdlQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U2RjQ2hhdE1lc3NhZ2U+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWVzc2FnZUxpc3QnKVxuICBzZXQgbWVzc2FnZUxpc3QodmFsdWU6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5tZXNzYWdlTGlzdEVsZW1lbnQgPSB2YWx1ZTtcbiAgICB0aGlzLnNjaGVkdWxlQXV0b1Njcm9sbCgpO1xuICB9XG5cbiAgZ2V0IG1lc3NhZ2VMaXN0KCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlTGlzdEVsZW1lbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2UucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuc2NoZWR1bGVBdXRvU2Nyb2xsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJhY2tCeU1lc3NhZ2VJZChfaW5kZXg6IG51bWJlciwgbWVzc2FnZTogU2RjQ2hhdE1lc3NhZ2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBtZXNzYWdlLmlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCByZXNvbHZlZEVtcHR5TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQodGhpcy50cmFuc2xhdGUsIHRoaXMuZW1wdHlMYWJlbCwgQ0hBVF9FTVBUWV9MQUJFTF9LRVkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBpbml0aWFscygpOiAobWVzc2FnZTogU2RjQ2hhdE1lc3NhZ2UpID0+IHN0cmluZyB7XG4gICAgcmV0dXJuIChtZXNzYWdlOiBTZGNDaGF0TWVzc2FnZSkgPT4gdGhpcy5idWlsZEluaXRpYWxzKG1lc3NhZ2Uuc2VuZGVyTmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlTWVzc2FnZUNsaWNrKG1lc3NhZ2U6IFNkY0NoYXRNZXNzYWdlKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlQ2xpY2tlZC5lbWl0KG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUF0dGFjaG1lbnRDbGljayhtZXNzYWdlOiBTZGNDaGF0TWVzc2FnZSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5hdHRhY2htZW50T3BlbmVkLmVtaXQobWVzc2FnZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUF0dGFjaG1lbnRMYWJlbChtZXNzYWdlOiBTZGNDaGF0TWVzc2FnZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuYXR0YWNobWVudE5hbWU/LnRyaW0oKVxuICAgICAgPz8gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgncGxhdGZvcm0uZGF0YWNvcmUuY2hhdC5hdHRhY2htZW50Jyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZVN0YXR1c0xhYmVsKHN0YXR1czogU2RjQ2hhdE1lc3NhZ2VTdGF0dXMgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXN0YXR1cykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYHBsYXRmb3JtLmRhdGFjb3JlLmNoYXQuc3RhdHVzLiR7c3RhdHVzfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVUaW1lc3RhbXAoc2VudEF0OiBEYXRlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFzZW50QXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSBzZW50QXQgaW5zdGFuY2VvZiBEYXRlID8gc2VudEF0IDogbmV3IERhdGUoc2VudEF0KTtcblxuICAgIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhbGUgPSByZXNvbHZlQ2hhdExvY2FsZSh0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyk7XG4gICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwge1xuICAgICAgZGF5OiAnMi1kaWdpdCcsXG4gICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCdcbiAgICB9KS5mb3JtYXQoZGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSW5pdGlhbHMoc2VuZGVyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IHNlbmRlck5hbWUuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgZmlyc3QgPSBwYXJ0c1swXT8uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgPz8gJyc7XG4gICAgY29uc3QgbGFzdCA9IHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXT8uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgPz8gJycgOiAnJztcblxuICAgIHJldHVybiBgJHtmaXJzdH0ke2xhc3R9YCB8fCAnVSc7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlQXV0b1Njcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXV0b1Njcm9sbCB8fCAhdGhpcy5tZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gdGhpcy5tZXNzYWdlTGlzdEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGlmICghbGlzdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxpc3Quc2Nyb2xsVG9wID0gbGlzdC5zY3JvbGxIZWlnaHQ7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUNoYXRMb2NhbGUobGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChsYW5ndWFnZSA9PT0gJ2VuJykge1xuICAgIHJldHVybiAnZW4tVVMnO1xuICB9XG5cbiAgaWYgKGxhbmd1YWdlID09PSAnZXMtQ08nKSB7XG4gICAgcmV0dXJuICdlcy1DTyc7XG4gIH1cblxuICByZXR1cm4gJ3B0LUJSJztcbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtY2hhdFwiIFtjbGFzcy5zZGMtY2hhdC0tZW1wdHldPVwiIW1lc3NhZ2VzLmxlbmd0aFwiPlxuICA8ZGl2ICpuZ0lmPVwiIW1lc3NhZ2VzLmxlbmd0aFwiIGNsYXNzPVwic2RjLWNoYXRfX2VtcHR5XCI+XG4gICAge3sgcmVzb2x2ZWRFbXB0eUxhYmVsIH19XG4gIDwvZGl2PlxuXG4gIDx1bCAqbmdJZj1cIm1lc3NhZ2VzLmxlbmd0aFwiICNtZXNzYWdlTGlzdCBjbGFzcz1cInNkYy1jaGF0X19saXN0XCI+XG4gICAgPGxpXG4gICAgICAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiBtZXNzYWdlczsgdHJhY2tCeTogdHJhY2tCeU1lc3NhZ2VJZFwiXG4gICAgICBjbGFzcz1cInNkYy1jaGF0X19tZXNzYWdlXCJcbiAgICAgIFtjbGFzcy5zZGMtY2hhdF9fbWVzc2FnZS0tbWluZV09XCJtZXNzYWdlLmlzTWluZVwiXG4gICAgICBbY2xhc3Muc2RjLWNoYXRfX21lc3NhZ2UtLXRoZWlyc109XCIhbWVzc2FnZS5pc01pbmVcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZU1lc3NhZ2VDbGljayhtZXNzYWdlKVwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVNZXNzYWdlQ2xpY2sobWVzc2FnZSlcIlxuICAgICAgKGtleWRvd24uc3BhY2UpPVwiaGFuZGxlTWVzc2FnZUNsaWNrKG1lc3NhZ2UpXCJcbiAgICA+XG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dBdmF0YXJcIiBjbGFzcz1cInNkYy1jaGF0X19hdmF0YXJcIj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS5hdmF0YXJVcmw7IGVsc2UgaW5pdGlhbHNUZW1wbGF0ZVwiXG4gICAgICAgICAgY2xhc3M9XCJzZGMtY2hhdF9fYXZhdGFySW1hZ2VcIlxuICAgICAgICAgIFthbHRdPVwibWVzc2FnZS5zZW5kZXJOYW1lXCJcbiAgICAgICAgICBbc3JjXT1cIm1lc3NhZ2UuYXZhdGFyVXJsXCJcbiAgICAgICAgICB3aWR0aD1cIjMyXCJcbiAgICAgICAgICBoZWlnaHQ9XCIzMlwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNpbml0aWFsc1RlbXBsYXRlPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNoYXRfX2F2YXRhckZhbGxiYWNrXCI+e3sgaW5pdGlhbHMobWVzc2FnZSkgfX08L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNoYXRfX2J1YmJsZVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jaGF0X19tZXRhXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY2hhdF9fc2VuZGVyXCI+e3sgbWVzc2FnZS5zZW5kZXJOYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2hvd1RpbWVzdGFtcCAmJiByZXNvbHZlVGltZXN0YW1wKG1lc3NhZ2Uuc2VudEF0KSBhcyB0aW1lc3RhbXBcIiBjbGFzcz1cInNkYy1jaGF0X190aW1lc3RhbXBcIj5cbiAgICAgICAgICAgIHt7IHRpbWVzdGFtcCB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNoYXRfX3RleHRcIj57eyBtZXNzYWdlLnRleHQgfX08L3NwYW4+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS5hdHRhY2htZW50VXJsXCJcbiAgICAgICAgICBjbGFzcz1cInNkYy1jaGF0X19hdHRhY2htZW50XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQXR0YWNobWVudENsaWNrKG1lc3NhZ2UsICRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgcmVzb2x2ZUF0dGFjaG1lbnRMYWJlbChtZXNzYWdlKSB9fVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cIm1lc3NhZ2UuaXNNaW5lICYmIHJlc29sdmVTdGF0dXNMYWJlbChtZXNzYWdlLnN0YXR1cykgYXMgc3RhdHVzTGFiZWxcIiBjbGFzcz1cInNkYy1jaGF0X19zdGF0dXNcIj5cbiAgICAgICAgICB7eyBzdGF0dXNMYWJlbCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9saT5cbiAgPC91bD5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewEncapsulation, forwardRef, inject } from '@angular/core';
|
|
3
|
+
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
export class CheckboxListComponent {
|
|
7
|
+
cdr = inject(ChangeDetectorRef);
|
|
8
|
+
data;
|
|
9
|
+
state = this.buildState({ label: '' });
|
|
10
|
+
onChange = () => { };
|
|
11
|
+
onTouched = () => { };
|
|
12
|
+
ngOnChanges(changes) {
|
|
13
|
+
if (changes['data']) {
|
|
14
|
+
this.state = this.buildState(this.data);
|
|
15
|
+
this.cdr.markForCheck();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
writeValue(value) {
|
|
19
|
+
this.state = value ? this.cloneState(value) : this.buildState(this.data);
|
|
20
|
+
this.cdr.markForCheck();
|
|
21
|
+
}
|
|
22
|
+
registerOnChange(onChange) {
|
|
23
|
+
this.onChange = onChange;
|
|
24
|
+
}
|
|
25
|
+
registerOnTouched(onTouched) {
|
|
26
|
+
this.onTouched = onTouched;
|
|
27
|
+
}
|
|
28
|
+
setDisabledState(isDisabled) {
|
|
29
|
+
this.state.disabled = isDisabled;
|
|
30
|
+
this.cdr.markForCheck();
|
|
31
|
+
}
|
|
32
|
+
get renderType() {
|
|
33
|
+
return this.data.renderType ?? 'inline';
|
|
34
|
+
}
|
|
35
|
+
ensureChildState(parentState, child) {
|
|
36
|
+
if (!parentState.children) {
|
|
37
|
+
parentState.children = {};
|
|
38
|
+
}
|
|
39
|
+
if (!parentState.children[child.label]) {
|
|
40
|
+
parentState.children[child.label] = this.buildState(child);
|
|
41
|
+
}
|
|
42
|
+
return parentState.children[child.label];
|
|
43
|
+
}
|
|
44
|
+
onNodeCheckedChange(node, nodeState, event) {
|
|
45
|
+
if (nodeState.disabled) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const checked = event.target.checked;
|
|
49
|
+
this.setBranchChecked(node, nodeState, checked);
|
|
50
|
+
this.syncBranchState(this.data, this.state);
|
|
51
|
+
this.emitStateChange();
|
|
52
|
+
}
|
|
53
|
+
emitStateChange() {
|
|
54
|
+
this.onChange(this.cloneState(this.state));
|
|
55
|
+
this.onTouched();
|
|
56
|
+
this.cdr.markForCheck();
|
|
57
|
+
}
|
|
58
|
+
buildState(node) {
|
|
59
|
+
const children = node.children?.reduce((accumulator, child) => {
|
|
60
|
+
accumulator[child.label] = this.buildState(child);
|
|
61
|
+
return accumulator;
|
|
62
|
+
}, {});
|
|
63
|
+
return {
|
|
64
|
+
checked: false,
|
|
65
|
+
indeterminate: false,
|
|
66
|
+
disabled: false,
|
|
67
|
+
children
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
cloneState(state) {
|
|
71
|
+
const children = state.children
|
|
72
|
+
? Object.entries(state.children).reduce((accumulator, [key, value]) => {
|
|
73
|
+
accumulator[key] = this.cloneState(value);
|
|
74
|
+
return accumulator;
|
|
75
|
+
}, {})
|
|
76
|
+
: undefined;
|
|
77
|
+
return {
|
|
78
|
+
checked: state.checked,
|
|
79
|
+
indeterminate: state.indeterminate,
|
|
80
|
+
disabled: state.disabled,
|
|
81
|
+
children
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
setBranchChecked(node, nodeState, checked) {
|
|
85
|
+
nodeState.checked = checked;
|
|
86
|
+
nodeState.indeterminate = false;
|
|
87
|
+
for (const child of node.children ?? []) {
|
|
88
|
+
const childState = this.ensureChildState(nodeState, child);
|
|
89
|
+
this.setBranchChecked(child, childState, checked);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
syncBranchState(node, nodeState) {
|
|
93
|
+
if (!node.children?.length) {
|
|
94
|
+
return nodeState;
|
|
95
|
+
}
|
|
96
|
+
const childStates = node.children.map((child) => this.syncBranchState(child, this.ensureChildState(nodeState, child)));
|
|
97
|
+
const allChecked = childStates.every((childState) => childState.checked);
|
|
98
|
+
const someChecked = childStates.some((childState) => childState.checked || childState.indeterminate);
|
|
99
|
+
nodeState.checked = allChecked;
|
|
100
|
+
nodeState.indeterminate = !allChecked && someChecked;
|
|
101
|
+
return nodeState;
|
|
102
|
+
}
|
|
103
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
104
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CheckboxListComponent, isStandalone: true, selector: "sdc-checkbox-list", inputs: { data: "data" }, providers: [
|
|
105
|
+
{
|
|
106
|
+
provide: NG_VALUE_ACCESSOR,
|
|
107
|
+
useExisting: forwardRef(() => CheckboxListComponent),
|
|
108
|
+
multi: true
|
|
109
|
+
}
|
|
110
|
+
], usesOnChanges: true, ngImport: i0, template: "<ng-template\n #renderNode\n let-node\n let-nodeState=\"nodeState\"\n let-depth=\"depth\"\n>\n <div class=\"sdc-checkbox-list__item\">\n <label\n class=\"sdc-checkbox-list__label\"\n [class.sdc-checkbox-list__label--disabled]=\"nodeState.disabled\"\n [class.sdc-checkbox-list__label--block]=\"node.renderType === 'block'\"\n [class.sdc-checkbox-list__label--inline]=\"(node.renderType ?? renderType) === 'inline'\"\n >\n <input\n type=\"checkbox\"\n class=\"sdc-checkbox-list__input\"\n [checked]=\"nodeState.checked\"\n [disabled]=\"nodeState.disabled\"\n [indeterminate]=\"nodeState.indeterminate ?? false\"\n [attr.aria-checked]=\"nodeState.indeterminate ? 'mixed' : nodeState.checked\"\n [attr.aria-disabled]=\"nodeState.disabled\"\n (change)=\"onNodeCheckedChange(node, nodeState, $event)\"\n />\n <span>{{ node.label }}</span>\n </label>\n\n @if (node.children?.length) {\n <div\n class=\"sdc-checkbox-list__children\"\n [style.margin-left.rem]=\"depth > 0 ? 1.25 : 1\"\n >\n @for (child of node.children; track child.label) {\n <ng-container\n [ngTemplateOutlet]=\"renderNode\"\n [ngTemplateOutletContext]=\"{\n $implicit: child,\n nodeState: ensureChildState(nodeState, child),\n depth: depth + 1\n }\"\n ></ng-container>\n }\n </div>\n }\n </div>\n</ng-template>\n\n<div class=\"sdc-checkbox-list\">\n <ng-container\n [ngTemplateOutlet]=\"renderNode\"\n [ngTemplateOutletContext]=\"{ $implicit: data, nodeState: state, depth: 0 }\"\n ></ng-container>\n</div>\n", styles: [".sdc-checkbox-list,.sdc-checkbox-list__item{display:flex;flex-direction:column;gap:.625rem}.sdc-checkbox-list__label{display:flex;gap:.75rem;color:#212533;font-size:.875rem}.sdc-checkbox-list__label--inline{align-items:center}.sdc-checkbox-list__label--block{flex-direction:column-reverse}.sdc-checkbox-list__label--disabled{opacity:.5;cursor:default}.sdc-checkbox-list__input{position:relative;flex-shrink:0;width:1.25rem;height:1.25rem;border:1px solid #c1c1cc;border-radius:.25rem;cursor:pointer;accent-color:#428bca}.sdc-checkbox-list__children{display:flex;flex-direction:column;gap:.625rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
111
|
+
}
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxListComponent, decorators: [{
|
|
113
|
+
type: Component,
|
|
114
|
+
args: [{ selector: 'sdc-checkbox-list', standalone: true, imports: [CommonModule, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
|
|
115
|
+
{
|
|
116
|
+
provide: NG_VALUE_ACCESSOR,
|
|
117
|
+
useExisting: forwardRef(() => CheckboxListComponent),
|
|
118
|
+
multi: true
|
|
119
|
+
}
|
|
120
|
+
], template: "<ng-template\n #renderNode\n let-node\n let-nodeState=\"nodeState\"\n let-depth=\"depth\"\n>\n <div class=\"sdc-checkbox-list__item\">\n <label\n class=\"sdc-checkbox-list__label\"\n [class.sdc-checkbox-list__label--disabled]=\"nodeState.disabled\"\n [class.sdc-checkbox-list__label--block]=\"node.renderType === 'block'\"\n [class.sdc-checkbox-list__label--inline]=\"(node.renderType ?? renderType) === 'inline'\"\n >\n <input\n type=\"checkbox\"\n class=\"sdc-checkbox-list__input\"\n [checked]=\"nodeState.checked\"\n [disabled]=\"nodeState.disabled\"\n [indeterminate]=\"nodeState.indeterminate ?? false\"\n [attr.aria-checked]=\"nodeState.indeterminate ? 'mixed' : nodeState.checked\"\n [attr.aria-disabled]=\"nodeState.disabled\"\n (change)=\"onNodeCheckedChange(node, nodeState, $event)\"\n />\n <span>{{ node.label }}</span>\n </label>\n\n @if (node.children?.length) {\n <div\n class=\"sdc-checkbox-list__children\"\n [style.margin-left.rem]=\"depth > 0 ? 1.25 : 1\"\n >\n @for (child of node.children; track child.label) {\n <ng-container\n [ngTemplateOutlet]=\"renderNode\"\n [ngTemplateOutletContext]=\"{\n $implicit: child,\n nodeState: ensureChildState(nodeState, child),\n depth: depth + 1\n }\"\n ></ng-container>\n }\n </div>\n }\n </div>\n</ng-template>\n\n<div class=\"sdc-checkbox-list\">\n <ng-container\n [ngTemplateOutlet]=\"renderNode\"\n [ngTemplateOutletContext]=\"{ $implicit: data, nodeState: state, depth: 0 }\"\n ></ng-container>\n</div>\n", styles: [".sdc-checkbox-list,.sdc-checkbox-list__item{display:flex;flex-direction:column;gap:.625rem}.sdc-checkbox-list__label{display:flex;gap:.75rem;color:#212533;font-size:.875rem}.sdc-checkbox-list__label--inline{align-items:center}.sdc-checkbox-list__label--block{flex-direction:column-reverse}.sdc-checkbox-list__label--disabled{opacity:.5;cursor:default}.sdc-checkbox-list__input{position:relative;flex-shrink:0;width:1.25rem;height:1.25rem;border:1px solid #c1c1cc;border-radius:.25rem;cursor:pointer;accent-color:#428bca}.sdc-checkbox-list__children{display:flex;flex-direction:column;gap:.625rem}\n"] }]
|
|
121
|
+
}], propDecorators: { data: [{
|
|
122
|
+
type: Input,
|
|
123
|
+
args: [{ required: true }]
|
|
124
|
+
}] } });
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NoZWNrYm94LWxpc3QvY2hlY2tib3gtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NoZWNrYm94LWxpc3QvY2hlY2tib3gtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULEtBQUssRUFHTCxpQkFBaUIsRUFDakIsVUFBVSxFQUNWLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUF3QnRGLE1BQU0sT0FBTyxxQkFBcUI7SUFDZixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFdEIsSUFBSSxDQUFvQjtJQUV6QyxLQUFLLEdBQXNCLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUU1RCxRQUFRLEdBQXVDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUN4RCxTQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBRXpDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVE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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1xuICBDaGVja2JveExpc3RDaGlsZHJlbixcbiAgQ2hlY2tib3hMaXN0RGF0YSxcbiAgQ2hlY2tib3hMaXN0U3RhdGVcbn0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9jaGVja2JveC1saXN0LnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZGMtY2hlY2tib3gtbGlzdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrYm94LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGVja2JveC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveExpc3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBkYXRhITogQ2hlY2tib3hMaXN0RGF0YTtcblxuICBwcm90ZWN0ZWQgc3RhdGU6IENoZWNrYm94TGlzdFN0YXRlID0gdGhpcy5idWlsZFN0YXRlKHsgbGFiZWw6ICcnIH0pO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogQ2hlY2tib3hMaXN0U3RhdGUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuYnVpbGRTdGF0ZSh0aGlzLmRhdGEpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogQ2hlY2tib3hMaXN0U3RhdGUgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9IHZhbHVlID8gdGhpcy5jbG9uZVN0YXRlKHZhbHVlKSA6IHRoaXMuYnVpbGRTdGF0ZSh0aGlzLmRhdGEpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBDaGVja2JveExpc3RTdGF0ZSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHJlbmRlclR5cGUoKTogJ2lubGluZScgfCAnYmxvY2snIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLnJlbmRlclR5cGUgPz8gJ2lubGluZSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5zdXJlQ2hpbGRTdGF0ZShwYXJlbnRTdGF0ZTogQ2hlY2tib3hMaXN0U3RhdGUsIGNoaWxkOiBDaGVja2JveExpc3REYXRhKTogQ2hlY2tib3hMaXN0U3RhdGUge1xuICAgIGlmICghcGFyZW50U3RhdGUuY2hpbGRyZW4pIHtcbiAgICAgIHBhcmVudFN0YXRlLmNoaWxkcmVuID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnRTdGF0ZS5jaGlsZHJlbltjaGlsZC5sYWJlbF0pIHtcbiAgICAgIHBhcmVudFN0YXRlLmNoaWxkcmVuW2NoaWxkLmxhYmVsXSA9IHRoaXMuYnVpbGRTdGF0ZShjaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudFN0YXRlLmNoaWxkcmVuW2NoaWxkLmxhYmVsXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk5vZGVDaGVja2VkQ2hhbmdlKFxuICAgIG5vZGU6IENoZWNrYm94TGlzdERhdGEsXG4gICAgbm9kZVN0YXRlOiBDaGVja2JveExpc3RTdGF0ZSxcbiAgICBldmVudDogRXZlbnRcbiAgKTogdm9pZCB7XG4gICAgaWYgKG5vZGVTdGF0ZS5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XG4gICAgdGhpcy5zZXRCcmFuY2hDaGVja2VkKG5vZGUsIG5vZGVTdGF0ZSwgY2hlY2tlZCk7XG4gICAgdGhpcy5zeW5jQnJhbmNoU3RhdGUodGhpcy5kYXRhLCB0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmNsb25lU3RhdGUodGhpcy5zdGF0ZSkpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU3RhdGUobm9kZTogQ2hlY2tib3hMaXN0RGF0YSk6IENoZWNrYm94TGlzdFN0YXRlIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4/LnJlZHVjZTxDaGVja2JveExpc3RDaGlsZHJlbj4oKGFjY3VtdWxhdG9yLCBjaGlsZCkgPT4ge1xuICAgICAgYWNjdW11bGF0b3JbY2hpbGQubGFiZWxdID0gdGhpcy5idWlsZFN0YXRlKGNoaWxkKTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogZmFsc2UsXG4gICAgICBpbmRldGVybWluYXRlOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIGNoaWxkcmVuXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvbmVTdGF0ZShzdGF0ZTogQ2hlY2tib3hMaXN0U3RhdGUpOiBDaGVja2JveExpc3RTdGF0ZSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBzdGF0ZS5jaGlsZHJlblxuICAgICAgPyBPYmplY3QuZW50cmllcyhzdGF0ZS5jaGlsZHJlbikucmVkdWNlPENoZWNrYm94TGlzdENoaWxkcmVuPigoYWNjdW11bGF0b3IsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSB0aGlzLmNsb25lU3RhdGUodmFsdWUpO1xuICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgICAgfSwge30pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGVja2VkOiBzdGF0ZS5jaGVja2VkLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogc3RhdGUuaW5kZXRlcm1pbmF0ZSxcbiAgICAgIGRpc2FibGVkOiBzdGF0ZS5kaXNhYmxlZCxcbiAgICAgIGNoaWxkcmVuXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QnJhbmNoQ2hlY2tlZChub2RlOiBDaGVja2JveExpc3REYXRhLCBub2RlU3RhdGU6IENoZWNrYm94TGlzdFN0YXRlLCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgbm9kZVN0YXRlLmNoZWNrZWQgPSBjaGVja2VkO1xuICAgIG5vZGVTdGF0ZS5pbmRldGVybWluYXRlID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgIGNvbnN0IGNoaWxkU3RhdGUgPSB0aGlzLmVuc3VyZUNoaWxkU3RhdGUobm9kZVN0YXRlLCBjaGlsZCk7XG4gICAgICB0aGlzLnNldEJyYW5jaENoZWNrZWQoY2hpbGQsIGNoaWxkU3RhdGUsIGNoZWNrZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0JyYW5jaFN0YXRlKG5vZGU6IENoZWNrYm94TGlzdERhdGEsIG5vZGVTdGF0ZTogQ2hlY2tib3hMaXN0U3RhdGUpOiBDaGVja2JveExpc3RTdGF0ZSB7XG4gICAgaWYgKCFub2RlLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBub2RlU3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRTdGF0ZXMgPSBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+XG4gICAgICB0aGlzLnN5bmNCcmFuY2hTdGF0ZShjaGlsZCwgdGhpcy5lbnN1cmVDaGlsZFN0YXRlKG5vZGVTdGF0ZSwgY2hpbGQpKVxuICAgICk7XG5cbiAgICBjb25zdCBhbGxDaGVja2VkID0gY2hpbGRTdGF0ZXMuZXZlcnkoKGNoaWxkU3RhdGUpID0+IGNoaWxkU3RhdGUuY2hlY2tlZCk7XG4gICAgY29uc3Qgc29tZUNoZWNrZWQgPSBjaGlsZFN0YXRlcy5zb21lKFxuICAgICAgKGNoaWxkU3RhdGUpID0+IGNoaWxkU3RhdGUuY2hlY2tlZCB8fCBjaGlsZFN0YXRlLmluZGV0ZXJtaW5hdGVcbiAgICApO1xuXG4gICAgbm9kZVN0YXRlLmNoZWNrZWQgPSBhbGxDaGVja2VkO1xuICAgIG5vZGVTdGF0ZS5pbmRldGVybWluYXRlID0gIWFsbENoZWNrZWQgJiYgc29tZUNoZWNrZWQ7XG5cbiAgICByZXR1cm4gbm9kZVN0YXRlO1xuICB9XG59XG4iLCI8bmctdGVtcGxhdGVcbiAgI3JlbmRlck5vZGVcbiAgbGV0LW5vZGVcbiAgbGV0LW5vZGVTdGF0ZT1cIm5vZGVTdGF0ZVwiXG4gIGxldC1kZXB0aD1cImRlcHRoXCJcbj5cbiAgPGRpdiBjbGFzcz1cInNkYy1jaGVja2JveC1saXN0X19pdGVtXCI+XG4gICAgPGxhYmVsXG4gICAgICBjbGFzcz1cInNkYy1jaGVja2JveC1saXN0X19sYWJlbFwiXG4gICAgICBbY2xhc3Muc2RjLWNoZWNrYm94LWxpc3RfX2xhYmVsLS1kaXNhYmxlZF09XCJub2RlU3RhdGUuZGlzYWJsZWRcIlxuICAgICAgW2NsYXNzLnNkYy1jaGVja2JveC1saXN0X19sYWJlbC0tYmxvY2tdPVwibm9kZS5yZW5kZXJUeXBlID09PSAnYmxvY2snXCJcbiAgICAgIFtjbGFzcy5zZGMtY2hlY2tib3gtbGlzdF9fbGFiZWwtLWlubGluZV09XCIobm9kZS5yZW5kZXJUeXBlID8/IHJlbmRlclR5cGUpID09PSAnaW5saW5lJ1wiXG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIGNsYXNzPVwic2RjLWNoZWNrYm94LWxpc3RfX2lucHV0XCJcbiAgICAgICAgW2NoZWNrZWRdPVwibm9kZVN0YXRlLmNoZWNrZWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibm9kZVN0YXRlLmRpc2FibGVkXCJcbiAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwibm9kZVN0YXRlLmluZGV0ZXJtaW5hdGUgPz8gZmFsc2VcIlxuICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwibm9kZVN0YXRlLmluZGV0ZXJtaW5hdGUgPyAnbWl4ZWQnIDogbm9kZVN0YXRlLmNoZWNrZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIm5vZGVTdGF0ZS5kaXNhYmxlZFwiXG4gICAgICAgIChjaGFuZ2UpPVwib25Ob2RlQ2hlY2tlZENoYW5nZShub2RlLCBub2RlU3RhdGUsICRldmVudClcIlxuICAgICAgLz5cbiAgICAgIDxzcGFuPnt7IG5vZGUubGFiZWwgfX08L3NwYW4+XG4gICAgPC9sYWJlbD5cblxuICAgIEBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzZGMtY2hlY2tib3gtbGlzdF9fY2hpbGRyZW5cIlxuICAgICAgW3N0eWxlLm1hcmdpbi1sZWZ0LnJlbV09XCJkZXB0aCA+IDAgPyAxLjI1IDogMVwiXG4gICAgPlxuICAgICAgQGZvciAoY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbjsgdHJhY2sgY2hpbGQubGFiZWwpIHtcbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVuZGVyTm9kZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgJGltcGxpY2l0OiBjaGlsZCxcbiAgICAgICAgICBub2RlU3RhdGU6IGVuc3VyZUNoaWxkU3RhdGUobm9kZVN0YXRlLCBjaGlsZCksXG4gICAgICAgICAgZGVwdGg6IGRlcHRoICsgMVxuICAgICAgICB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPGRpdiBjbGFzcz1cInNkYy1jaGVja2JveC1saXN0XCI+XG4gIDxuZy1jb250YWluZXJcbiAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyZW5kZXJOb2RlXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGRhdGEsIG5vZGVTdGF0ZTogc3RhdGUsIGRlcHRoOiAwIH1cIlxuICA+PC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
|