@bnsights/bbsf-controls 1.0.194-beta.9 → 1.2.1
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 +1315 -1245
- package/fesm2022/bnsights-bbsf-controls.mjs +375 -345
- package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -1
- package/lib/Shared/Models/DropdownOptions.d.ts +3 -0
- package/lib/Shared/Models/RepeaterOptions.d.ts +2 -0
- package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +0 -1
- package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +0 -1
- package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +1 -1
- package/lib/controls/Repeater/repeater/repeater.component.d.ts +7 -0
- package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +7 -0
- package/lib/modules/bbsf-editors.module.d.ts +6 -7
- package/package.json +34 -37
- package/src/lib/assets/Style.scss +2 -0
- package/src/lib/assets/ace-builds/ace.js +1 -1
- package/src/lib/assets/ace-builds/mode-markdown.js +1 -1
- package/esm2022/bnsights-bbsf-controls.mjs +0 -5
- package/esm2022/lib/Shared/Components/app-base-component.mjs +0 -226
- package/esm2022/lib/Shared/Components/ng-tag-input.mjs +0 -336
- package/esm2022/lib/Shared/Directives/appPreventDoubleClick.directive.mjs +0 -39
- package/esm2022/lib/Shared/Directives/template-name.directive.mjs +0 -19
- package/esm2022/lib/Shared/Enums/CalendarView.mjs +0 -8
- package/esm2022/lib/Shared/Enums/ControlLayout.mjs +0 -6
- package/esm2022/lib/Shared/Enums/Countries.mjs +0 -247
- package/esm2022/lib/Shared/Enums/Enums.mjs +0 -36
- package/esm2022/lib/Shared/Enums/FileType.mjs +0 -29
- package/esm2022/lib/Shared/Enums/FilterType.mjs +0 -11
- package/esm2022/lib/Shared/Enums/FontSize.mjs +0 -7
- package/esm2022/lib/Shared/Enums/ForceDirection.mjs +0 -6
- package/esm2022/lib/Shared/Enums/IconPosition.mjs +0 -6
- package/esm2022/lib/Shared/Enums/ImageType.mjs +0 -10
- package/esm2022/lib/Shared/Enums/InputType.mjs +0 -10
- package/esm2022/lib/Shared/Enums/Insert.mjs +0 -9
- package/esm2022/lib/Shared/Enums/LanguageMode.mjs +0 -11
- package/esm2022/lib/Shared/Enums/LanguageValidation.mjs +0 -6
- package/esm2022/lib/Shared/Enums/Markdown.mjs +0 -20
- package/esm2022/lib/Shared/Enums/Misc.mjs +0 -7
- package/esm2022/lib/Shared/Enums/PagingActionMode.mjs +0 -6
- package/esm2022/lib/Shared/Enums/Para.mjs +0 -9
- package/esm2022/lib/Shared/Enums/PickerType.mjs +0 -7
- package/esm2022/lib/Shared/Enums/SelectMode.mjs +0 -6
- package/esm2022/lib/Shared/Enums/StartView.mjs +0 -7
- package/esm2022/lib/Shared/Enums/Style.mjs +0 -8
- package/esm2022/lib/Shared/Enums/StyleConfirmationMode.mjs +0 -7
- package/esm2022/lib/Shared/Enums/TagInputView.mjs +0 -7
- package/esm2022/lib/Shared/Enums/ToolbarButtons.mjs +0 -33
- package/esm2022/lib/Shared/Enums/map-enums.mjs +0 -15
- package/esm2022/lib/Shared/Enums/menu-list-enum.mjs +0 -6
- package/esm2022/lib/Shared/Models/Attribute.mjs +0 -3
- package/esm2022/lib/Shared/Models/AutocompleteDTO.mjs +0 -8
- package/esm2022/lib/Shared/Models/AutocompleteOptions.mjs +0 -39
- package/esm2022/lib/Shared/Models/CalendarDTO.mjs +0 -3
- package/esm2022/lib/Shared/Models/CalendarEventDTO.mjs +0 -3
- package/esm2022/lib/Shared/Models/CalendarOptions.mjs +0 -19
- package/esm2022/lib/Shared/Models/CancelDTO.mjs +0 -7
- package/esm2022/lib/Shared/Models/CaptchaStyle.mjs +0 -3
- package/esm2022/lib/Shared/Models/CheckBoxOptions.mjs +0 -11
- package/esm2022/lib/Shared/Models/ConfirmationModalOptions.mjs +0 -39
- package/esm2022/lib/Shared/Models/ControlOptionsBase.mjs +0 -17
- package/esm2022/lib/Shared/Models/CustomValidation.mjs +0 -14
- package/esm2022/lib/Shared/Models/DatePickerOptions.mjs +0 -40
- package/esm2022/lib/Shared/Models/DropdownListItem.mjs +0 -3
- package/esm2022/lib/Shared/Models/DropdownOptions.mjs +0 -38
- package/esm2022/lib/Shared/Models/EditPersonalImage.mjs +0 -7
- package/esm2022/lib/Shared/Models/EnglishArabicDTO.mjs +0 -10
- package/esm2022/lib/Shared/Models/FileDTO.mjs +0 -24
- package/esm2022/lib/Shared/Models/FileOptions.mjs +0 -15
- package/esm2022/lib/Shared/Models/FileUploadModel.mjs +0 -3
- package/esm2022/lib/Shared/Models/FileUploadOptions.mjs +0 -13
- package/esm2022/lib/Shared/Models/FilterItem.mjs +0 -8
- package/esm2022/lib/Shared/Models/FormOptions.mjs +0 -32
- package/esm2022/lib/Shared/Models/HtmlEditorOptions.mjs +0 -12
- package/esm2022/lib/Shared/Models/ImageUploadOptions.mjs +0 -14
- package/esm2022/lib/Shared/Models/MapAutoCompleteOptions.mjs +0 -12
- package/esm2022/lib/Shared/Models/MapAutocompleteDTO.mjs +0 -6
- package/esm2022/lib/Shared/Models/MarkdownEditorOptions.mjs +0 -24
- package/esm2022/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs +0 -9
- package/esm2022/lib/Shared/Models/MultiLingualTextAreaOptions.mjs +0 -9
- package/esm2022/lib/Shared/Models/MultiLingualTextBoxOptions.mjs +0 -17
- package/esm2022/lib/Shared/Models/MultilingualControlOptionsBase.mjs +0 -21
- package/esm2022/lib/Shared/Models/MultipleFileUploadModel.mjs +0 -9
- package/esm2022/lib/Shared/Models/PagingDTO.mjs +0 -13
- package/esm2022/lib/Shared/Models/PagingOptions.mjs +0 -49
- package/esm2022/lib/Shared/Models/PagingPayload.mjs +0 -3
- package/esm2022/lib/Shared/Models/PhoneOptions.mjs +0 -16
- package/esm2022/lib/Shared/Models/ProfileImageUploadOptions.mjs +0 -11
- package/esm2022/lib/Shared/Models/ProfilePictureDTO.mjs +0 -3
- package/esm2022/lib/Shared/Models/RadioButtonItem.mjs +0 -3
- package/esm2022/lib/Shared/Models/RadioButtonOptions.mjs +0 -7
- package/esm2022/lib/Shared/Models/RangeNumber.mjs +0 -3
- package/esm2022/lib/Shared/Models/Recaptcha.mjs +0 -6
- package/esm2022/lib/Shared/Models/RecaptchaOptions.mjs +0 -22
- package/esm2022/lib/Shared/Models/RepeaterField.mjs +0 -3
- package/esm2022/lib/Shared/Models/RepeaterOptions.mjs +0 -14
- package/esm2022/lib/Shared/Models/SaveDTO.mjs +0 -7
- package/esm2022/lib/Shared/Models/TagsInputDTO.mjs +0 -3
- package/esm2022/lib/Shared/Models/TagsInputOptions.mjs +0 -56
- package/esm2022/lib/Shared/Models/TextAreaOptions.mjs +0 -19
- package/esm2022/lib/Shared/Models/TextBoxOptions.mjs +0 -27
- package/esm2022/lib/Shared/Models/ToggleSlideOptions.mjs +0 -9
- package/esm2022/lib/Shared/Models/UploadPersonalImage.mjs +0 -7
- package/esm2022/lib/Shared/Models/bread-crumb.mjs +0 -8
- package/esm2022/lib/Shared/Models/control-filter-Item.mjs +0 -6
- package/esm2022/lib/Shared/Models/filter-options.mjs +0 -9
- package/esm2022/lib/Shared/Models/index.mjs +0 -58
- package/esm2022/lib/Shared/Models/page-header-options.mjs +0 -78
- package/esm2022/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +0 -22
- package/esm2022/lib/Shared/Pipes/bbsf-date.pipe.mjs +0 -22
- package/esm2022/lib/Shared/config/environment.mjs +0 -12
- package/esm2022/lib/Shared/default_intl.mjs +0 -29
- package/esm2022/lib/Shared/services/ControlUtility.mjs +0 -162
- package/esm2022/lib/Shared/services/GlobalSettings.service.mjs +0 -30
- package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +0 -24
- package/esm2022/lib/Shared/services/file-upload.service.mjs +0 -29
- package/esm2022/lib/Shared/services/index.mjs +0 -7
- package/esm2022/lib/Shared/services/render-component-service.service.mjs +0 -32
- package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +0 -125
- package/esm2022/lib/Shared/utils/date-formatter.mjs +0 -48
- package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +0 -299
- package/esm2022/lib/controls/Calendar/Calendar.component.mjs +0 -179
- package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +0 -121
- package/esm2022/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +0 -143
- package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +0 -240
- package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +0 -296
- package/esm2022/lib/controls/FileUpload/FileUpload.component.mjs +0 -741
- package/esm2022/lib/controls/Form/Form.component.mjs +0 -117
- package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +0 -185
- package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +0 -360
- package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +0 -502
- package/esm2022/lib/controls/MarkdownEditor/markdown-editor.component.mjs +0 -243
- package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +0 -456
- package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +0 -441
- package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +0 -500
- package/esm2022/lib/controls/Paging/JwPagination.component.mjs +0 -160
- package/esm2022/lib/controls/Paging/Paging.component.mjs +0 -626
- package/esm2022/lib/controls/Phone/Phone.component.mjs +0 -134
- package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +0 -390
- package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +0 -113
- package/esm2022/lib/controls/Recaptcha/Recaptcha.component.mjs +0 -134
- package/esm2022/lib/controls/Repeater/repeater/repeater.component.mjs +0 -135
- package/esm2022/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +0 -1291
- package/esm2022/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +0 -22
- package/esm2022/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +0 -118
- package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +0 -308
- package/esm2022/lib/controls/TextArea/TextArea.component.mjs +0 -581
- package/esm2022/lib/controls/TextBox/TextBox.component.mjs +0 -357
- package/esm2022/lib/controls/Toggleslide/Toggleslide.component.mjs +0 -96
- package/esm2022/lib/controls/bbsf-controls.module.mjs +0 -92
- package/esm2022/lib/controls/page-header-component/page-header-component.component.mjs +0 -42
- package/esm2022/lib/modules/bbsf-core.module.mjs +0 -210
- package/esm2022/lib/modules/bbsf-datetime.module.mjs +0 -90
- package/esm2022/lib/modules/bbsf-dropdown.module.mjs +0 -57
- package/esm2022/lib/modules/bbsf-editors.module.mjs +0 -97
- package/esm2022/lib/modules/bbsf-forms-basic.module.mjs +0 -79
- package/esm2022/lib/modules/bbsf-multilingual.module.mjs +0 -60
- package/esm2022/lib/modules/bbsf-phone.module.mjs +0 -57
- package/esm2022/lib/modules/bbsf-specialized.module.mjs +0 -160
- package/esm2022/lib/modules/bbsf-uploads.module.mjs +0 -106
- package/esm2022/lib/modules/bbsf-utility.module.mjs +0 -103
- package/esm2022/public-api.mjs +0 -169
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
import { Component, forwardRef, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
|
|
4
|
-
import { TypeaheadModule } from 'ngx-bootstrap/typeahead';
|
|
5
|
-
import { TagInputView } from '../Enums/TagInputView';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common";
|
|
8
|
-
import * as i2 from "@angular/forms";
|
|
9
|
-
import * as i3 from "ngx-bootstrap/typeahead";
|
|
10
|
-
const noop = () => { };
|
|
11
|
-
const TAGS_INPUT_TEMPLATE = `
|
|
12
|
-
|
|
13
|
-
<div class="tags-input">
|
|
14
|
-
<span class="tags-input__tag label label-primary badge badge-primary" *ngFor="let tag of tags">
|
|
15
|
-
|
|
16
|
-
<span [ngSwitch]="ViewMode">
|
|
17
|
-
<span *ngSwitchCase="tagInputViewEnum.WithImage">
|
|
18
|
-
<img style="border-radius:50%; height:40px; width: 40px; float:left; margin-left:5px ; margin-top: 5px;margin-right: 5px;"
|
|
19
|
-
src="{{(tag.imageURL?tag.imageURL:defaultImageURL)}}" />
|
|
20
|
-
</span>
|
|
21
|
-
|
|
22
|
-
<span *ngSwitchCase="tagInputViewEnum.WithInitial">
|
|
23
|
-
<div class="user-initials">{{calculateInitials(tag.name)}}</div>
|
|
24
|
-
</span>
|
|
25
|
-
|
|
26
|
-
<span *ngSwitchDefault>
|
|
27
|
-
</span>
|
|
28
|
-
|
|
29
|
-
</span>
|
|
30
|
-
{{tag[displayField]}}
|
|
31
|
-
<span *ngIf="isDeleteable(tag)" role="button" class="tags-input__tag-remove-btn" (click)="removeTag(tag)"
|
|
32
|
-
(touch)="removeTag(tag)">
|
|
33
|
-
<span aria-hidden="true">×</span>
|
|
34
|
-
<span class="sr-only">Close</span>
|
|
35
|
-
</span>
|
|
36
|
-
</span>
|
|
37
|
-
|
|
38
|
-
<input *ngIf="options === null; else withTypeahead" class="tags-input__input-field" type="text"
|
|
39
|
-
[placeholder]="getPlaceholder()" name="tags" (keyup.enter)="addTag(tagInput)"
|
|
40
|
-
(keydown.backspace)="removeLastTag(tagInput)" [disabled]="!canAddTags || maximumOfTagsReached()"
|
|
41
|
-
[hidden]="!canAddTags || maximumOfTagsReached()" #tagInput />
|
|
42
|
-
|
|
43
|
-
<ng-template #withTypeahead>
|
|
44
|
-
<span [ngSwitch]="ViewMode">
|
|
45
|
-
<span *ngSwitchCase="tagInputViewEnum.WithImage">
|
|
46
|
-
<input *ngIf="(options !== null)" class="tags-input__input-field" type="text" [placeholder]="getPlaceholder()"
|
|
47
|
-
name="tags" (keydown.backspace)="removeLastTag(tagInput)" [(ngModel)]="selected" [typeahead]="options"
|
|
48
|
-
[typeaheadOptionField]="displayField" (typeaheadOnSelect)="typeaheadOnSelect($event)"
|
|
49
|
-
(typeaheadNoResults)="typeaheadOnNoMatch($event)" [typeaheadMinLength]="minLengthBeforeOptions"
|
|
50
|
-
[typeaheadScrollable]="scrollableOptions" [typeaheadLatinize]="true"
|
|
51
|
-
[typeaheadItemTemplate]="itemTemplateWithImage" [typeaheadOptionsInScrollableView]="scrollableOptionsInView"
|
|
52
|
-
[disabled]="!canAddTags || maximumOfTagsReached()" [hidden]="!canAddTags || maximumOfTagsReached()"
|
|
53
|
-
(blur)="onBlur()" autocomplete="off"
|
|
54
|
-
#tagInput />
|
|
55
|
-
</span>
|
|
56
|
-
|
|
57
|
-
<span *ngSwitchCase="tagInputViewEnum.WithoutImage">
|
|
58
|
-
<input *ngIf="(options !== null)" class="tags-input__input-field" type="text" [placeholder]="getPlaceholder()"
|
|
59
|
-
name="tags" (keydown.backspace)="removeLastTag(tagInput)" [(ngModel)]="selected" [typeahead]="options"
|
|
60
|
-
[typeaheadOptionField]="displayField" (typeaheadOnSelect)="typeaheadOnSelect($event)"
|
|
61
|
-
(typeaheadNoResults)="typeaheadOnNoMatch($event)" [typeaheadMinLength]="minLengthBeforeOptions"
|
|
62
|
-
[typeaheadScrollable]="scrollableOptions" [typeaheadLatinize]="true"
|
|
63
|
-
[typeaheadItemTemplate]="itemTemplateWithoutImage"
|
|
64
|
-
[typeaheadOptionsInScrollableView]="scrollableOptionsInView"
|
|
65
|
-
[disabled]="!canAddTags || maximumOfTagsReached()" [hidden]="!canAddTags || maximumOfTagsReached()"
|
|
66
|
-
(blur)="onBlur()" autocomplete="off"
|
|
67
|
-
#tagInput />
|
|
68
|
-
</span>
|
|
69
|
-
|
|
70
|
-
<span *ngSwitchCase="tagInputViewEnum.WithInitial">
|
|
71
|
-
<input *ngIf="(options !== null)" class="tags-input__input-field" type="text" [placeholder]="getPlaceholder()"
|
|
72
|
-
name="tags" (keydown.backspace)="removeLastTag(tagInput)" [(ngModel)]="selected" [typeahead]="options"
|
|
73
|
-
[typeaheadOptionField]="displayField" (typeaheadOnSelect)="typeaheadOnSelect($event)"
|
|
74
|
-
(typeaheadNoResults)="typeaheadOnNoMatch($event)" [typeaheadMinLength]="minLengthBeforeOptions"
|
|
75
|
-
[typeaheadScrollable]="scrollableOptions" [typeaheadLatinize]="true"
|
|
76
|
-
[typeaheadItemTemplate]="itemTemplateWithoutInitial"
|
|
77
|
-
[typeaheadOptionsInScrollableView]="scrollableOptionsInView"
|
|
78
|
-
[disabled]="!canAddTags || maximumOfTagsReached()" [hidden]="!canAddTags || maximumOfTagsReached()"
|
|
79
|
-
(blur)="onBlur()" autocomplete="off"
|
|
80
|
-
#tagInput />
|
|
81
|
-
</span>
|
|
82
|
-
|
|
83
|
-
<span *ngSwitchDefault>
|
|
84
|
-
<input *ngIf="(options !== null)" class="tags-input__input-field" type="text" [placeholder]="getPlaceholder()"
|
|
85
|
-
name="tags" (keydown.backspace)="removeLastTag(tagInput)" [(ngModel)]="selected" [typeahead]="options"
|
|
86
|
-
[typeaheadOptionField]="displayField" (typeaheadOnSelect)="typeaheadOnSelect($event)"
|
|
87
|
-
(typeaheadNoResults)="typeaheadOnNoMatch($event)" [typeaheadMinLength]="minLengthBeforeOptions"
|
|
88
|
-
[typeaheadScrollable]="scrollableOptions" [typeaheadLatinize]="true"
|
|
89
|
-
[typeaheadItemTemplate]="itemTemplateWithoutImage"
|
|
90
|
-
[typeaheadOptionsInScrollableView]="scrollableOptionsInView"
|
|
91
|
-
[disabled]="!canAddTags || maximumOfTagsReached()" [hidden]="!canAddTags || maximumOfTagsReached()"
|
|
92
|
-
(blur)="onBlur()" autocomplete="off"
|
|
93
|
-
#tagInput />
|
|
94
|
-
</span>
|
|
95
|
-
|
|
96
|
-
</span>
|
|
97
|
-
|
|
98
|
-
</ng-template>
|
|
99
|
-
|
|
100
|
-
<ng-template #itemTemplateWithImage let-model="item" let-index="index">
|
|
101
|
-
<img
|
|
102
|
-
style="border-radius:50%; height:40px; width: 40px; float:left; margin-left:5px ; margin-top: 5px;margin-right: 5px;"
|
|
103
|
-
src="{{(model.imageURL?model.imageURL:defaultImageURL)}}" />
|
|
104
|
-
<div>
|
|
105
|
-
<a [innerHTML]="model.name"></a>
|
|
106
|
-
<p *ngIf="showDescription">
|
|
107
|
-
{{model.description}}
|
|
108
|
-
</p>
|
|
109
|
-
</div>
|
|
110
|
-
</ng-template>
|
|
111
|
-
|
|
112
|
-
<ng-template #itemTemplateWithoutImage let-model="item" let-index="index">
|
|
113
|
-
<div>
|
|
114
|
-
<a [innerHTML]="model.name"></a>
|
|
115
|
-
<p *ngIf="showDescription">
|
|
116
|
-
{{model.description}}
|
|
117
|
-
</p>
|
|
118
|
-
</div>
|
|
119
|
-
</ng-template>
|
|
120
|
-
|
|
121
|
-
<ng-template #itemTemplateWithoutInitial let-model="item" let-index="index">
|
|
122
|
-
<div class="user-image">
|
|
123
|
-
<div class="user-initials">{{calculateInitials(model.name)}}</div>
|
|
124
|
-
</div>
|
|
125
|
-
<div>
|
|
126
|
-
<a [innerHTML]="model.name"></a>
|
|
127
|
-
<p *ngIf="showDescription">
|
|
128
|
-
{{model.description}}
|
|
129
|
-
</p>
|
|
130
|
-
</div>
|
|
131
|
-
</ng-template>
|
|
132
|
-
</div>
|
|
133
|
-
`;
|
|
134
|
-
const TAGS_INPUT_STYLE = `
|
|
135
|
-
:host {
|
|
136
|
-
overflow: auto;
|
|
137
|
-
white-space: nowrap;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
.tags-input {
|
|
141
|
-
align-items: center;
|
|
142
|
-
display: flex;
|
|
143
|
-
flex-wrap: wrap;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
.tags-input__tag {
|
|
147
|
-
display: inline-block;
|
|
148
|
-
margin-bottom: 2px;
|
|
149
|
-
margin-right: 5px;
|
|
150
|
-
padding-right: 0.3em;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
.tags-input__tag-remove-btn {
|
|
154
|
-
cursor: pointer;
|
|
155
|
-
display: inline-block;
|
|
156
|
-
font-size: 12px;
|
|
157
|
-
margin: -3px 0 0 3px;
|
|
158
|
-
padding: 0;
|
|
159
|
-
vertical-align: top;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
.tags-input__input-field {
|
|
163
|
-
border: none;
|
|
164
|
-
flex-grow: 1;
|
|
165
|
-
outline: none;
|
|
166
|
-
}
|
|
167
|
-
`;
|
|
168
|
-
const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = {
|
|
169
|
-
provide: NG_VALUE_ACCESSOR,
|
|
170
|
-
useExisting: forwardRef(() => BTagsInputComponent),
|
|
171
|
-
multi: true
|
|
172
|
-
};
|
|
173
|
-
export class BTagsInputComponent {
|
|
174
|
-
constructor() {
|
|
175
|
-
this.selected = '';
|
|
176
|
-
this.tags = [];
|
|
177
|
-
this.onTouchedCallback = noop;
|
|
178
|
-
this.onChangeCallback = noop;
|
|
179
|
-
this.tagInputViewEnum = TagInputView;
|
|
180
|
-
this.removeLastOnBackspace = false;
|
|
181
|
-
this.canDeleteTags = true;
|
|
182
|
-
this.canAddTags = true;
|
|
183
|
-
this.ViewMode = TagInputView.WithoutImage;
|
|
184
|
-
this.placeholder = '';
|
|
185
|
-
this.showDescription = true;
|
|
186
|
-
this.options = null;
|
|
187
|
-
this.defaultImageURL = null;
|
|
188
|
-
this.displayField = 'name';
|
|
189
|
-
this.minLengthBeforeOptions = 1;
|
|
190
|
-
this.scrollableOptions = false;
|
|
191
|
-
this.scrollableOptionsInView = 5;
|
|
192
|
-
this.onTagsChanged = new EventEmitter();
|
|
193
|
-
this.onMaxTagsReached = new EventEmitter();
|
|
194
|
-
this.onNoOptionsMatch = new EventEmitter();
|
|
195
|
-
this.onBlurInput = new EventEmitter();
|
|
196
|
-
}
|
|
197
|
-
getPlaceholder() {
|
|
198
|
-
if (this.tags && this.tags.length > 0) {
|
|
199
|
-
return '';
|
|
200
|
-
}
|
|
201
|
-
return this.placeholder;
|
|
202
|
-
}
|
|
203
|
-
tagsChanged(type, tag) {
|
|
204
|
-
this.onChangeCallback(this.tags);
|
|
205
|
-
this.onTagsChanged.emit({
|
|
206
|
-
change: type,
|
|
207
|
-
tag: tag
|
|
208
|
-
});
|
|
209
|
-
if (this.maximumOfTagsReached()) {
|
|
210
|
-
this.onMaxTagsReached.emit();
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
removeLastTag(tagInput) {
|
|
214
|
-
if (!this.removeLastOnBackspace || !this.tags?.length) {
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
if (tagInput.value === '') {
|
|
218
|
-
this.removeTag(this.tags[this.tags.length - 1]);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
addTag(tagInput) {
|
|
222
|
-
if (tagInput.value.trim() !== '') {
|
|
223
|
-
let tag = {
|
|
224
|
-
[this.displayField]: tagInput.value
|
|
225
|
-
};
|
|
226
|
-
this.addPredefinedTag(tag);
|
|
227
|
-
}
|
|
228
|
-
tagInput.value = '';
|
|
229
|
-
}
|
|
230
|
-
addPredefinedTag(tag) {
|
|
231
|
-
if (this.tags == null)
|
|
232
|
-
this.tags = [];
|
|
233
|
-
if (!this.maximumOfTagsReached()) {
|
|
234
|
-
this.tags.push(tag);
|
|
235
|
-
this.tagsChanged('add', tag);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
removeTag(tagToRemove) {
|
|
239
|
-
if (!this.isDeleteable(tagToRemove)) {
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
this.tags = this.tags.filter(tag => tagToRemove !== tag);
|
|
243
|
-
this.tagsChanged('remove', tagToRemove);
|
|
244
|
-
}
|
|
245
|
-
maximumOfTagsReached() {
|
|
246
|
-
return typeof this.maxTags !== 'undefined' && this.tags && this.tags.length >= this.maxTags;
|
|
247
|
-
}
|
|
248
|
-
isDeleteable(tag) {
|
|
249
|
-
if (typeof tag.deleteable !== "undefined" && !tag.deleteable) {
|
|
250
|
-
return false;
|
|
251
|
-
}
|
|
252
|
-
return this.canDeleteTags;
|
|
253
|
-
}
|
|
254
|
-
typeaheadOnSelect(e) {
|
|
255
|
-
if (typeof e.item === 'string') {
|
|
256
|
-
this.addPredefinedTag({
|
|
257
|
-
[this.displayField]: e.value
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
else {
|
|
261
|
-
this.addPredefinedTag(e.item);
|
|
262
|
-
}
|
|
263
|
-
this.selected = '';
|
|
264
|
-
}
|
|
265
|
-
typeaheadOnNoMatch(e) {
|
|
266
|
-
if (typeof this.onNoOptionsMatch !== 'undefined') {
|
|
267
|
-
this.onNoOptionsMatch.emit(e);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
writeValue(value) {
|
|
271
|
-
if (value !== this.tags) {
|
|
272
|
-
this.tags = value;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
registerOnChange(fn) {
|
|
276
|
-
this.onChangeCallback = fn;
|
|
277
|
-
}
|
|
278
|
-
registerOnTouched(fn) {
|
|
279
|
-
this.onTouchedCallback = fn;
|
|
280
|
-
}
|
|
281
|
-
calculateInitials(name) {
|
|
282
|
-
var fullName = name.split(' ');
|
|
283
|
-
var initials = "";
|
|
284
|
-
if (fullName.length > 1)
|
|
285
|
-
initials = fullName.shift().charAt(0) + fullName.pop().charAt(0);
|
|
286
|
-
else
|
|
287
|
-
initials = fullName.shift().charAt(0);
|
|
288
|
-
return initials.toUpperCase();
|
|
289
|
-
}
|
|
290
|
-
onBlur() {
|
|
291
|
-
this.onBlurInput.emit();
|
|
292
|
-
}
|
|
293
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BTagsInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
294
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BTagsInputComponent, isStandalone: true, selector: "b-tags-input", inputs: { maxTags: "maxTags", removeLastOnBackspace: "removeLastOnBackspace", canDeleteTags: "canDeleteTags", canAddTags: "canAddTags", ViewMode: "ViewMode", placeholder: "placeholder", showDescription: "showDescription", options: "options", defaultImageURL: "defaultImageURL", minLengthBeforeOptions: "minLengthBeforeOptions", scrollableOptions: "scrollableOptions", scrollableOptionsInView: "scrollableOptionsInView" }, outputs: { onTagsChanged: "onTagsChanged", onMaxTagsReached: "onMaxTagsReached", onNoOptionsMatch: "onNoOptionsMatch", onBlurInput: "onBlurInput" }, providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR], ngImport: i0, template: "\n\n<div class=\"tags-input\">\n<span class=\"tags-input__tag label label-primary badge badge-primary\" *ngFor=\"let tag of tags\">\n\n<span [ngSwitch]=\"ViewMode\">\n<span *ngSwitchCase=\"tagInputViewEnum.WithImage\">\n<img style=\"border-radius:50%; height:40px; width: 40px; float:left; margin-left:5px ; margin-top: 5px;margin-right: 5px;\"\nsrc=\"{{(tag.imageURL?tag.imageURL:defaultImageURL)}}\" />\n</span>\n\n<span *ngSwitchCase=\"tagInputViewEnum.WithInitial\">\n<div class=\"user-initials\">{{calculateInitials(tag.name)}}</div>\n</span>\n\n<span *ngSwitchDefault>\n</span>\n\n</span>\n {{tag[displayField]}}\n <span *ngIf=\"isDeleteable(tag)\" role=\"button\" class=\"tags-input__tag-remove-btn\" (click)=\"removeTag(tag)\"\n (touch)=\"removeTag(tag)\">\n <span aria-hidden=\"true\">×</span>\n <span class=\"sr-only\">Close</span>\n </span>\n</span>\n\n<input *ngIf=\"options === null; else withTypeahead\" class=\"tags-input__input-field\" type=\"text\"\n [placeholder]=\"getPlaceholder()\" name=\"tags\" (keyup.enter)=\"addTag(tagInput)\"\n (keydown.backspace)=\"removeLastTag(tagInput)\" [disabled]=\"!canAddTags || maximumOfTagsReached()\"\n [hidden]=\"!canAddTags || maximumOfTagsReached()\" #tagInput />\n\n<ng-template #withTypeahead>\n <span [ngSwitch]=\"ViewMode\">\n <span *ngSwitchCase=\"tagInputViewEnum.WithImage\">\n <input *ngIf=\"(options !== null)\" class=\"tags-input__input-field\" type=\"text\" [placeholder]=\"getPlaceholder()\"\n name=\"tags\" (keydown.backspace)=\"removeLastTag(tagInput)\" [(ngModel)]=\"selected\" [typeahead]=\"options\"\n [typeaheadOptionField]=\"displayField\" (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n (typeaheadNoResults)=\"typeaheadOnNoMatch($event)\" [typeaheadMinLength]=\"minLengthBeforeOptions\"\n [typeaheadScrollable]=\"scrollableOptions\" [typeaheadLatinize]=\"true\"\n [typeaheadItemTemplate]=\"itemTemplateWithImage\" [typeaheadOptionsInScrollableView]=\"scrollableOptionsInView\"\n [disabled]=\"!canAddTags || maximumOfTagsReached()\" [hidden]=\"!canAddTags || maximumOfTagsReached()\"\n (blur)=\"onBlur()\" autocomplete=\"off\"\n #tagInput />\n </span>\n\n <span *ngSwitchCase=\"tagInputViewEnum.WithoutImage\">\n <input *ngIf=\"(options !== null)\" class=\"tags-input__input-field\" type=\"text\" [placeholder]=\"getPlaceholder()\"\n name=\"tags\" (keydown.backspace)=\"removeLastTag(tagInput)\" [(ngModel)]=\"selected\" [typeahead]=\"options\"\n [typeaheadOptionField]=\"displayField\" (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n (typeaheadNoResults)=\"typeaheadOnNoMatch($event)\" [typeaheadMinLength]=\"minLengthBeforeOptions\"\n [typeaheadScrollable]=\"scrollableOptions\" [typeaheadLatinize]=\"true\"\n [typeaheadItemTemplate]=\"itemTemplateWithoutImage\"\n [typeaheadOptionsInScrollableView]=\"scrollableOptionsInView\"\n [disabled]=\"!canAddTags || maximumOfTagsReached()\" [hidden]=\"!canAddTags || maximumOfTagsReached()\"\n (blur)=\"onBlur()\" autocomplete=\"off\"\n #tagInput />\n </span>\n\n <span *ngSwitchCase=\"tagInputViewEnum.WithInitial\">\n <input *ngIf=\"(options !== null)\" class=\"tags-input__input-field\" type=\"text\" [placeholder]=\"getPlaceholder()\"\n name=\"tags\" (keydown.backspace)=\"removeLastTag(tagInput)\" [(ngModel)]=\"selected\" [typeahead]=\"options\"\n [typeaheadOptionField]=\"displayField\" (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n (typeaheadNoResults)=\"typeaheadOnNoMatch($event)\" [typeaheadMinLength]=\"minLengthBeforeOptions\"\n [typeaheadScrollable]=\"scrollableOptions\" [typeaheadLatinize]=\"true\"\n [typeaheadItemTemplate]=\"itemTemplateWithoutInitial\"\n [typeaheadOptionsInScrollableView]=\"scrollableOptionsInView\"\n [disabled]=\"!canAddTags || maximumOfTagsReached()\" [hidden]=\"!canAddTags || maximumOfTagsReached()\"\n (blur)=\"onBlur()\" autocomplete=\"off\"\n #tagInput />\n </span>\n\n <span *ngSwitchDefault>\n <input *ngIf=\"(options !== null)\" class=\"tags-input__input-field\" type=\"text\" [placeholder]=\"getPlaceholder()\"\n name=\"tags\" (keydown.backspace)=\"removeLastTag(tagInput)\" [(ngModel)]=\"selected\" [typeahead]=\"options\"\n [typeaheadOptionField]=\"displayField\" (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n (typeaheadNoResults)=\"typeaheadOnNoMatch($event)\" [typeaheadMinLength]=\"minLengthBeforeOptions\"\n [typeaheadScrollable]=\"scrollableOptions\" [typeaheadLatinize]=\"true\"\n [typeaheadItemTemplate]=\"itemTemplateWithoutImage\"\n [typeaheadOptionsInScrollableView]=\"scrollableOptionsInView\"\n [disabled]=\"!canAddTags || maximumOfTagsReached()\" [hidden]=\"!canAddTags || maximumOfTagsReached()\"\n (blur)=\"onBlur()\" autocomplete=\"off\"\n #tagInput />\n </span>\n\n </span>\n\n</ng-template>\n\n<ng-template #itemTemplateWithImage let-model=\"item\" let-index=\"index\">\n <img\n style=\"border-radius:50%; height:40px; width: 40px; float:left; margin-left:5px ; margin-top: 5px;margin-right: 5px;\"\n src=\"{{(model.imageURL?model.imageURL:defaultImageURL)}}\" />\n <div>\n <a [innerHTML]=\"model.name\"></a>\n <p *ngIf=\"showDescription\">\n {{model.description}}\n </p>\n </div>\n</ng-template>\n\n<ng-template #itemTemplateWithoutImage let-model=\"item\" let-index=\"index\">\n <div>\n <a [innerHTML]=\"model.name\"></a>\n <p *ngIf=\"showDescription\">\n {{model.description}}\n </p>\n </div>\n</ng-template>\n\n<ng-template #itemTemplateWithoutInitial let-model=\"item\" let-index=\"index\">\n <div class=\"user-image\">\n <div class=\"user-initials\">{{calculateInitials(model.name)}}</div>\n </div>\n <div>\n <a [innerHTML]=\"model.name\"></a>\n <p *ngIf=\"showDescription\">\n {{model.description}}\n </p>\n </div>\n</ng-template>\n</div>\n", isInline: true, styles: [":host{overflow:auto;white-space:nowrap}.tags-input{align-items:center;display:flex;flex-wrap:wrap}.tags-input__tag{display:inline-block;margin-bottom:2px;margin-right:5px;padding-right:.3em}.tags-input__tag-remove-btn{cursor:pointer;display:inline-block;font-size:12px;margin:-3px 0 0 3px;padding:0;vertical-align:top}.tags-input__input-field{border:none;flex-grow:1;outline:none}\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"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TypeaheadModule }, { kind: "directive", type: i3.TypeaheadDirective, selector: "[typeahead]", inputs: ["typeahead", "typeaheadMinLength", "adaptivePosition", "isAnimated", "typeaheadWaitMs", "typeaheadOptionsLimit", "typeaheadOptionField", "typeaheadGroupField", "typeaheadOrderBy", "typeaheadAsync", "typeaheadLatinize", "typeaheadSingleWords", "typeaheadWordDelimiters", "typeaheadMultipleSearch", "typeaheadMultipleSearchDelimiters", "typeaheadPhraseDelimiters", "typeaheadItemTemplate", "optionsListTemplate", "typeaheadScrollable", "typeaheadOptionsInScrollableView", "typeaheadHideResultsOnBlur", "typeaheadSelectFirstItem", "typeaheadIsFirstItemActive", "container", "dropup"], outputs: ["typeaheadLoading", "typeaheadNoResults", "typeaheadOnSelect", "typeaheadOnPreview", "typeaheadOnBlur"], exportAs: ["bs-typeahead"] }] }); }
|
|
295
|
-
}
|
|
296
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BTagsInputComponent, decorators: [{
|
|
297
|
-
type: Component,
|
|
298
|
-
args: [{ selector: 'b-tags-input', template: TAGS_INPUT_TEMPLATE, providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR], standalone: true, imports: [
|
|
299
|
-
CommonModule,
|
|
300
|
-
FormsModule,
|
|
301
|
-
TypeaheadModule
|
|
302
|
-
], styles: [":host{overflow:auto;white-space:nowrap}.tags-input{align-items:center;display:flex;flex-wrap:wrap}.tags-input__tag{display:inline-block;margin-bottom:2px;margin-right:5px;padding-right:.3em}.tags-input__tag-remove-btn{cursor:pointer;display:inline-block;font-size:12px;margin:-3px 0 0 3px;padding:0;vertical-align:top}.tags-input__input-field{border:none;flex-grow:1;outline:none}\n"] }]
|
|
303
|
-
}], propDecorators: { maxTags: [{
|
|
304
|
-
type: Input
|
|
305
|
-
}], removeLastOnBackspace: [{
|
|
306
|
-
type: Input
|
|
307
|
-
}], canDeleteTags: [{
|
|
308
|
-
type: Input
|
|
309
|
-
}], canAddTags: [{
|
|
310
|
-
type: Input
|
|
311
|
-
}], ViewMode: [{
|
|
312
|
-
type: Input
|
|
313
|
-
}], placeholder: [{
|
|
314
|
-
type: Input
|
|
315
|
-
}], showDescription: [{
|
|
316
|
-
type: Input
|
|
317
|
-
}], options: [{
|
|
318
|
-
type: Input
|
|
319
|
-
}], defaultImageURL: [{
|
|
320
|
-
type: Input
|
|
321
|
-
}], minLengthBeforeOptions: [{
|
|
322
|
-
type: Input
|
|
323
|
-
}], scrollableOptions: [{
|
|
324
|
-
type: Input
|
|
325
|
-
}], scrollableOptionsInView: [{
|
|
326
|
-
type: Input
|
|
327
|
-
}], onTagsChanged: [{
|
|
328
|
-
type: Output
|
|
329
|
-
}], onMaxTagsReached: [{
|
|
330
|
-
type: Output
|
|
331
|
-
}], onNoOptionsMatch: [{
|
|
332
|
-
type: Output
|
|
333
|
-
}], onBlurInput: [{
|
|
334
|
-
type: Output
|
|
335
|
-
}] } });
|
|
336
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdGFnLWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL1NoYXJlZC9Db21wb25lbnRzL25nLXRhZy1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7QUFFckQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRXZCLE1BQU0sbUJBQW1CLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEgzQixDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUN4QixDQUFDO0FBRUYsTUFBTSxtQ0FBbUMsR0FBUTtJQUMvQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUM7SUFDbEQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBbUJGLE1BQU0sT0FBTyxtQkFBbUI7SUFaaEM7UUFjRSxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ2Ys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QW1DLENBQUMsY0FDcEMsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxlQUFlO3FCQUNoQjs4QkFTUSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDSSxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFR5cGVhaGVhZE1vZHVsZSwgVHlwZWFoZWFkTWF0Y2ggfSBmcm9tICduZ3gtYm9vdHN0cmFwL3R5cGVhaGVhZCc7XHJcbmltcG9ydCB7IFRhZ0lucHV0VmlldyB9IGZyb20gJy4uL0VudW1zL1RhZ0lucHV0Vmlldyc7XHJcblxyXG5jb25zdCBub29wID0gKCkgPT4geyB9O1xyXG5cclxuY29uc3QgVEFHU19JTlBVVF9URU1QTEFURSA9IGBcclxuXHJcbjxkaXYgY2xhc3M9XCJ0YWdzLWlucHV0XCI+XHJcbjxzcGFuIGNsYXNzPVwidGFncy1pbnB1dF9fdGFnIGxhYmVsIGxhYmVsLXByaW1hcnkgYmFkZ2UgYmFkZ2UtcHJpbWFyeVwiICpuZ0Zvcj1cImxldCB0YWcgb2YgdGFnc1wiPlxyXG5cclxuPHNwYW4gW25nU3dpdGNoXT1cIlZpZXdNb2RlXCI+XHJcbjxzcGFuICpuZ1N3aXRjaENhc2U9XCJ0YWdJbnB1dFZpZXdFbnVtLldpdGhJbWFnZVwiPlxyXG48aW1nIHN0eWxlPVwiYm9yZGVyLXJhZGl1czo1MCU7IGhlaWdodDo0MHB4OyB3aWR0aDogNDBweDsgZmxvYXQ6bGVmdDsgbWFyZ2luLWxlZnQ6NXB4IDsgbWFyZ2luLXRvcDogNXB4O21hcmdpbi1yaWdodDogNXB4O1wiXHJcbnNyYz1cInt7KHRhZy5pbWFnZVVSTD90YWcuaW1hZ2VVUkw6ZGVmYXVsdEltYWdlVVJMKX19XCIgLz5cclxuPC9zcGFuPlxyXG5cclxuPHNwYW4gKm5nU3dpdGNoQ2FzZT1cInRhZ0lucHV0Vmlld0VudW0uV2l0aEluaXRpYWxcIj5cclxuPGRpdiBjbGFzcz1cInVzZXItaW5pdGlhbHNcIj57e2NhbGN1bGF0ZUluaXRpYWxzKHRhZy5uYW1lKX19PC9kaXY+XHJcbjwvc3Bhbj5cclxuXHJcbjxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+XHJcbjwvc3Bhbj5cclxuXHJcbjwvc3Bhbj5cclxuICB7e3RhZ1tkaXNwbGF5RmllbGRdfX1cclxuICA8c3BhbiAqbmdJZj1cImlzRGVsZXRlYWJsZSh0YWcpXCIgcm9sZT1cImJ1dHRvblwiIGNsYXNzPVwidGFncy1pbnB1dF9fdGFnLXJlbW92ZS1idG5cIiAoY2xpY2spPVwicmVtb3ZlVGFnKHRhZylcIlxyXG4gICAgKHRvdWNoKT1cInJlbW92ZVRhZyh0YWcpXCI+XHJcbiAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgPC9zcGFuPlxyXG48L3NwYW4+XHJcblxyXG48aW5wdXQgKm5nSWY9XCJvcHRpb25zID09PSBudWxsOyBlbHNlIHdpdGhUeXBlYWhlYWRcIiBjbGFzcz1cInRhZ3MtaW5wdXRfX2lucHV0LWZpZWxkXCIgdHlwZT1cInRleHRcIlxyXG4gIFtwbGFjZWhvbGRlcl09XCJnZXRQbGFjZWhvbGRlcigpXCIgbmFtZT1cInRhZ3NcIiAoa2V5dXAuZW50ZXIpPVwiYWRkVGFnKHRhZ0lucHV0KVwiXHJcbiAgKGtleWRvd24uYmFja3NwYWNlKT1cInJlbW92ZUxhc3RUYWcodGFnSW5wdXQpXCIgW2Rpc2FibGVkXT1cIiFjYW5BZGRUYWdzIHx8IG1heGltdW1PZlRhZ3NSZWFjaGVkKClcIlxyXG4gIFtoaWRkZW5dPVwiIWNhbkFkZFRhZ3MgfHwgbWF4aW11bU9mVGFnc1JlYWNoZWQoKVwiICN0YWdJbnB1dCAvPlxyXG5cclxuPG5nLXRlbXBsYXRlICN3aXRoVHlwZWFoZWFkPlxyXG4gIDxzcGFuIFtuZ1N3aXRjaF09XCJWaWV3TW9kZVwiPlxyXG4gICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cInRhZ0lucHV0Vmlld0VudW0uV2l0aEltYWdlXCI+XHJcbiAgICAgIDxpbnB1dCAqbmdJZj1cIihvcHRpb25zICE9PSBudWxsKVwiIGNsYXNzPVwidGFncy1pbnB1dF9faW5wdXQtZmllbGRcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJnZXRQbGFjZWhvbGRlcigpXCJcclxuICAgICAgICBuYW1lPVwidGFnc1wiIChrZXlkb3duLmJhY2tzcGFjZSk9XCJyZW1vdmVMYXN0VGFnKHRhZ0lucHV0KVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRcIiBbdHlwZWFoZWFkXT1cIm9wdGlvbnNcIlxyXG4gICAgICAgIFt0eXBlYWhlYWRPcHRpb25GaWVsZF09XCJkaXNwbGF5RmllbGRcIiAodHlwZWFoZWFkT25TZWxlY3QpPVwidHlwZWFoZWFkT25TZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgKHR5cGVhaGVhZE5vUmVzdWx0cyk9XCJ0eXBlYWhlYWRPbk5vTWF0Y2goJGV2ZW50KVwiIFt0eXBlYWhlYWRNaW5MZW5ndGhdPVwibWluTGVuZ3RoQmVmb3JlT3B0aW9uc1wiXHJcbiAgICAgICAgW3R5cGVhaGVhZFNjcm9sbGFibGVdPVwic2Nyb2xsYWJsZU9wdGlvbnNcIiBbdHlwZWFoZWFkTGF0aW5pemVdPVwidHJ1ZVwiXHJcbiAgICAgICAgW3R5cGVhaGVhZEl0ZW1UZW1wbGF0ZV09XCJpdGVtVGVtcGxhdGVXaXRoSW1hZ2VcIiBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwic2Nyb2xsYWJsZU9wdGlvbnNJblZpZXdcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkVGFncyB8fCBtYXhpbXVtT2ZUYWdzUmVhY2hlZCgpXCIgW2hpZGRlbl09XCIhY2FuQWRkVGFncyB8fCBtYXhpbXVtT2ZUYWdzUmVhY2hlZCgpXCJcclxuICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICN0YWdJbnB1dCAvPlxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCJ0YWdJbnB1dFZpZXdFbnVtLldpdGhvdXRJbWFnZVwiPlxyXG4gICAgICA8aW5wdXQgKm5nSWY9XCIob3B0aW9ucyAhPT0gbnVsbClcIiBjbGFzcz1cInRhZ3MtaW5wdXRfX2lucHV0LWZpZWxkXCIgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwiZ2V0UGxhY2Vob2xkZXIoKVwiXHJcbiAgICAgICAgbmFtZT1cInRhZ3NcIiAoa2V5ZG93bi5iYWNrc3BhY2UpPVwicmVtb3ZlTGFzdFRhZyh0YWdJbnB1dClcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkXCIgW3R5cGVhaGVhZF09XCJvcHRpb25zXCJcclxuICAgICAgICBbdHlwZWFoZWFkT3B0aW9uRmllbGRdPVwiZGlzcGxheUZpZWxkXCIgKHR5cGVhaGVhZE9uU2VsZWN0KT1cInR5cGVhaGVhZE9uU2VsZWN0KCRldmVudClcIlxyXG4gICAgICAgICh0eXBlYWhlYWROb1Jlc3VsdHMpPVwidHlwZWFoZWFkT25Ob01hdGNoKCRldmVudClcIiBbdHlwZWFoZWFkTWluTGVuZ3RoXT1cIm1pbkxlbmd0aEJlZm9yZU9wdGlvbnNcIlxyXG4gICAgICAgIFt0eXBlYWhlYWRTY3JvbGxhYmxlXT1cInNjcm9sbGFibGVPcHRpb25zXCIgW3R5cGVhaGVhZExhdGluaXplXT1cInRydWVcIlxyXG4gICAgICAgIFt0eXBlYWhlYWRJdGVtVGVtcGxhdGVdPVwiaXRlbVRlbXBsYXRlV2l0aG91dEltYWdlXCJcclxuICAgICAgICBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwic2Nyb2xsYWJsZU9wdGlvbnNJblZpZXdcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkVGFncyB8fCBtYXhpbXVtT2ZUYWdzUmVhY2hlZCgpXCIgW2hpZGRlbl09XCIhY2FuQWRkVGFncyB8fCBtYXhpbXVtT2ZUYWdzUmVhY2hlZCgpXCJcclxuICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgI3RhZ0lucHV0IC8+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cInRhZ0lucHV0Vmlld0VudW0uV2l0aEluaXRpYWxcIj5cclxuICAgICAgPGlucHV0ICpuZ0lmPVwiKG9wdGlvbnMgIT09IG51bGwpXCIgY2xhc3M9XCJ0YWdzLWlucHV0X19pbnB1dC1maWVsZFwiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxyXG4gICAgICAgIG5hbWU9XCJ0YWdzXCIgKGtleWRvd24uYmFja3NwYWNlKT1cInJlbW92ZUxhc3RUYWcodGFnSW5wdXQpXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFwiIFt0eXBlYWhlYWRdPVwib3B0aW9uc1wiXHJcbiAgICAgICAgW3R5cGVhaGVhZE9wdGlvbkZpZWxkXT1cImRpc3BsYXlGaWVsZFwiICh0eXBlYWhlYWRPblNlbGVjdCk9XCJ0eXBlYWhlYWRPblNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAodHlwZWFoZWFkTm9SZXN1bHRzKT1cInR5cGVhaGVhZE9uTm9NYXRjaCgkZXZlbnQpXCIgW3R5cGVhaGVhZE1pbkxlbmd0aF09XCJtaW5MZW5ndGhCZWZvcmVPcHRpb25zXCJcclxuICAgICAgICBbdHlwZWFoZWFkU2Nyb2xsYWJsZV09XCJzY3JvbGxhYmxlT3B0aW9uc1wiIFt0eXBlYWhlYWRMYXRpbml6ZV09XCJ0cnVlXCJcclxuICAgICAgICBbdHlwZWFoZWFkSXRlbVRlbXBsYXRlXT1cIml0ZW1UZW1wbGF0ZVdpdGhvdXRJbml0aWFsXCJcclxuICAgICAgICBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwic2Nyb2xsYWJsZU9wdGlvbnNJblZpZXdcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhY2FuQWRkVGFncyB8fCBtYXhpbXVtT2ZUYWdzUmVhY2hlZCgpXCIgW2hpZGRlbl09XCIhY2FuQWRkVGFncyB8fCBtYXhpbXVtT2ZUYWdzUmVhY2hlZCgpXCJcclxuICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgI3RhZ0lucHV0IC8+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgPGlucHV0ICpuZ0lmPVwiKG9wdGlvbnMgIT09IG51bGwpXCIgY2xhc3M9XCJ0YWdzLWlucHV0X19pbnB1dC1maWVsZFwiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxyXG4gICAgICAgIG5hbWU9XCJ0YWdzXCIgKGtleWRvd24uYmFja3NwYWNlKT1cInJlbW92ZUxhc3RUYWcodGFnSW5wdXQpXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFwiIFt0eXBlYWhlYWRdPVwib3B0aW9uc1wiXHJcbiAgICAgICAgW3R5cGVhaGVhZE9wdGlvbkZpZWxkXT1cImRpc3BsYXlGaWVsZFwiICh0eXBlYWhlYWRPblNlbGVjdCk9XCJ0eXBlYWhlYWRPblNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAodHlwZWFoZWFkTm9SZXN1bHRzKT1cInR5cGVhaGVhZE9uTm9NYXRjaCgkZXZlbnQpXCIgW3R5cGVhaGVhZE1pbkxlbmd0aF09XCJtaW5MZW5ndGhCZWZvcmVPcHRpb25zXCJcclxuICAgICAgICBbdHlwZWFoZWFkU2Nyb2xsYWJsZV09XCJzY3JvbGxhYmxlT3B0aW9uc1wiIFt0eXBlYWhlYWRMYXRpbml6ZV09XCJ0cnVlXCJcclxuICAgICAgICBbdHlwZWFoZWFkSXRlbVRlbXBsYXRlXT1cIml0ZW1UZW1wbGF0ZVdpdGhvdXRJbWFnZVwiXHJcbiAgICAgICAgW3R5cGVhaGVhZE9wdGlvbnNJblNjcm9sbGFibGVWaWV3XT1cInNjcm9sbGFibGVPcHRpb25zSW5WaWV3XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbkFkZFRhZ3MgfHwgbWF4aW11bU9mVGFnc1JlYWNoZWQoKVwiIFtoaWRkZW5dPVwiIWNhbkFkZFRhZ3MgfHwgbWF4aW11bU9mVGFnc1JlYWNoZWQoKVwiXHJcbiAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIiBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICN0YWdJbnB1dCAvPlxyXG4gICAgPC9zcGFuPlxyXG5cclxuICA8L3NwYW4+XHJcblxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNpdGVtVGVtcGxhdGVXaXRoSW1hZ2UgbGV0LW1vZGVsPVwiaXRlbVwiIGxldC1pbmRleD1cImluZGV4XCI+XHJcbiAgPGltZ1xyXG4gICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOjUwJTsgaGVpZ2h0OjQwcHg7IHdpZHRoOiA0MHB4OyBmbG9hdDpsZWZ0OyBtYXJnaW4tbGVmdDo1cHggOyBtYXJnaW4tdG9wOiA1cHg7bWFyZ2luLXJpZ2h0OiA1cHg7XCJcclxuICAgIHNyYz1cInt7KG1vZGVsLmltYWdlVVJMP21vZGVsLmltYWdlVVJMOmRlZmF1bHRJbWFnZVVSTCl9fVwiIC8+XHJcbiAgPGRpdj5cclxuICAgIDxhIFtpbm5lckhUTUxdPVwibW9kZWwubmFtZVwiPjwvYT5cclxuICAgIDxwICpuZ0lmPVwic2hvd0Rlc2NyaXB0aW9uXCI+XHJcbiAgICAgIHt7bW9kZWwuZGVzY3JpcHRpb259fVxyXG4gICAgPC9wPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNpdGVtVGVtcGxhdGVXaXRob3V0SW1hZ2UgbGV0LW1vZGVsPVwiaXRlbVwiIGxldC1pbmRleD1cImluZGV4XCI+XHJcbiAgPGRpdj5cclxuICAgIDxhIFtpbm5lckhUTUxdPVwibW9kZWwubmFtZVwiPjwvYT5cclxuICAgIDxwICpuZ0lmPVwic2hvd0Rlc2NyaXB0aW9uXCI+XHJcbiAgICAgIHt7bW9kZWwuZGVzY3JpcHRpb259fVxyXG4gICAgPC9wPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNpdGVtVGVtcGxhdGVXaXRob3V0SW5pdGlhbCBsZXQtbW9kZWw9XCJpdGVtXCIgbGV0LWluZGV4PVwiaW5kZXhcIj5cclxuICA8ZGl2IGNsYXNzPVwidXNlci1pbWFnZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInVzZXItaW5pdGlhbHNcIj57e2NhbGN1bGF0ZUluaXRpYWxzKG1vZGVsLm5hbWUpfX08L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2PlxyXG4gICAgPGEgW2lubmVySFRNTF09XCJtb2RlbC5uYW1lXCI+PC9hPlxyXG4gICAgPHAgKm5nSWY9XCJzaG93RGVzY3JpcHRpb25cIj5cclxuICAgICAge3ttb2RlbC5kZXNjcmlwdGlvbn19XHJcbiAgICA8L3A+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwvZGl2PlxyXG5gO1xyXG5cclxuY29uc3QgVEFHU19JTlBVVF9TVFlMRSA9IGBcclxuICAgIDpob3N0IHtcclxuICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfVxyXG5cclxuICAgIC50YWdzLWlucHV0IHtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xyXG4gICAgfVxyXG5cclxuICAgIC50YWdzLWlucHV0X190YWcge1xyXG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7XHJcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7XHJcbiAgICAgICAgcGFkZGluZy1yaWdodDogMC4zZW07XHJcbiAgICB9XHJcblxyXG4gICAgLnRhZ3MtaW5wdXRfX3RhZy1yZW1vdmUtYnRuIHtcclxuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgICBtYXJnaW46IC0zcHggMCAwIDNweDtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XHJcbiAgICB9XHJcblxyXG4gICAgLnRhZ3MtaW5wdXRfX2lucHV0LWZpZWxkIHtcclxuICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgZmxleC1ncm93OiAxO1xyXG4gICAgICAgIG91dGxpbmU6IG5vbmU7XHJcbiAgICB9XHJcbmA7XHJcblxyXG5jb25zdCBDVVNUT01fSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xyXG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJUYWdzSW5wdXRDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRhZ3NDaGFuZ2VkRXZlbnQge1xyXG4gIGNoYW5nZTogc3RyaW5nLFxyXG4gIHRhZzogYW55O1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ItdGFncy1pbnB1dCcsXHJcbiAgdGVtcGxhdGU6IFRBR1NfSU5QVVRfVEVNUExBVEUsXHJcbiAgc3R5bGVzOiBbVEFHU19JTlBVVF9TVFlMRV0sXHJcbiAgcHJvdmlkZXJzOiBbQ1VTVE9NX0lOUFVUX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBUeXBlYWhlYWRNb2R1bGVcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCVGFnc0lucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICBzZWxlY3RlZDogc3RyaW5nID0gJyc7XHJcbiAgcHVibGljIHRhZ3M6IEFycmF5PGFueT4gPSBbXTtcclxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcclxuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xyXG4gIHB1YmxpYyB0YWdJbnB1dFZpZXdFbnVtID0gVGFnSW5wdXRWaWV3O1xyXG4gIEBJbnB1dCgpIG1heFRhZ3M6IG51bWJlcjtcclxuICBASW5wdXQoKSByZW1vdmVMYXN0T25CYWNrc3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjYW5EZWxldGVUYWdzOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBjYW5BZGRUYWdzOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBWaWV3TW9kZTogVGFnSW5wdXRWaWV3ID0gVGFnSW5wdXRWaWV3LldpdGhvdXRJbWFnZTtcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgc2hvd0Rlc2NyaXB0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRJbWFnZVVSTDogYW55ID0gbnVsbDtcclxuICBkaXNwbGF5RmllbGQ6IHN0cmluZyA9ICduYW1lJztcclxuICBASW5wdXQoKSBtaW5MZW5ndGhCZWZvcmVPcHRpb25zOiBudW1iZXIgPSAxO1xyXG4gIEBJbnB1dCgpIHNjcm9sbGFibGVPcHRpb25zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2Nyb2xsYWJsZU9wdGlvbnNJblZpZXc6IG51bWJlciA9IDU7XHJcbiAgQE91dHB1dCgpIG9uVGFnc0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxUYWdzQ2hhbmdlZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25NYXhUYWdzUmVhY2hlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBvbk5vT3B0aW9uc01hdGNoOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uQmx1cklucHV0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgZ2V0UGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnRhZ3MgJiYgdGhpcy50YWdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXI7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRhZ3NDaGFuZ2VkKHR5cGU6IHN0cmluZywgdGFnOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLnRhZ3MpO1xyXG4gICAgdGhpcy5vblRhZ3NDaGFuZ2VkLmVtaXQoe1xyXG4gICAgICBjaGFuZ2U6IHR5cGUsXHJcbiAgICAgIHRhZzogdGFnXHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLm1heGltdW1PZlRhZ3NSZWFjaGVkKCkpIHtcclxuICAgICAgdGhpcy5vbk1heFRhZ3NSZWFjaGVkLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUxhc3RUYWcodGFnSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZW1vdmVMYXN0T25CYWNrc3BhY2UgfHwgIXRoaXMudGFncz8ubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGFnSW5wdXQudmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlVGFnKHRoaXMudGFnc1t0aGlzLnRhZ3MubGVuZ3RoIC0gMV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVGFnKHRhZ0lucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGFnSW5wdXQudmFsdWUudHJpbSgpICE9PSAnJykge1xyXG4gICAgICBsZXQgdGFnID0ge1xyXG4gICAgICAgIFt0aGlzLmRpc3BsYXlGaWVsZF06IHRhZ0lucHV0LnZhbHVlXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuYWRkUHJlZGVmaW5lZFRhZyh0YWcpO1xyXG4gICAgfVxyXG4gICAgdGFnSW5wdXQudmFsdWUgPSAnJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkUHJlZGVmaW5lZFRhZyh0YWc6IE9iamVjdCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGFncyA9PSBudWxsKVxyXG4gICAgICB0aGlzLnRhZ3MgPSBbXTtcclxuICAgIGlmICghdGhpcy5tYXhpbXVtT2ZUYWdzUmVhY2hlZCgpKSB7XHJcbiAgICAgIHRoaXMudGFncy5wdXNoKHRhZyk7XHJcbiAgICAgIHRoaXMudGFnc0NoYW5nZWQoJ2FkZCcsIHRhZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVUYWcodGFnVG9SZW1vdmU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzRGVsZXRlYWJsZSh0YWdUb1JlbW92ZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdzID0gdGhpcy50YWdzLmZpbHRlcih0YWcgPT4gdGFnVG9SZW1vdmUgIT09IHRhZyk7XHJcbiAgICB0aGlzLnRhZ3NDaGFuZ2VkKCdyZW1vdmUnLCB0YWdUb1JlbW92ZSk7XHJcbiAgfVxyXG5cclxuICBtYXhpbXVtT2ZUYWdzUmVhY2hlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXhUYWdzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnRhZ3MgJiYgdGhpcy50YWdzLmxlbmd0aCA+PSB0aGlzLm1heFRhZ3M7XHJcbiAgfVxyXG5cclxuICBpc0RlbGV0ZWFibGUodGFnOiBhbnkpIHtcclxuICAgIGlmICh0eXBlb2YgdGFnLmRlbGV0ZWFibGUgIT09IFwidW5kZWZpbmVkXCIgJiYgIXRhZy5kZWxldGVhYmxlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNhbkRlbGV0ZVRhZ3M7XHJcbiAgfVxyXG5cclxuICB0eXBlYWhlYWRPblNlbGVjdChlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0eXBlb2YgZS5pdGVtID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLmFkZFByZWRlZmluZWRUYWcoe1xyXG4gICAgICAgIFt0aGlzLmRpc3BsYXlGaWVsZF06IGUudmFsdWVcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZFByZWRlZmluZWRUYWcoZS5pdGVtKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWQgPSAnJztcclxuICB9XHJcblxyXG4gIHR5cGVhaGVhZE9uTm9NYXRjaChlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0eXBlb2YgdGhpcy5vbk5vT3B0aW9uc01hdGNoICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICB0aGlzLm9uTm9PcHRpb25zTWF0Y2guZW1pdChlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLnRhZ3MpIHtcclxuICAgICAgdGhpcy50YWdzID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcclxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xyXG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlSW5pdGlhbHMobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHZhciBmdWxsTmFtZSA9IG5hbWUuc3BsaXQoJyAnKTtcclxuICAgIHZhciBpbml0aWFscyA9IFwiXCI7XHJcbiAgICBpZiAoZnVsbE5hbWUubGVuZ3RoID4gMSlcclxuICAgICAgaW5pdGlhbHMgPSBmdWxsTmFtZS5zaGlmdCgpLmNoYXJBdCgwKSArIGZ1bGxOYW1lLnBvcCgpLmNoYXJBdCgwKTtcclxuICAgIGVsc2VcclxuICAgICAgaW5pdGlhbHMgPSBmdWxsTmFtZS5zaGlmdCgpLmNoYXJBdCgwKTtcclxuICAgIHJldHVybiBpbml0aWFscy50b1VwcGVyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkJsdXJJbnB1dC5lbWl0KCk7XHJcbiAgfVxyXG4gIC8vIChrZXlkb3duLlRhYikgPSBcIm9uVGFiKCRldmVudClcIlxyXG4gIC8vb25UYWIoZXZlbnQpIHtcclxuICAvLyAgdGhpcy5vblRhYklucHV0LmVtaXQoKTtcclxuICAvLyAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAvLyAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgLy99XHJcbn1cclxuIl19
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Directive, HostListener, Input } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class PreventDoubleClickDirective {
|
|
4
|
-
constructor(renderer, elementRef) {
|
|
5
|
-
this.renderer = renderer;
|
|
6
|
-
this.elementRef = elementRef;
|
|
7
|
-
this.debounceTime = 2000; // Default debounce time in milliseconds
|
|
8
|
-
this.isDisabled = false;
|
|
9
|
-
}
|
|
10
|
-
onClick(event) {
|
|
11
|
-
if (this.isDisabled) {
|
|
12
|
-
event.preventDefault();
|
|
13
|
-
event.stopImmediatePropagation();
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
this.isDisabled = true;
|
|
17
|
-
this.renderer.addClass(this.elementRef.nativeElement, 'disabled');
|
|
18
|
-
// Re-enable the button after the debounce time
|
|
19
|
-
setTimeout(() => {
|
|
20
|
-
this.isDisabled = false;
|
|
21
|
-
this.renderer.removeClass(this.elementRef.nativeElement, 'disabled');
|
|
22
|
-
}, this.debounceTime);
|
|
23
|
-
}
|
|
24
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PreventDoubleClickDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
25
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: PreventDoubleClickDirective, isStandalone: true, selector: "[appPreventDoubleClick]", inputs: { debounceTime: "debounceTime" }, host: { listeners: { "click": "onClick($event)" } }, ngImport: i0 }); }
|
|
26
|
-
}
|
|
27
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PreventDoubleClickDirective, decorators: [{
|
|
28
|
-
type: Directive,
|
|
29
|
-
args: [{
|
|
30
|
-
selector: '[appPreventDoubleClick]',
|
|
31
|
-
standalone: true
|
|
32
|
-
}]
|
|
33
|
-
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { debounceTime: [{
|
|
34
|
-
type: Input
|
|
35
|
-
}], onClick: [{
|
|
36
|
-
type: HostListener,
|
|
37
|
-
args: ['click', ['$event']]
|
|
38
|
-
}] } });
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwUHJldmVudERvdWJsZUNsaWNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9TaGFyZWQvRGlyZWN0aXZlcy9hcHBQcmV2ZW50RG91YmxlQ2xpY2suZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQzs7QUFNdEYsTUFBTSxPQUFPLDJCQUEyQjtJQUd0QyxZQUFvQixRQUFtQixFQUFVLFVBQXNCO1FBQW5ELGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRjlELGlCQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsd0NBQXdDO1FBQzlELGVBQVUsR0FBRyxLQUFLLENBQUM7SUFDZ0QsQ0FBQztJQUc1RSxPQUFPLENBQUMsS0FBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2pDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xFLCtDQUErQztRQUMvQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkUsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QixDQUFDOytHQXBCVSwyQkFBMkI7bUdBQTNCLDJCQUEyQjs7NEZBQTNCLDJCQUEyQjtrQkFKdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxVQUFVLEVBQUUsSUFBSTtpQkFDakI7dUdBRVUsWUFBWTtzQkFBcEIsS0FBSztnQkFLTixPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2FwcFByZXZlbnREb3VibGVDbGlja10nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIFByZXZlbnREb3VibGVDbGlja0RpcmVjdGl2ZSB7XHJcbiAgQElucHV0KCkgZGVib3VuY2VUaW1lID0gMjAwMDsgLy8gRGVmYXVsdCBkZWJvdW5jZSB0aW1lIGluIG1pbGxpc2Vjb25kc1xyXG4gIHByaXZhdGUgaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0Rpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcpO1xyXG4gICAgLy8gUmUtZW5hYmxlIHRoZSBidXR0b24gYWZ0ZXIgdGhlIGRlYm91bmNlIHRpbWVcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJyk7XHJcbiAgICB9LCB0aGlzLmRlYm91bmNlVGltZSk7XHJcbiAgfVxyXG59Il19
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Directive, Input } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class NgTemplateNameDirective {
|
|
4
|
-
constructor(template) {
|
|
5
|
-
this.template = template;
|
|
6
|
-
}
|
|
7
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgTemplateNameDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
8
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: NgTemplateNameDirective, isStandalone: true, selector: "ng-template[name]", inputs: { name: "name" }, ngImport: i0 }); }
|
|
9
|
-
}
|
|
10
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgTemplateNameDirective, decorators: [{
|
|
11
|
-
type: Directive,
|
|
12
|
-
args: [{
|
|
13
|
-
selector: 'ng-template[name]',
|
|
14
|
-
standalone: true
|
|
15
|
-
}]
|
|
16
|
-
}], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { name: [{
|
|
17
|
-
type: Input
|
|
18
|
-
}] } });
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtbmFtZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvU2hhcmVkL0RpcmVjdGl2ZXMvdGVtcGxhdGUtbmFtZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWUsTUFBTSxlQUFlLENBQUM7O0FBTTlELE1BQU0sT0FBTyx1QkFBdUI7SUFHbEMsWUFBbUIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFBSSxDQUFDOytHQUh2Qyx1QkFBdUI7bUdBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFKbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7Z0ZBRVUsSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbbmFtZV0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIE5nVGVtcGxhdGVOYW1lRGlyZWN0aXZlIHtcclxuICBASW5wdXQoKSBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn0iXX0=
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export var CalendarView;
|
|
2
|
-
(function (CalendarView) {
|
|
3
|
-
CalendarView[CalendarView["Month"] = 1] = "Month";
|
|
4
|
-
CalendarView[CalendarView["Weekly"] = 2] = "Weekly";
|
|
5
|
-
CalendarView[CalendarView["Daily"] = 3] = "Daily";
|
|
6
|
-
CalendarView[CalendarView["Agenda"] = 4] = "Agenda";
|
|
7
|
-
})(CalendarView || (CalendarView = {}));
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FsZW5kYXJWaWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL1NoYXJlZC9FbnVtcy9DYWxlbmRhclZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsTUFBTSxDQUFOLElBQVksWUFLVDtBQUxILFdBQVksWUFBWTtJQUNwQixpREFBUyxDQUFBO0lBQ1QsbURBQVUsQ0FBQTtJQUNWLGlEQUFTLENBQUE7SUFDVCxtREFBVSxDQUFBO0FBQ1osQ0FBQyxFQUxTLFlBQVksS0FBWixZQUFZLFFBS3JCIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmV4cG9ydCBlbnVtIENhbGVuZGFyVmlldyB7XHJcbiAgICBNb250aCA9IDEsXHJcbiAgICBXZWVrbHkgPSAyLFxyXG4gICAgRGFpbHkgPSAzLFxyXG4gICAgQWdlbmRhID0gNFxyXG4gIH0iXX0=
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export var ControlLayout;
|
|
2
|
-
(function (ControlLayout) {
|
|
3
|
-
ControlLayout[ControlLayout["Vertical"] = 1] = "Vertical";
|
|
4
|
-
ControlLayout[ControlLayout["Horizontal"] = 2] = "Horizontal";
|
|
5
|
-
})(ControlLayout || (ControlLayout = {}));
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbExheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9TaGFyZWQvRW51bXMvQ29udHJvbExheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxhQUdYO0FBSEQsV0FBWSxhQUFhO0lBQ3JCLHlEQUFZLENBQUE7SUFDWiw2REFBYyxDQUFBO0FBQ2xCLENBQUMsRUFIVyxhQUFhLEtBQWIsYUFBYSxRQUd4QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIENvbnRyb2xMYXlvdXQgIHtcclxuICAgIFZlcnRpY2FsID0gMSxcclxuICAgIEhvcml6b250YWwgPSAyXHJcbn1cclxuIl19
|