@bnsights/bbsf-controls 1.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/README.md +24 -0
- package/bnsights-bbsf-controls.d.ts +26 -0
- package/bnsights-bbsf-controls.metadata.json +1 -0
- package/bundles/bnsights-bbsf-controls.umd.js +6375 -0
- package/bundles/bnsights-bbsf-controls.umd.js.map +1 -0
- package/esm2015/bnsights-bbsf-controls.js +27 -0
- package/esm2015/lib/Shared/Enums/CalendarView.js +8 -0
- package/esm2015/lib/Shared/Enums/ControlLayout.js +6 -0
- package/esm2015/lib/Shared/Enums/Countries.js +247 -0
- package/esm2015/lib/Shared/Enums/FileType.js +22 -0
- package/esm2015/lib/Shared/Enums/FilterType.js +11 -0
- package/esm2015/lib/Shared/Enums/FontSize.js +7 -0
- package/esm2015/lib/Shared/Enums/ForceDirection.js +6 -0
- package/esm2015/lib/Shared/Enums/IconPosition.js +6 -0
- package/esm2015/lib/Shared/Enums/ImageType.js +10 -0
- package/esm2015/lib/Shared/Enums/InputType.js +9 -0
- package/esm2015/lib/Shared/Enums/Insert.js +9 -0
- package/esm2015/lib/Shared/Enums/LanguageMode.js +11 -0
- package/esm2015/lib/Shared/Enums/Misc.js +7 -0
- package/esm2015/lib/Shared/Enums/PagingActionMode.js +6 -0
- package/esm2015/lib/Shared/Enums/Para.js +9 -0
- package/esm2015/lib/Shared/Enums/PickerType.js +7 -0
- package/esm2015/lib/Shared/Enums/SelectMode.js +6 -0
- package/esm2015/lib/Shared/Enums/StartView.js +7 -0
- package/esm2015/lib/Shared/Enums/Style.js +8 -0
- package/esm2015/lib/Shared/Enums/menu-list-enum.js +6 -0
- package/esm2015/lib/Shared/Models/Attribute.js +3 -0
- package/esm2015/lib/Shared/Models/AutocompleteDTO.js +7 -0
- package/esm2015/lib/Shared/Models/AutocompleteOptions.js +29 -0
- package/esm2015/lib/Shared/Models/CalendarEventDTO.js +3 -0
- package/esm2015/lib/Shared/Models/CalendarOptions.js +17 -0
- package/esm2015/lib/Shared/Models/CancelDTO.js +7 -0
- package/esm2015/lib/Shared/Models/CheckBoxOptions.js +12 -0
- package/esm2015/lib/Shared/Models/CustomValidation.js +14 -0
- package/esm2015/lib/Shared/Models/DropdownListItem.js +3 -0
- package/esm2015/lib/Shared/Models/DropdownOptions.js +18 -0
- package/esm2015/lib/Shared/Models/EditPersonalImage.js +7 -0
- package/esm2015/lib/Shared/Models/EnglishArabicDTO.js +3 -0
- package/esm2015/lib/Shared/Models/FileDTO.js +2 -0
- package/esm2015/lib/Shared/Models/FileUploadModel.js +3 -0
- package/esm2015/lib/Shared/Models/FileUploadOptions.js +15 -0
- package/esm2015/lib/Shared/Models/FilterItem.js +8 -0
- package/esm2015/lib/Shared/Models/FormOptions.js +26 -0
- package/esm2015/lib/Shared/Models/HtmlEditorOptions.js +16 -0
- package/esm2015/lib/Shared/Models/ImageUploadOptions.js +18 -0
- package/esm2015/lib/Shared/Models/MapAutoCompleteOptions.js +11 -0
- package/esm2015/lib/Shared/Models/MapAutocompleteDTO.js +3 -0
- package/esm2015/lib/Shared/Models/MultiLingualHtmlEditorOptions.js +19 -0
- package/esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js +19 -0
- package/esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js +22 -0
- package/esm2015/lib/Shared/Models/MultipleFileUploadModel.js +9 -0
- package/esm2015/lib/Shared/Models/PagingDTO.js +13 -0
- package/esm2015/lib/Shared/Models/PagingOptions.js +43 -0
- package/esm2015/lib/Shared/Models/PhoneOptions.js +15 -0
- package/esm2015/lib/Shared/Models/ProfileImageUploadOptions.js +15 -0
- package/esm2015/lib/Shared/Models/ProfilePictureDTO.js +3 -0
- package/esm2015/lib/Shared/Models/RadioButtonItem.js +3 -0
- package/esm2015/lib/Shared/Models/RadioButtonOptions.js +10 -0
- package/esm2015/lib/Shared/Models/RangeNumber.js +3 -0
- package/esm2015/lib/Shared/Models/SaveDTO.js +7 -0
- package/esm2015/lib/Shared/Models/TagsInputDTO.js +3 -0
- package/esm2015/lib/Shared/Models/TagsInputOptions.js +45 -0
- package/esm2015/lib/Shared/Models/TextAreaOptions.js +14 -0
- package/esm2015/lib/Shared/Models/TextBoxOptions.js +21 -0
- package/esm2015/lib/Shared/Models/ToggleslideOptions.js +9 -0
- package/esm2015/lib/Shared/Models/UploadPersonalImage.js +7 -0
- package/esm2015/lib/Shared/Models/datePickerOptions.js +24 -0
- package/esm2015/lib/Shared/config/environment.js +12 -0
- package/esm2015/lib/Shared/services/ControlUtility.js +114 -0
- package/esm2015/lib/Shared/services/OnPagingFiltersChange.service.js +22 -0
- package/esm2015/lib/Shared/services/validationErrorMassage.service.js +122 -0
- package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +236 -0
- package/esm2015/lib/controls/Calendar/Calendar.component.js +176 -0
- package/esm2015/lib/controls/CheckBox/CheckBox.component.js +111 -0
- package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +148 -0
- package/esm2015/lib/controls/DropdownList/DropdownList.component.js +172 -0
- package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +319 -0
- package/esm2015/lib/controls/Form/Form.component.js +82 -0
- package/esm2015/lib/controls/HtmlEditor/HtmlEditor.component.js +202 -0
- package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +304 -0
- package/esm2015/lib/controls/MapAutoComplete/MapAutoComplete.component.js +283 -0
- package/esm2015/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.js +383 -0
- package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +325 -0
- package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +326 -0
- package/esm2015/lib/controls/Paging/JwPagination.component.js +127 -0
- package/esm2015/lib/controls/Paging/Paging.component.js +215 -0
- package/esm2015/lib/controls/Phone/Phone.component.js +114 -0
- package/esm2015/lib/controls/ProfileImageUploader/ProfileImageUploader.component.js +326 -0
- package/esm2015/lib/controls/RadioButton/RadioButton.component.js +98 -0
- package/esm2015/lib/controls/TagsInput/TagsInput.component.js +205 -0
- package/esm2015/lib/controls/TextArea/TextArea.component.js +148 -0
- package/esm2015/lib/controls/TextBox/TextBox.component.js +217 -0
- package/esm2015/lib/controls/Toggleslide/toggleslide.component.js +71 -0
- package/esm2015/lib/controls/bbsf-controls.module.js +208 -0
- package/esm2015/public-api.js +101 -0
- package/fesm2015/bnsights-bbsf-controls.js +5794 -0
- package/fesm2015/bnsights-bbsf-controls.js.map +1 -0
- package/lib/Shared/Enums/CalendarView.d.ts +6 -0
- package/lib/Shared/Enums/ControlLayout.d.ts +4 -0
- package/lib/Shared/Enums/Countries.d.ts +245 -0
- package/lib/Shared/Enums/FileType.d.ts +20 -0
- package/lib/Shared/Enums/FilterType.d.ts +9 -0
- package/lib/Shared/Enums/FontSize.d.ts +5 -0
- package/lib/Shared/Enums/ForceDirection.d.ts +4 -0
- package/lib/Shared/Enums/IconPosition.d.ts +4 -0
- package/lib/Shared/Enums/ImageType.d.ts +8 -0
- package/lib/Shared/Enums/InputType.d.ts +7 -0
- package/lib/Shared/Enums/Insert.d.ts +7 -0
- package/lib/Shared/Enums/LanguageMode.d.ts +9 -0
- package/lib/Shared/Enums/Misc.d.ts +5 -0
- package/lib/Shared/Enums/PagingActionMode.d.ts +4 -0
- package/lib/Shared/Enums/Para.d.ts +7 -0
- package/lib/Shared/Enums/PickerType.d.ts +5 -0
- package/lib/Shared/Enums/SelectMode.d.ts +4 -0
- package/lib/Shared/Enums/StartView.d.ts +5 -0
- package/lib/Shared/Enums/Style.d.ts +6 -0
- package/lib/Shared/Enums/menu-list-enum.d.ts +4 -0
- package/lib/Shared/Models/Attribute.d.ts +4 -0
- package/lib/Shared/Models/AutocompleteDTO.d.ts +4 -0
- package/lib/Shared/Models/AutocompleteOptions.d.ts +74 -0
- package/lib/Shared/Models/CalendarEventDTO.d.ts +8 -0
- package/lib/Shared/Models/CalendarOptions.d.ts +29 -0
- package/lib/Shared/Models/CancelDTO.d.ts +5 -0
- package/lib/Shared/Models/CheckBoxOptions.d.ts +38 -0
- package/lib/Shared/Models/CustomValidation.d.ts +10 -0
- package/lib/Shared/Models/DropdownListItem.d.ts +4 -0
- package/lib/Shared/Models/DropdownOptions.d.ts +67 -0
- package/lib/Shared/Models/EditPersonalImage.d.ts +5 -0
- package/lib/Shared/Models/EnglishArabicDTO.d.ts +4 -0
- package/lib/Shared/Models/FileDTO.d.ts +19 -0
- package/lib/Shared/Models/FileUploadModel.d.ts +4 -0
- package/lib/Shared/Models/FileUploadOptions.d.ts +56 -0
- package/lib/Shared/Models/FilterItem.d.ts +13 -0
- package/lib/Shared/Models/FormOptions.d.ts +15 -0
- package/lib/Shared/Models/HtmlEditorOptions.d.ts +66 -0
- package/lib/Shared/Models/ImageUploadOptions.d.ts +59 -0
- package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +44 -0
- package/lib/Shared/Models/MapAutocompleteDTO.d.ts +7 -0
- package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +97 -0
- package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +85 -0
- package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +83 -0
- package/lib/Shared/Models/MultipleFileUploadModel.d.ts +7 -0
- package/lib/Shared/Models/PagingDTO.d.ts +11 -0
- package/lib/Shared/Models/PagingOptions.d.ts +51 -0
- package/lib/Shared/Models/PhoneOptions.d.ts +56 -0
- package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +64 -0
- package/lib/Shared/Models/ProfilePictureDTO.d.ts +12 -0
- package/lib/Shared/Models/RadioButtonItem.d.ts +4 -0
- package/lib/Shared/Models/RadioButtonOptions.d.ts +44 -0
- package/lib/Shared/Models/RangeNumber.d.ts +4 -0
- package/lib/Shared/Models/SaveDTO.d.ts +5 -0
- package/lib/Shared/Models/TagsInputDTO.d.ts +4 -0
- package/lib/Shared/Models/TagsInputOptions.d.ts +91 -0
- package/lib/Shared/Models/TextAreaOptions.d.ts +60 -0
- package/lib/Shared/Models/TextBoxOptions.d.ts +70 -0
- package/lib/Shared/Models/ToggleslideOptions.d.ts +36 -0
- package/lib/Shared/Models/UploadPersonalImage.d.ts +5 -0
- package/lib/Shared/Models/datePickerOptions.d.ts +65 -0
- package/lib/Shared/config/environment.d.ts +1 -0
- package/lib/Shared/services/ControlUtility.d.ts +23 -0
- package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +7 -0
- package/lib/Shared/services/validationErrorMassage.service.d.ts +13 -0
- package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +51 -0
- package/lib/controls/Calendar/Calendar.component.d.ts +40 -0
- package/lib/controls/CheckBox/CheckBox.component.d.ts +33 -0
- package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +41 -0
- package/lib/controls/DropdownList/DropdownList.component.d.ts +47 -0
- package/lib/controls/FileUplaod/FileUplaod.component.d.ts +49 -0
- package/lib/controls/Form/Form.component.d.ts +15 -0
- package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +44 -0
- package/lib/controls/ImageUpload/ImageUpload.component.d.ts +64 -0
- package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +52 -0
- package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +58 -0
- package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +59 -0
- package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +57 -0
- package/lib/controls/Paging/JwPagination.component.d.ts +24 -0
- package/lib/controls/Paging/Paging.component.d.ts +44 -0
- package/lib/controls/Phone/Phone.component.d.ts +37 -0
- package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +65 -0
- package/lib/controls/RadioButton/RadioButton.component.d.ts +31 -0
- package/lib/controls/TagsInput/TagsInput.component.d.ts +47 -0
- package/lib/controls/TextArea/TextArea.component.d.ts +41 -0
- package/lib/controls/TextBox/TextBox.component.d.ts +50 -0
- package/lib/controls/Toggleslide/toggleslide.component.d.ts +26 -0
- package/lib/controls/bbsf-controls.module.d.ts +10 -0
- package/package.json +85 -0
- package/public-api.d.ts +66 -0
- package/src/lib/assets/Style.css +1149 -0
- package/src/lib/assets/i18n/ar.json +29 -0
- package/src/lib/assets/i18n/en.json +24 -0
- package/src/lib/assets/images/imagenotfound.png +0 -0
- package/src/lib/assets/images/uploadimg.png +0 -0
- package/src/lib/assets/images/userimg.png +0 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Component, Input, Optional, Output, EventEmitter } from '@angular/core';
|
|
3
|
+
import { FormControl, Validators, FormGroup, ControlContainer, FormGroupDirective } from '@angular/forms';
|
|
4
|
+
import { ErrorMassageValidation } from '../../Shared/services/validationErrorMassage.service';
|
|
5
|
+
import { InputType } from '../../Shared/Enums/InputType';
|
|
6
|
+
import { EnglishArabicDTO } from '../../Shared/Models/EnglishArabicDTO';
|
|
7
|
+
import { ControlUtility } from '../../Shared/services/ControlUtility';
|
|
8
|
+
import { LanguageMode } from '../../Shared/Enums/LanguageMode';
|
|
9
|
+
import { BBSFTranslateService, ControlValidationService, UtilityService } from '@bnsights/bbsf-utilities';
|
|
10
|
+
export class MultiLingualTextBoxComponent {
|
|
11
|
+
constructor(ErrorHandler, MultiLingualTextBoxFormControlHost, controlContainer, controlUtility, UtilityService, translate, controlValidationService) {
|
|
12
|
+
this.ErrorHandler = ErrorHandler;
|
|
13
|
+
this.MultiLingualTextBoxFormControlHost = MultiLingualTextBoxFormControlHost;
|
|
14
|
+
this.controlContainer = controlContainer;
|
|
15
|
+
this.controlUtility = controlUtility;
|
|
16
|
+
this.UtilityService = UtilityService;
|
|
17
|
+
this.translate = translate;
|
|
18
|
+
this.controlValidationService = controlValidationService;
|
|
19
|
+
this.OnChange = new EventEmitter();
|
|
20
|
+
this.ArabicWordCount = 0;
|
|
21
|
+
this.ArabicWordCountArray = 0;
|
|
22
|
+
this.EnglishWordCount = 0;
|
|
23
|
+
this.EnglishWordCountArray = 0;
|
|
24
|
+
this.CurrentLanguage = "";
|
|
25
|
+
this.ArabicValidationRules = [];
|
|
26
|
+
this.ArabicValidationRulesasync = [];
|
|
27
|
+
this.EnglishValidationRules = [];
|
|
28
|
+
this.EnglishValidationRulesasync = [];
|
|
29
|
+
this.IsShowArabicWordCount = false;
|
|
30
|
+
this.IsShowEnglishWordCount = false;
|
|
31
|
+
this.markAllAsTouched = false;
|
|
32
|
+
this.ArabicLetterOnly = "";
|
|
33
|
+
this.EnglishLetterOnly = "";
|
|
34
|
+
//External Method
|
|
35
|
+
this.RemoveRequiredValidation = () => {
|
|
36
|
+
this.controlUtility.RemoveRequiredValidation(this.ArabicFormControl, this.EnglishValidationRules, this.options);
|
|
37
|
+
this.controlUtility.RemoveRequiredValidation(this.EnglishFormControl, this.ArabicValidationRules, this.options);
|
|
38
|
+
};
|
|
39
|
+
//External Method
|
|
40
|
+
this.AddRequiredValidation = () => {
|
|
41
|
+
this.controlUtility.AddRequiredValidation(this.ArabicFormControl, this.EnglishValidationRules, this.options);
|
|
42
|
+
this.controlUtility.AddRequiredValidation(this.EnglishFormControl, this.ArabicValidationRules, this.options);
|
|
43
|
+
};
|
|
44
|
+
//External Method
|
|
45
|
+
this.RemoveCustomValidation = (CustomValidation) => {
|
|
46
|
+
this.controlUtility.RemoveCustomValidation(this.ArabicFormControl, this.EnglishValidationRules, CustomValidation);
|
|
47
|
+
this.controlUtility.RemoveCustomValidation(this.EnglishFormControl, this.ArabicValidationRules, CustomValidation);
|
|
48
|
+
};
|
|
49
|
+
//External Method
|
|
50
|
+
this.AddCustomValidation = (CustomValidation) => {
|
|
51
|
+
this.controlUtility.AddCustomValidation(this.ArabicFormControl, this.EnglishValidationRules, CustomValidation);
|
|
52
|
+
this.controlUtility.AddCustomValidation(this.EnglishFormControl, this.ArabicValidationRules, CustomValidation);
|
|
53
|
+
};
|
|
54
|
+
//External Method
|
|
55
|
+
this.IsValid = () => {
|
|
56
|
+
this.controlUtility.IsValid(this.ArabicFormControl);
|
|
57
|
+
this.controlUtility.IsValid(this.EnglishFormControl);
|
|
58
|
+
};
|
|
59
|
+
MultiLingualTextBoxComponent.controlContainerstatic = this.controlContainer;
|
|
60
|
+
this.CurrentLanguage = translate.currentLang != undefined ? translate.currentLang : translate.defaultLang;
|
|
61
|
+
}
|
|
62
|
+
getCustomErrorsMassages() {
|
|
63
|
+
this.ArabicLetterOnly = this.UtilityService.getResourceValue("ArabicLetterOnly");
|
|
64
|
+
this.EnglishLetterOnly = this.UtilityService.getResourceValue("EnglishLetterOnly");
|
|
65
|
+
}
|
|
66
|
+
ngOnInit() {
|
|
67
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
this.controlValidationService.isCreatedBefor = false;
|
|
69
|
+
this.CurrentLanguage = yield this.UtilityService.getCurrentLanguage();
|
|
70
|
+
// this.translate.onLangChange.subscribe((event: LangChangeEvent) => {
|
|
71
|
+
// this.CurrentLanguage = event.lang;
|
|
72
|
+
// this.showInputUsingLanguageMode()
|
|
73
|
+
// });
|
|
74
|
+
this.MultiLanguagegroup = new FormGroup({});
|
|
75
|
+
;
|
|
76
|
+
this.MultiLanguagegroup.addControl("ArabicValue", new FormControl(''));
|
|
77
|
+
this.MultiLanguagegroup.addControl("EnglishValue", new FormControl(''));
|
|
78
|
+
this.ArabicFormControl = this.MultiLanguagegroup.controls["ArabicValue"]; // new FormControl('',validationRules);
|
|
79
|
+
this.EnglishFormControl = this.MultiLanguagegroup.controls["EnglishValue"]; // new FormControl('',validationRules);
|
|
80
|
+
this.group.addControl(this.options.Name, new FormGroup(this.MultiLanguagegroup.controls));
|
|
81
|
+
this.getCustomErrorsMassages();
|
|
82
|
+
if (this.options.ArabicLabelKey != null && this.options.ArabicLabelKey != "")
|
|
83
|
+
this.options.ArabicLabelValue = this.UtilityService.getResourceValue(this.options.ArabicLabelKey);
|
|
84
|
+
if (this.options.EnglishLabelKey != null && this.options.EnglishLabelKey != "")
|
|
85
|
+
this.options.EnglishLabelValue = this.UtilityService.getResourceValue(this.options.EnglishLabelKey);
|
|
86
|
+
if (this.options.CustomValidation.length > 0) {
|
|
87
|
+
let Validations = this.options.CustomValidation;
|
|
88
|
+
for (let index = 0; index < Validations.length; index++) {
|
|
89
|
+
const Validation = Validations[index];
|
|
90
|
+
this.EnglishValidationRules.push(Validation.functionBody);
|
|
91
|
+
this.ArabicValidationRules.push(Validation.functionBody);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (this.options.CustomValidation.length > 0) {
|
|
95
|
+
let Validations = this.options.CustomValidation;
|
|
96
|
+
for (let index = 0; index < Validations.length; index++) {
|
|
97
|
+
const Validation = Validations[index];
|
|
98
|
+
this.EnglishValidationRules.push(Validation.functionBody);
|
|
99
|
+
this.ArabicValidationRules.push(Validation.functionBody);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (this.options.MinLength > 0) {
|
|
103
|
+
this.ArabicValidationRules.push(Validators.minLength(this.options.MinLength));
|
|
104
|
+
this.EnglishValidationRules.push(Validators.minLength(this.options.MinLength));
|
|
105
|
+
}
|
|
106
|
+
if (this.options.MaxLength > 0) {
|
|
107
|
+
this.EnglishValidationRules.push(Validators.maxLength(this.options.MaxLength));
|
|
108
|
+
this.ArabicValidationRules.push(Validators.maxLength(this.options.MaxLength));
|
|
109
|
+
}
|
|
110
|
+
this.showInputUsingLanguageMode();
|
|
111
|
+
this.ArabicValidationRules.push(Validators.compose([
|
|
112
|
+
this.controlUtility.patternValidator(/[\u0621-\u064A]+/, { ArabicLetterOnly: this.ArabicLetterOnly }),
|
|
113
|
+
]));
|
|
114
|
+
this.EnglishValidationRules.push(Validators.compose([
|
|
115
|
+
this.controlUtility.patternValidator(/^[\x00-\x7F]*$/, { EnglishLetterOnly: this.EnglishLetterOnly }),
|
|
116
|
+
]));
|
|
117
|
+
this.ArabicFormControl.setValidators(this.ArabicValidationRules);
|
|
118
|
+
this.ArabicFormControl.setAsyncValidators(this.ArabicValidationRulesasync);
|
|
119
|
+
this.EnglishFormControl.setValidators(this.EnglishValidationRules);
|
|
120
|
+
this.EnglishFormControl.setAsyncValidators(this.EnglishValidationRulesasync);
|
|
121
|
+
if (this.options.IsDisabled) {
|
|
122
|
+
this.EnglishFormControl.disable();
|
|
123
|
+
this.ArabicFormControl.disable();
|
|
124
|
+
}
|
|
125
|
+
this.ArabicFormControl.setValue(this.options.Value.Arabic);
|
|
126
|
+
this.EnglishFormControl.setValue(this.options.Value.English);
|
|
127
|
+
this.MultiLingualTextBoxFormControlHost.ngSubmit.subscribe((value) => {
|
|
128
|
+
this.group.markAllAsTouched();
|
|
129
|
+
this.markAllAsTouched = true;
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
onTextChange() {
|
|
134
|
+
// this.trimControlValue(type)
|
|
135
|
+
let arabicValue = "";
|
|
136
|
+
let englishValue = "";
|
|
137
|
+
if (this.EnglishFormControl.value == "") {
|
|
138
|
+
this.EnglishWordCountArray = 0;
|
|
139
|
+
this.EnglishWordCount = 0;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
if (this.EnglishFormControl.value != null && this.EnglishFormControl.value != undefined) {
|
|
143
|
+
this.EnglishWordCountArray = this.EnglishFormControl.value.split(" ").length;
|
|
144
|
+
if (this.EnglishWordCountArray > 0) {
|
|
145
|
+
if (this.EnglishWordCountArray > this.options.MaxWordCount) {
|
|
146
|
+
this.EnglishWordCount = this.options.MaxWordCount;
|
|
147
|
+
this.MultiLanguagegroup.controls["EnglishValue"].setErrors({ MaxWordCountValidationKey: this.options.MaxWordCount });
|
|
148
|
+
this.MultiLanguagegroup.controls["EnglishValue"].markAsTouched();
|
|
149
|
+
this.MultiLanguagegroup.controls["EnglishValue"].invalid;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.EnglishWordCount = this.EnglishWordCountArray;
|
|
153
|
+
}
|
|
154
|
+
englishValue = this.EnglishFormControl.value;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (this.ArabicFormControl.value == "") {
|
|
159
|
+
this.ArabicWordCountArray = 0;
|
|
160
|
+
this.ArabicWordCount = 0;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
if (this.ArabicFormControl.value != null && this.ArabicFormControl.value != undefined) {
|
|
164
|
+
this.ArabicWordCountArray = this.ArabicFormControl.value.split(" ").length;
|
|
165
|
+
if (this.ArabicWordCountArray > 0) {
|
|
166
|
+
if (this.ArabicWordCountArray > this.options.MaxWordCount) {
|
|
167
|
+
this.ArabicWordCount = this.options.MaxWordCount;
|
|
168
|
+
this.MultiLanguagegroup.controls["ArabicValue"].setErrors({ MaxWordCountValidationKey: this.options.MaxWordCount });
|
|
169
|
+
this.MultiLanguagegroup.controls["ArabicValue"].markAsTouched();
|
|
170
|
+
this.MultiLanguagegroup.controls["ArabicValue"].invalid;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
this.ArabicWordCount = this.ArabicWordCountArray;
|
|
174
|
+
}
|
|
175
|
+
arabicValue = this.ArabicFormControl.value;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
let mulitLangModel = new EnglishArabicDTO();
|
|
180
|
+
mulitLangModel.Arabic = arabicValue;
|
|
181
|
+
mulitLangModel.English = englishValue;
|
|
182
|
+
// this.ArabicFormControl = arabicValue;
|
|
183
|
+
// this.EnglishFormControl = englishValue;
|
|
184
|
+
this.OnChange.emit(mulitLangModel);
|
|
185
|
+
this.group.get(this.options.Name).setValue(mulitLangModel);
|
|
186
|
+
this.MultiLingualTextBoxFormControlHost.ngSubmit.subscribe((value) => {
|
|
187
|
+
this.group.markAllAsTouched();
|
|
188
|
+
this.markAllAsTouched = true;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
resetError() {
|
|
192
|
+
this.controlValidationService.RemoveGlobalError();
|
|
193
|
+
}
|
|
194
|
+
showGlobalError() {
|
|
195
|
+
this.controlUtility.showGlobalError();
|
|
196
|
+
}
|
|
197
|
+
getErrorValidation(ErrorList) {
|
|
198
|
+
if (this.markAllAsTouched && this.group.invalid) {
|
|
199
|
+
this.showGlobalError();
|
|
200
|
+
this.markAllAsTouched = false;
|
|
201
|
+
}
|
|
202
|
+
return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
|
|
203
|
+
}
|
|
204
|
+
getInputType(type) {
|
|
205
|
+
return InputType[type];
|
|
206
|
+
}
|
|
207
|
+
trimControlValue(type) {
|
|
208
|
+
const whitespace = ' ';
|
|
209
|
+
if (type == "En") {
|
|
210
|
+
if (this.EnglishFormControl.value.startsWith(whitespace) || this.EnglishFormControl.value.endsWith(whitespace)) {
|
|
211
|
+
this.EnglishFormControl.patchValue(this.EnglishFormControl.value.trim());
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (type == "Ar") {
|
|
215
|
+
if (this.ArabicFormControl.value.startsWith(whitespace) || this.ArabicFormControl.value.endsWith(whitespace)) {
|
|
216
|
+
this.ArabicFormControl.patchValue(this.ArabicFormControl.value.trim());
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
copyInputMessage(inputElement) {
|
|
221
|
+
this.controlUtility.CopyInputMessage(inputElement);
|
|
222
|
+
}
|
|
223
|
+
showInputUsingLanguageMode() {
|
|
224
|
+
this.ArabicValidationRules = this.ArabicValidationRules.filter(item => item !== Validators.required);
|
|
225
|
+
this.EnglishValidationRules = this.EnglishValidationRules.filter(item => item !== Validators.required);
|
|
226
|
+
this.ArabicFormControl.clearValidators();
|
|
227
|
+
this.EnglishFormControl.clearValidators();
|
|
228
|
+
this.ArabicFormControl.updateValueAndValidity();
|
|
229
|
+
this.EnglishFormControl.updateValueAndValidity();
|
|
230
|
+
switch (this.options.LanguageMode) {
|
|
231
|
+
case LanguageMode.Both_Languages_are_visible:
|
|
232
|
+
this.ShowArabicTextBox = true;
|
|
233
|
+
this.ShowEnglishTextBox = true;
|
|
234
|
+
if (this.options.IsRequired == true) {
|
|
235
|
+
this.EnglishValidationRules.push(Validators.required);
|
|
236
|
+
this.ArabicValidationRules.push(Validators.required);
|
|
237
|
+
}
|
|
238
|
+
break;
|
|
239
|
+
case LanguageMode.Arabic_Language_only_is_visible:
|
|
240
|
+
this.ShowArabicTextBox = true;
|
|
241
|
+
break;
|
|
242
|
+
case LanguageMode.English_Language_only_is_visible:
|
|
243
|
+
this.ShowEnglishTextBox = true;
|
|
244
|
+
break;
|
|
245
|
+
case LanguageMode.Both_Languages_are_visible_but_only_current_language_is_required:
|
|
246
|
+
this.ShowArabicTextBox = true;
|
|
247
|
+
this.ShowEnglishTextBox = true;
|
|
248
|
+
if (this.CurrentLanguage == 'ar') {
|
|
249
|
+
if (this.options.IsRequired == true) {
|
|
250
|
+
this.ArabicValidationRules.push(Validators.required);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (this.CurrentLanguage == 'en') {
|
|
254
|
+
if (this.options.IsRequired == true) {
|
|
255
|
+
this.EnglishValidationRules.push(Validators.required);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
case LanguageMode.Both_Languages_but_only_Arabic_is_required:
|
|
260
|
+
this.ShowArabicTextBox = true;
|
|
261
|
+
this.ShowEnglishTextBox = true;
|
|
262
|
+
if (this.options.IsRequired == true) {
|
|
263
|
+
this.ArabicValidationRules.push(Validators.required);
|
|
264
|
+
}
|
|
265
|
+
break;
|
|
266
|
+
case LanguageMode.Both_Languages_but_only_English_is_required:
|
|
267
|
+
this.ShowArabicTextBox = true;
|
|
268
|
+
this.ShowEnglishTextBox = true;
|
|
269
|
+
if (this.options.IsRequired == true) {
|
|
270
|
+
this.EnglishValidationRules.push(Validators.required);
|
|
271
|
+
}
|
|
272
|
+
break;
|
|
273
|
+
case LanguageMode.Current_Language_only_is_visible_and_required:
|
|
274
|
+
if (this.CurrentLanguage == 'ar') {
|
|
275
|
+
this.ShowArabicTextBox = true;
|
|
276
|
+
this.ShowEnglishTextBox = false;
|
|
277
|
+
if (this.options.IsRequired == true) {
|
|
278
|
+
this.ArabicValidationRules.push(Validators.required);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (this.CurrentLanguage == 'en') {
|
|
282
|
+
this.ShowArabicTextBox = false;
|
|
283
|
+
this.ShowEnglishTextBox = true;
|
|
284
|
+
if (this.options.IsRequired == true) {
|
|
285
|
+
this.EnglishValidationRules.push(Validators.required);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
break;
|
|
289
|
+
default:
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
this.ArabicFormControl.setValidators(this.ArabicValidationRules);
|
|
293
|
+
this.EnglishFormControl.setValidators(this.EnglishValidationRules);
|
|
294
|
+
this.ArabicFormControl.updateValueAndValidity();
|
|
295
|
+
this.EnglishFormControl.updateValueAndValidity();
|
|
296
|
+
}
|
|
297
|
+
showArabicWordCount(value) {
|
|
298
|
+
this.IsShowArabicWordCount = value;
|
|
299
|
+
}
|
|
300
|
+
showEnglishWordCount(value) {
|
|
301
|
+
this.IsShowEnglishWordCount = value;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
MultiLingualTextBoxComponent.controlContainerstatic = null;
|
|
305
|
+
MultiLingualTextBoxComponent.decorators = [
|
|
306
|
+
{ type: Component, args: [{
|
|
307
|
+
selector: 'BBSF-MultiLingualTextBox',
|
|
308
|
+
template: "<div class=\"b-control b-multilangual-textbox\">\r\n <div class=\"form-group validate is-invalid\" [formGroup]=\"group\">\r\n\r\n <div class=\"form-group row\" [formGroup]=\"MultiLanguagegroup\">\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowEnglishTextBox\">\r\n <label class=\"b-label col-form-label col-sm-12\"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-9':'col-md-3'\" [hidden]=\"options.IsHideEnglishLabel\">\r\n {{(options.EnglishLabelValue!=null&&options.EnglishLabelValue!=\"\")?options.EnglishLabelValue:options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPositionEN==1)?'left':'right'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input class=\"form-control bnsights-control\"\r\n (focus)=\"showEnglishWordCount(true)\" (focusout)=\"showEnglishWordCount(false)\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\" formControlName=\"EnglishValue\"\r\n [hidden]=\"options.IsHideEnglishFields\"\r\n [class.is-invalid]=\"EnglishFormControl.invalid && EnglishFormControl.touched\"\r\n placeholder=\"{{options.EnglishPlaceholder}}\" (change)=\"trimControlValue('En')\"\r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"EnglishWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputEnglish>\r\n\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideEnglishFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputEnglish)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowEnglishWordCount\">{{EnglishWordCount}}/{{options.MaxWordCount}} words</div>\r\n </div>\r\n\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(EnglishFormControl.invalid && EnglishFormControl.touched)\">\r\n {{getErrorValidation(EnglishFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='') ||(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!='')\">\r\n {{(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!=\"\")?options.EnglishLabelDescription:options.LabelDescription}}\r\n </div>\r\n \r\n\r\n <!-- <div *ngIf=\"EnglishFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"group.valid\">{{resetError()}}</div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n\r\n <div class=\"row\" *ngIf=\"ShowArabicTextBox\">\r\n\r\n <label class=\"b-label col-form-label col-sm-12\"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" [hidden]=\"options.IsHideArabicLabel\">\r\n {{(options.ArabicLabelValue!=null&&options.ArabicLabelValue!=\"\")?options.ArabicLabelValue:options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n\r\n </label>\r\n\r\n <div class=\" col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group\">\r\n <div class=\"svg svg-icon-grey\" [ngClass]=\"(options.IconPositionEN==1)?'right':'left'\" *ngIf=\"options.Icon!=null\">\r\n <span [inlineSVG]=\"options.Icon\"></span>\r\n </div>\r\n <input class=\"form-control bnsights-control\" dir=\"rtl\"\r\n (focus)=\"showArabicWordCount(true)\" (focusout)=\"showArabicWordCount(false)\"\r\n [hidden]=\"options.IsHideArabicFields\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"ArabicValue\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n [class.is-invalid]=\"ArabicFormControl.invalid && ArabicFormControl.touched\"\r\n placeholder=\"{{options.ArabicPlaceholder}}\" (keyup)=\"onTextChange()\"\r\n (keydown)=\"ArabicWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n (change)=\"trimControlValue('Ar')\" #userinputArabic>\r\n\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideArabicFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputArabic)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowArabicWordCount\">{{ArabicWordCount}}/{{options.MaxWordCount}} Words</div>\r\n\r\n </div>\r\n\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(ArabicFormControl.invalid && ArabicFormControl.touched)\">\r\n {{getErrorValidation(ArabicFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='')||(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!='')\">\r\n {{(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!=\"\")?options.ArabicLabelDescription:options.LabelDescription}}\r\n </div>\r\n \r\n \r\n\r\n <!-- <div *ngIf=\"ArabicFormControl.valid\">{{resetError()}}</div> -->\r\n \r\n <div *ngIf=\"group.valid\">{{resetError()}}</div>\r\n\r\n </div>\r\n \r\n\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n",
|
|
309
|
+
styles: [".example-form{min-width:150px;max-width:500px;width:100%}.example-full-width{width:100%}\n"]
|
|
310
|
+
},] }
|
|
311
|
+
];
|
|
312
|
+
MultiLingualTextBoxComponent.ctorParameters = () => [
|
|
313
|
+
{ type: ErrorMassageValidation },
|
|
314
|
+
{ type: FormGroupDirective },
|
|
315
|
+
{ type: ControlContainer, decorators: [{ type: Optional }] },
|
|
316
|
+
{ type: ControlUtility },
|
|
317
|
+
{ type: UtilityService },
|
|
318
|
+
{ type: BBSFTranslateService },
|
|
319
|
+
{ type: ControlValidationService }
|
|
320
|
+
];
|
|
321
|
+
MultiLingualTextBoxComponent.propDecorators = {
|
|
322
|
+
group: [{ type: Input }],
|
|
323
|
+
options: [{ type: Input }],
|
|
324
|
+
OnChange: [{ type: Output }]
|
|
325
|
+
};
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlMaW5ndWFsVGV4dEJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvY29udHJvbHMvTXVsdGlMaW5ndWFsVGV4dEJveC9NdWx0aUxpbmd1YWxUZXh0Qm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQVcsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFxQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBRTlGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsTUFBTywwQkFBMEIsQ0FBQztBQU8zRyxNQUFNLE9BQU8sNEJBQTRCO0lBSXZDLFlBQW9CLFlBQW9DLEVBQVMsa0NBQXNELEVBQXNCLGdCQUFrQyxFQUFVLGNBQThCLEVBQVMsY0FBNkIsRUFBUyxTQUErQixFQUFTLHdCQUFpRDtRQUEzVSxpQkFBWSxHQUFaLFlBQVksQ0FBd0I7UUFBUyx1Q0FBa0MsR0FBbEMsa0NBQWtDLENBQW9CO1FBQXNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FB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QixDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFFbkQsQ0FBQztJQUVELG1CQUFtQixDQUFDLEtBQWM7UUFDaEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtJQUNwQyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBYztRQUNqQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFBO0lBQ3JDLENBQUM7O0FBaldNLG1EQUFzQixHQUFHLElBQUksQ0FBQzs7WUFQdEMsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLHdxUEFBbUQ7O2FBRXBEOzs7WUFiUSxzQkFBc0I7WUFEbUUsa0JBQWtCO1lBQXBDLGdCQUFnQix1QkFtQjRCLFFBQVE7WUFkM0gsY0FBYztZQUdrQyxjQUFjO1lBQTlELG9CQUFvQjtZQUFFLHdCQUF3Qjs7O29CQWlCcEQsS0FBSztzQkFDTCxLQUFLO3VCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIERvQ2hlY2ssIE9wdGlvbmFsLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgRm9ybUdyb3VwLCBBYnN0cmFjdENvbnRyb2wsIEFzeW5jVmFsaWRhdG9yRm4sIENvbnRyb2xDb250YWluZXIsIEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRXJyb3JNYXNzYWdlVmFsaWRhdGlvbiB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy92YWxpZGF0aW9uRXJyb3JNYXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNdWx0aUxpbmd1YWxUZXh0Qm94T3B0aW9ucyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvTXVsdGlsaW5ndWFsVGV4dEJveE9wdGlvbnMnO1xyXG5pbXBvcnQgeyBJbnB1dFR5cGUgfSBmcm9tICcuLi8uLi9TaGFyZWQvRW51bXMvSW5wdXRUeXBlJztcclxuaW1wb3J0IHsgRW5nbGlzaEFyYWJpY0RUTyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvRW5nbGlzaEFyYWJpY0RUTyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgTGFuZ3VhZ2VNb2RlIH0gZnJvbSAnLi4vLi4vU2hhcmVkL0VudW1zL0xhbmd1YWdlTW9kZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UsIExhbmdDaGFuZ2VFdmVudCB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBCQlNGVHJhbnNsYXRlU2VydmljZSwgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLCBVdGlsaXR5U2VydmljZSB9IGZyb20gICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdCQlNGLU11bHRpTGluZ3VhbFRleHRCb3gnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9NdWx0aUxpbmd1YWxUZXh0Qm94LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9NdWx0aUxpbmd1YWxUZXh0Qm94LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpTGluZ3VhbFRleHRCb3hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBzdGF0aWMgY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgRXJyb3JIYW5kbGVyOiBFcnJvck1hc3NhZ2VWYWxpZGF0aW9uLCBwdWJsaWMgTXVsdGlMaW5ndWFsVGV4dEJveEZvcm1Db250cm9sSG9zdDogRm9ybUdyb3VwRGlyZWN0aXZlLCBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsIHByaXZhdGUgY29udHJvbFV0aWxpdHk6IENvbnRyb2xVdGlsaXR5LHByaXZhdGUgVXRpbGl0eVNlcnZpY2U6VXRpbGl0eVNlcnZpY2UscHJpdmF0ZSB0cmFuc2xhdGU6IEJCU0ZUcmFuc2xhdGVTZXJ2aWNlLHByaXZhdGUgY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlOkNvbnRyb2xWYWxpZGF0aW9uU2VydmljZSBcclxuXHJcbiAgKSB7XHJcbiAgICBNdWx0aUxpbmd1YWxUZXh0Qm94Q29tcG9uZW50LmNvbnRyb2xDb250YWluZXJzdGF0aWMgPSB0aGlzLmNvbnRyb2xDb250YWluZXI7XHJcbiAgICB0aGlzLkN1cnJlbnRMYW5ndWFnZSA9IHRyYW5zbGF0ZS5jdXJyZW50TGFuZyAhPSB1bmRlZmluZWQgPyB0cmFuc2xhdGUuY3VycmVudExhbmcgOiB0cmFuc2xhdGUuZGVmYXVsdExhbmdcclxuICB9XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBNdWx0aUxpbmd1YWxUZXh0Qm94T3B0aW9ucztcclxuICBAT3V0cHV0KCkgT25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEFyYWJpY0Zvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2w7XHJcbiAgRW5nbGlzaEZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2w7XHJcbiAgTXVsdGlGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIE11bHRpTGFuZ3VhZ2Vncm91cDogRm9ybUdyb3VwO1xyXG4gIEFyYWJpY1dvcmRDb3VudDogbnVtYmVyID0gMDtcclxuICBBcmFiaWNXb3JkQ291bnRBcnJheTogbnVtYmVyID0gMDtcclxuICBFbmdsaXNoV29yZENvdW50OiBudW1iZXIgPSAwO1xyXG4gIEVuZ2xpc2hXb3JkQ291bnRBcnJheTogbnVtYmVyID0gMDtcclxuICBDdXJyZW50TGFuZ3VhZ2U6IHN0cmluZyA9IFwiXCI7XHJcbiAgU2hvd0FyYWJpY1RleHRCb3g6IGJvb2xlYW5cclxuICBTaG93RW5nbGlzaFRleHRCb3g6IGJvb2xlYW5cclxuICBBcmFiaWNWYWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICBBcmFiaWNWYWxpZGF0aW9uUnVsZXNhc3luYyA9IFtdO1xyXG4gIEVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICBFbmdsaXNoVmFsaWRhdGlvblJ1bGVzYXN5bmMgPSBbXTtcclxuXHJcbiAgSXNTaG93QXJhYmljV29yZENvdW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgSXNTaG93RW5nbGlzaFdvcmRDb3VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG4gIEFyYWJpY0xldHRlck9ubHk6c3RyaW5nPVwiXCJcclxuICBFbmdsaXNoTGV0dGVyT25seTpzdHJpbmc9XCJcIlxyXG5cclxuIGdldEN1c3RvbUVycm9yc01hc3NhZ2VzKCkge1xyXG4gICAgdGhpcy5BcmFiaWNMZXR0ZXJPbmx5ID0gdGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQXJhYmljTGV0dGVyT25seVwiKTtcclxuICAgIHRoaXMuRW5nbGlzaExldHRlck9ubHkgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFbmdsaXNoTGV0dGVyT25seVwiKTtcclxuXHJcblxyXG4gIH1cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLmlzQ3JlYXRlZEJlZm9yID0gZmFsc2VcclxuICAgIHRoaXMuQ3VycmVudExhbmd1YWdlID0gYXdhaXQgdGhpcy5VdGlsaXR5U2VydmljZS5nZXRDdXJyZW50TGFuZ3VhZ2UoKTtcclxuXHJcbiAgICAvLyB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKChldmVudDogTGFuZ0NoYW5nZUV2ZW50KSA9PiB7XHJcbiAgICAvLyAgIHRoaXMuQ3VycmVudExhbmd1YWdlID0gZXZlbnQubGFuZztcclxuICAgIC8vICAgdGhpcy5zaG93SW5wdXRVc2luZ0xhbmd1YWdlTW9kZSgpXHJcbiAgICAvLyB9KTtcclxuICAgIHRoaXMuTXVsdGlMYW5ndWFnZWdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7O1xyXG4gICAgdGhpcy5NdWx0aUxhbmd1YWdlZ3JvdXAuYWRkQ29udHJvbChcIkFyYWJpY1ZhbHVlXCIsIG5ldyBGb3JtQ29udHJvbCgnJykpO1xyXG4gICAgdGhpcy5NdWx0aUxhbmd1YWdlZ3JvdXAuYWRkQ29udHJvbChcIkVuZ2xpc2hWYWx1ZVwiLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMuQXJhYmljRm9ybUNvbnRyb2wgPSB0aGlzLk11bHRpTGFuZ3VhZ2Vncm91cC5jb250cm9sc1tcIkFyYWJpY1ZhbHVlXCJdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbCA9IHRoaXMuTXVsdGlMYW5ndWFnZWdyb3VwLmNvbnRyb2xzW1wiRW5nbGlzaFZhbHVlXCJdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLmdyb3VwLmFkZENvbnRyb2wodGhpcy5vcHRpb25zLk5hbWUsIG5ldyBGb3JtR3JvdXAodGhpcy5NdWx0aUxhbmd1YWdlZ3JvdXAuY29udHJvbHMpKTtcclxuICAgIHRoaXMuZ2V0Q3VzdG9tRXJyb3JzTWFzc2FnZXMoKVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BcmFiaWNMYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5BcmFiaWNMYWJlbEtleSAhPSBcIlwiKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuQXJhYmljTGFiZWxWYWx1ZSA9IHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSh0aGlzLm9wdGlvbnMuQXJhYmljTGFiZWxLZXkpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuRW5nbGlzaExhYmVsS2V5ICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLkVuZ2xpc2hMYWJlbEtleSAhPSBcIlwiKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuRW5nbGlzaExhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUodGhpcy5vcHRpb25zLkVuZ2xpc2hMYWJlbEtleSk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zID0gdGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb25cclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IFZhbGlkYXRpb25zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IFZhbGlkYXRpb24gPSBWYWxpZGF0aW9uc1tpbmRleF07XHJcbiAgICAgICAgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zID0gdGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb25cclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IFZhbGlkYXRpb25zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IFZhbGlkYXRpb24gPSBWYWxpZGF0aW9uc1tpbmRleF07XHJcbiAgICAgICAgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5NaW5MZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5vcHRpb25zLk1pbkxlbmd0aCkpO1xyXG4gICAgICB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm9wdGlvbnMuTWluTGVuZ3RoKSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoKSk7XHJcbiAgICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5vcHRpb25zLk1heExlbmd0aCkpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNob3dJbnB1dFVzaW5nTGFuZ3VhZ2VNb2RlKCk7XHJcbiAgICBcclxuICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5jb21wb3NlKFtcclxuICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXR0ZXJuVmFsaWRhdG9yKC9bXFx1MDYyMS1cXHUwNjRBXSsvLCB7IEFyYWJpY0xldHRlck9ubHk6IHRoaXMuQXJhYmljTGV0dGVyT25seSB9KSxcclxuICAgICAgIFxyXG4gICAgXSkpO1xyXG4gICAgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5jb21wb3NlKFtcclxuICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXR0ZXJuVmFsaWRhdG9yKC9eW1xceDAwLVxceDdGXSokLywgeyBFbmdsaXNoTGV0dGVyT25seTogdGhpcy5FbmdsaXNoTGV0dGVyT25seSB9KSxcclxuICAgICAgIFxyXG4gICAgXSkpO1xyXG4gICAgXHJcbiAgICB0aGlzLkFyYWJpY0Zvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5BcmFiaWNGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXNhc3luYyk7XHJcbiAgICB0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzYXN5bmMpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuRW5nbGlzaEZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgICAgdGhpcy5BcmFiaWNGb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLkFyYWJpY0Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy5WYWx1ZS5BcmFiaWMpXHJcbiAgICB0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMuVmFsdWUuRW5nbGlzaClcclxuXHJcbiAgICB0aGlzLk11bHRpTGluZ3VhbFRleHRCb3hGb3JtQ29udHJvbEhvc3QubmdTdWJtaXQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKVxyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSB0cnVlXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIG9uVGV4dENoYW5nZSgpIHtcclxuICAgLy8gdGhpcy50cmltQ29udHJvbFZhbHVlKHR5cGUpXHJcbiAgICBsZXQgYXJhYmljVmFsdWUgPSBcIlwiO1xyXG4gICAgbGV0IGVuZ2xpc2hWYWx1ZSA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5FbmdsaXNoRm9ybUNvbnRyb2wudmFsdWUgPT0gXCJcIikge1xyXG4gICAgICB0aGlzLkVuZ2xpc2hXb3JkQ291bnRBcnJheSA9IDA7XHJcbiAgICAgIHRoaXMuRW5nbGlzaFdvcmRDb3VudCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuRW5nbGlzaEZvcm1Db250cm9sLnZhbHVlICE9IG51bGwgJiYgdGhpcy5FbmdsaXNoRm9ybUNvbnRyb2wudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5FbmdsaXNoV29yZENvdW50QXJyYXkgPSB0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbC52YWx1ZS5zcGxpdChcIiBcIikubGVuZ3RoO1xyXG4gICAgICAgIGlmICh0aGlzLkVuZ2xpc2hXb3JkQ291bnRBcnJheSA+IDApIHtcclxuICAgICAgICAgIGlmICh0aGlzLkVuZ2xpc2hXb3JkQ291bnRBcnJheSA+IHRoaXMub3B0aW9ucy5NYXhXb3JkQ291bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5FbmdsaXNoV29yZENvdW50ID0gdGhpcy5vcHRpb25zLk1heFdvcmRDb3VudDtcclxuICAgICAgICAgICAgdGhpcy5NdWx0aUxhbmd1YWdlZ3JvdXAuY29udHJvbHNbXCJFbmdsaXNoVmFsdWVcIl0uc2V0RXJyb3JzKHsgTWF4V29yZENvdW50VmFsaWRhdGlvbktleTogdGhpcy5vcHRpb25zLk1heFdvcmRDb3VudCB9KTtcclxuICAgICAgICAgICAgdGhpcy5NdWx0aUxhbmd1YWdlZ3JvdXAuY29udHJvbHNbXCJFbmdsaXNoVmFsdWVcIl0ubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLk11bHRpTGFuZ3VhZ2Vncm91cC5jb250cm9sc1tcIkVuZ2xpc2hWYWx1ZVwiXS5pbnZhbGlkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuRW5nbGlzaFdvcmRDb3VudCA9IHRoaXMuRW5nbGlzaFdvcmRDb3VudEFycmF5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZW5nbGlzaFZhbHVlPXRoaXMuRW5nbGlzaEZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIGlmICh0aGlzLkFyYWJpY0Zvcm1Db250cm9sLnZhbHVlID09IFwiXCIpIHtcclxuICAgICAgdGhpcy5BcmFiaWNXb3JkQ291bnRBcnJheSA9IDA7XHJcbiAgICAgIHRoaXMuQXJhYmljV29yZENvdW50ID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5BcmFiaWNGb3JtQ29udHJvbC52YWx1ZSAhPSBudWxsICYmIHRoaXMuQXJhYmljRm9ybUNvbnRyb2wudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5BcmFiaWNXb3JkQ291bnRBcnJheSA9IHRoaXMuQXJhYmljRm9ybUNvbnRyb2wudmFsdWUuc3BsaXQoXCIgXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAodGhpcy5BcmFiaWNXb3JkQ291bnRBcnJheSA+IDApIHtcclxuICAgICAgICAgIGlmICh0aGlzLkFyYWJpY1dvcmRDb3VudEFycmF5ID4gdGhpcy5vcHRpb25zLk1heFdvcmRDb3VudCkge1xyXG4gICAgICAgICAgICB0aGlzLkFyYWJpY1dvcmRDb3VudCA9IHRoaXMub3B0aW9ucy5NYXhXb3JkQ291bnQ7XHJcbiAgICAgICAgICAgIHRoaXMuTXVsdGlMYW5ndWFnZWdyb3VwLmNvbnRyb2xzW1wiQXJhYmljVmFsdWVcIl0uc2V0RXJyb3JzKHsgTWF4V29yZENvdW50VmFsaWRhdGlvbktleTogdGhpcy5vcHRpb25zLk1heFdvcmRDb3VudCB9KTtcclxuICAgICAgICAgICAgdGhpcy5NdWx0aUxhbmd1YWdlZ3JvdXAuY29udHJvbHNbXCJBcmFiaWNWYWx1ZVwiXS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuTXVsdGlMYW5ndWFnZWdyb3VwLmNvbnRyb2xzW1wiQXJhYmljVmFsdWVcIl0uaW52YWxpZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLkFyYWJpY1dvcmRDb3VudCA9IHRoaXMuQXJhYmljV29yZENvdW50QXJyYXk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhcmFiaWNWYWx1ZT10aGlzLkFyYWJpY0Zvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIGxldCBtdWxpdExhbmdNb2RlbCA9IG5ldyBFbmdsaXNoQXJhYmljRFRPKCk7XHJcbiAgICBtdWxpdExhbmdNb2RlbC5BcmFiaWMgPSBhcmFiaWNWYWx1ZTtcclxuICAgIG11bGl0TGFuZ01vZGVsLkVuZ2xpc2ggPSBlbmdsaXNoVmFsdWU7XHJcbiAgICAvLyB0aGlzLkFyYWJpY0Zvcm1Db250cm9sID0gYXJhYmljVmFsdWU7XHJcbiAgICAvLyB0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbCA9IGVuZ2xpc2hWYWx1ZTtcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdChtdWxpdExhbmdNb2RlbClcclxuICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS5zZXRWYWx1ZShtdWxpdExhbmdNb2RlbCk7XHJcblxyXG4gICAgdGhpcy5NdWx0aUxpbmd1YWxUZXh0Qm94Rm9ybUNvbnRyb2xIb3N0Lm5nU3VibWl0LnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5ncm91cC5tYXJrQWxsQXNUb3VjaGVkKClcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gdHJ1ZVxyXG4gICAgfSlcclxuXHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuICByZXNldEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UuUmVtb3ZlR2xvYmFsRXJyb3IoKTtcclxuICB9XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBSZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbih0aGlzLkFyYWJpY0Zvcm1Db250cm9sLCB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucylcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuRW5nbGlzaEZvcm1Db250cm9sLCB0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gIH1cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIEFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuQXJhYmljRm9ybUNvbnRyb2wsIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5FbmdsaXNoRm9ybUNvbnRyb2wsIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpXHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIFJlbW92ZUN1c3RvbVZhbGlkYXRpb24gPSAoQ3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5SZW1vdmVDdXN0b21WYWxpZGF0aW9uKHRoaXMuQXJhYmljRm9ybUNvbnRyb2wsIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcywgQ3VzdG9tVmFsaWRhdGlvbilcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbih0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbCwgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgQWRkQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZEN1c3RvbVZhbGlkYXRpb24odGhpcy5BcmFiaWNGb3JtQ29udHJvbCwgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKVxyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRDdXN0b21WYWxpZGF0aW9uKHRoaXMuRW5nbGlzaEZvcm1Db250cm9sLCB0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcywgQ3VzdG9tVmFsaWRhdGlvbilcclxuICB9XHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgSXNWYWxpZCA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuSXNWYWxpZCh0aGlzLkFyYWJpY0Zvcm1Db250cm9sKVxyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5Jc1ZhbGlkKHRoaXMuRW5nbGlzaEZvcm1Db250cm9sKVxyXG4gIH1cclxuXHJcbiAgc2hvd0dsb2JhbEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5zaG93R2xvYmFsRXJyb3IoKVxyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3JWYWxpZGF0aW9uKEVycm9yTGlzdCkge1xyXG4gICAgaWYgKHRoaXMubWFya0FsbEFzVG91Y2hlZCAmJiB0aGlzLmdyb3VwLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93R2xvYmFsRXJyb3IoKVxyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbFV0aWxpdHkuZ2V0RXJyb3JWYWxpZGF0aW9uTWFzc2FnZShFcnJvckxpc3QsIHRoaXMuZ3JvdXAsIHRoaXMub3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0SW5wdXRUeXBlKHR5cGU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIElucHV0VHlwZVt0eXBlXVxyXG4gIH1cclxuXHJcbiAgdHJpbUNvbnRyb2xWYWx1ZSh0eXBlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHdoaXRlc3BhY2U6IHN0cmluZyA9JyAnO1xyXG4gICAgaWYgKHR5cGUgPT0gXCJFblwiKSB7XHJcbiAgICAgIGlmICh0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbC52YWx1ZS5zdGFydHNXaXRoKHdoaXRlc3BhY2UpIHx8IHRoaXMuRW5nbGlzaEZvcm1Db250cm9sLnZhbHVlLmVuZHNXaXRoKHdoaXRlc3BhY2UpKSB7XHJcbiAgICAgICAgdGhpcy5FbmdsaXNoRm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbC52YWx1ZS50cmltKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSA9PSBcIkFyXCIpIHtcclxuICAgICAgaWYgKHRoaXMuQXJhYmljRm9ybUNvbnRyb2wudmFsdWUuc3RhcnRzV2l0aCh3aGl0ZXNwYWNlKSB8fCB0aGlzLkFyYWJpY0Zvcm1Db250cm9sLnZhbHVlLmVuZHNXaXRoKHdoaXRlc3BhY2UpKSB7XHJcbiAgICAgICAgdGhpcy5BcmFiaWNGb3JtQ29udHJvbC5wYXRjaFZhbHVlKHRoaXMuQXJhYmljRm9ybUNvbnRyb2wudmFsdWUudHJpbSgpKTtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBjb3B5SW5wdXRNZXNzYWdlKGlucHV0RWxlbWVudCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5Db3B5SW5wdXRNZXNzYWdlKGlucHV0RWxlbWVudClcclxuICB9XHJcblxyXG4gIHNob3dJbnB1dFVzaW5nTGFuZ3VhZ2VNb2RlKCkge1xyXG4gICAgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMgPSB0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcy5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcyA9IHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcy5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICB0aGlzLkFyYWJpY0Zvcm1Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgdGhpcy5FbmdsaXNoRm9ybUNvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgdGhpcy5BcmFiaWNGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuTGFuZ3VhZ2VNb2RlKSB7XHJcbiAgICAgIGNhc2UgTGFuZ3VhZ2VNb2RlLkJvdGhfTGFuZ3VhZ2VzX2FyZV92aXNpYmxlOlxyXG4gICAgICAgIHRoaXMuU2hvd0FyYWJpY1RleHRCb3ggPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuU2hvd0VuZ2xpc2hUZXh0Qm94ID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLklzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICB0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5BcmFiaWNfTGFuZ3VhZ2Vfb25seV9pc192aXNpYmxlOlxyXG4gICAgICAgIHRoaXMuU2hvd0FyYWJpY1RleHRCb3ggPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5FbmdsaXNoX0xhbmd1YWdlX29ubHlfaXNfdmlzaWJsZTpcclxuICAgICAgICB0aGlzLlNob3dFbmdsaXNoVGV4dEJveCA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTGFuZ3VhZ2VNb2RlLkJvdGhfTGFuZ3VhZ2VzX2FyZV92aXNpYmxlX2J1dF9vbmx5X2N1cnJlbnRfbGFuZ3VhZ2VfaXNfcmVxdWlyZWQ6XHJcbiAgICAgICAgdGhpcy5TaG93QXJhYmljVGV4dEJveCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5TaG93RW5nbGlzaFRleHRCb3ggPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5DdXJyZW50TGFuZ3VhZ2UgPT0gJ2FyJykge1xyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkID09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLkN1cnJlbnRMYW5ndWFnZSA9PSAnZW4nKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLklzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMYW5ndWFnZU1vZGUuQm90aF9MYW5ndWFnZXNfYnV0X29ubHlfQXJhYmljX2lzX3JlcXVpcmVkOlxyXG4gICAgICAgIHRoaXMuU2hvd0FyYWJpY1RleHRCb3ggPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuU2hvd0VuZ2xpc2hUZXh0Qm94ID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLklzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5Cb3RoX0xhbmd1YWdlc19idXRfb25seV9FbmdsaXNoX2lzX3JlcXVpcmVkOlxyXG4gICAgICAgIHRoaXMuU2hvd0FyYWJpY1RleHRCb3ggPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuU2hvd0VuZ2xpc2hUZXh0Qm94ID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLklzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMYW5ndWFnZU1vZGUuQ3VycmVudF9MYW5ndWFnZV9vbmx5X2lzX3Zpc2libGVfYW5kX3JlcXVpcmVkOlxyXG4gICAgICAgIGlmICh0aGlzLkN1cnJlbnRMYW5ndWFnZSA9PSAnYXInKSB7XHJcbiAgICAgICAgICB0aGlzLlNob3dBcmFiaWNUZXh0Qm94ID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuU2hvd0VuZ2xpc2hUZXh0Qm94ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkID09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLkN1cnJlbnRMYW5ndWFnZSA9PSAnZW4nKSB7XHJcbiAgICAgICAgICB0aGlzLlNob3dBcmFiaWNUZXh0Qm94ID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLlNob3dFbmdsaXNoVGV4dEJveCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLklzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuQXJhYmljRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLkVuZ2xpc2hGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLkFyYWJpY0Zvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuRW5nbGlzaEZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgfVxyXG5cclxuICBzaG93QXJhYmljV29yZENvdW50KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLklzU2hvd0FyYWJpY1dvcmRDb3VudCA9IHZhbHVlXHJcbiAgfVxyXG5cclxuICBzaG93RW5nbGlzaFdvcmRDb3VudCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5Jc1Nob3dFbmdsaXNoV29yZENvdW50ID0gdmFsdWVcclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuIl19
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
export class JwPaginationComponent {
|
|
3
|
+
constructor() {
|
|
4
|
+
this.changePage = new EventEmitter();
|
|
5
|
+
this.initialPage = 1;
|
|
6
|
+
this.pageSize = 10;
|
|
7
|
+
this.maxPages = 10;
|
|
8
|
+
this.ShowFirstAndLast = false;
|
|
9
|
+
this.pager = {};
|
|
10
|
+
}
|
|
11
|
+
ngOnInit() {
|
|
12
|
+
// set page if items array isn't empty
|
|
13
|
+
if (this.items && this.items.length) {
|
|
14
|
+
this.setPage(this.initialPage);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
ngOnChanges(changes) {
|
|
18
|
+
// reset page if items array has changed
|
|
19
|
+
if (changes.items.currentValue !== changes.items.previousValue) {
|
|
20
|
+
this.setPage(this.initialPage);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
setPage(page) {
|
|
24
|
+
// get new pager object for specified page
|
|
25
|
+
this.pager = this.paginate(this.items.length, page, this.pageSize, this.maxPages);
|
|
26
|
+
// get new page of items from items array
|
|
27
|
+
var pageOfItems = this.items.slice(this.pager.startIndex, this.pager.endIndex + 1);
|
|
28
|
+
// call change page function in parent component
|
|
29
|
+
this.changePage.emit(this.pager.currentPage);
|
|
30
|
+
}
|
|
31
|
+
paginate(totalItems, currentPage, pageSize, maxPages) {
|
|
32
|
+
if (currentPage === void 0) {
|
|
33
|
+
currentPage = 1;
|
|
34
|
+
}
|
|
35
|
+
if (pageSize === void 0) {
|
|
36
|
+
pageSize = 10;
|
|
37
|
+
}
|
|
38
|
+
if (maxPages === void 0) {
|
|
39
|
+
maxPages = 10;
|
|
40
|
+
}
|
|
41
|
+
// calculate total pages
|
|
42
|
+
var totalPages = Math.ceil(totalItems / pageSize);
|
|
43
|
+
// ensure current page isn't out of range
|
|
44
|
+
if (currentPage < 1) {
|
|
45
|
+
currentPage = 1;
|
|
46
|
+
}
|
|
47
|
+
else if (currentPage > totalPages) {
|
|
48
|
+
currentPage = totalPages;
|
|
49
|
+
}
|
|
50
|
+
var startPage, endPage;
|
|
51
|
+
if (totalPages <= maxPages) {
|
|
52
|
+
// total pages less than max so show all pages
|
|
53
|
+
startPage = 1;
|
|
54
|
+
endPage = totalPages;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// total pages more than max so calculate start and end pages
|
|
58
|
+
var maxPagesBeforeCurrentPage = Math.floor(maxPages / 2);
|
|
59
|
+
var maxPagesAfterCurrentPage = Math.ceil(maxPages / 2) - 1;
|
|
60
|
+
if (currentPage <= maxPagesBeforeCurrentPage) {
|
|
61
|
+
// current page near the start
|
|
62
|
+
startPage = 1;
|
|
63
|
+
endPage = maxPages;
|
|
64
|
+
}
|
|
65
|
+
else if (currentPage + maxPagesAfterCurrentPage >= totalPages) {
|
|
66
|
+
// current page near the end
|
|
67
|
+
startPage = totalPages - maxPages + 1;
|
|
68
|
+
endPage = totalPages;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// current page somewhere in the middle
|
|
72
|
+
startPage = currentPage - maxPagesBeforeCurrentPage;
|
|
73
|
+
endPage = currentPage + maxPagesAfterCurrentPage;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// calculate start and end item indexes
|
|
77
|
+
var startIndex = (currentPage - 1) * pageSize;
|
|
78
|
+
var endIndex = Math.min(startIndex + pageSize - 1, totalItems - 1);
|
|
79
|
+
// create an array of pages to ng-repeat in the pager control
|
|
80
|
+
var pages = Array.from(Array((endPage + 1) - startPage).keys()).map(function (i) { return startPage + i; });
|
|
81
|
+
// return object with all pager properties required by the view
|
|
82
|
+
return {
|
|
83
|
+
totalItems: totalItems,
|
|
84
|
+
currentPage: currentPage,
|
|
85
|
+
pageSize: pageSize,
|
|
86
|
+
totalPages: totalPages,
|
|
87
|
+
startPage: startPage,
|
|
88
|
+
endPage: endPage,
|
|
89
|
+
startIndex: startIndex,
|
|
90
|
+
endIndex: endIndex,
|
|
91
|
+
pages: pages
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
JwPaginationComponent.decorators = [
|
|
96
|
+
{ type: Component, args: [{
|
|
97
|
+
selector: 'jw-pagination',
|
|
98
|
+
template: `
|
|
99
|
+
<ul *ngIf="pager.pages && pager.pages.length" class="pagination">
|
|
100
|
+
<li *ngIf="ShowFirstAndLast" [ngClass]="{disabled:pager.currentPage === 1}" class="page-item first-item">
|
|
101
|
+
<a (click)="setPage(1)" class="page-link">❮❮</a>
|
|
102
|
+
</li>
|
|
103
|
+
<li [ngClass]="{disabled:pager.currentPage === 1}" class="page-item previous-item">
|
|
104
|
+
<a (click)="setPage(pager.currentPage - 1)" class="page-link">❮</a>
|
|
105
|
+
</li>
|
|
106
|
+
<li *ngFor="let page of pager.pages" [ngClass]="{active:pager.currentPage === page}" class="page-item number-item">
|
|
107
|
+
<a (click)="setPage(page)" class="page-link">{{page}}</a>
|
|
108
|
+
</li>
|
|
109
|
+
<li [ngClass]="{disabled:pager.currentPage === pager.totalPages}" class="page-item next-item">
|
|
110
|
+
<a (click)="setPage(pager.currentPage + 1)" class="page-link">❯</a>
|
|
111
|
+
</li>
|
|
112
|
+
<li *ngIf="ShowFirstAndLast" [ngClass]="{disabled:pager.currentPage === pager.totalPages}" class="page-item last-item">
|
|
113
|
+
<a (click)="setPage(pager.totalPages)" class="page-link">❯❯</a>
|
|
114
|
+
</li>
|
|
115
|
+
</ul>
|
|
116
|
+
`
|
|
117
|
+
},] }
|
|
118
|
+
];
|
|
119
|
+
JwPaginationComponent.propDecorators = {
|
|
120
|
+
items: [{ type: Input }],
|
|
121
|
+
changePage: [{ type: Output }],
|
|
122
|
+
initialPage: [{ type: Input }],
|
|
123
|
+
pageSize: [{ type: Input }],
|
|
124
|
+
maxPages: [{ type: Input }],
|
|
125
|
+
ShowFirstAndLast: [{ type: Input }]
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSndQYWdpbmF0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9QYWdpbmcvSndQYWdpbmF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQXlCekcsTUFBTSxPQUFPLHFCQUFxQjtJQXZCbEM7UUF5QlksZUFBVSxHQUFFLElBQUksWUFBWSxFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFHbEMsVUFBSyxHQUFRLEVBQUUsQ0FBQztJQXFGbEIsQ0FBQztJQW5GQyxRQUFRO1FBQ04sc0NBQXNDO1FBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsd0NBQXdDO1FBQ3hDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDaEM7SUFDSCxDQUFDO0lBRUEsT0FBTyxDQUFDLElBQVk7UUFDbkIsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0s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LFVBQVUsRUFBRSxVQUFVO1lBQ3RCLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFVBQVUsRUFBRSxVQUFVO1lBQ3RCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFVBQVUsRUFBRSxVQUFVO1lBQ3RCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLEtBQUssRUFBRSxLQUFLO1NBQ2YsQ0FBQztJQUNOLENBQUM7OztZQW5IQSxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JYO2FBQ0E7OztvQkFHRSxLQUFLO3lCQUNMLE1BQU07MEJBQ04sS0FBSzt1QkFDTCxLQUFLO3VCQUNMLEtBQUs7K0JBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdqdy1wYWdpbmF0aW9uJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gIDx1bCAqbmdJZj1cInBhZ2VyLnBhZ2VzICYmIHBhZ2VyLnBhZ2VzLmxlbmd0aFwiIGNsYXNzPVwicGFnaW5hdGlvblwiPlxyXG4gIDxsaSAqbmdJZj1cIlNob3dGaXJzdEFuZExhc3RcIiBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6cGFnZXIuY3VycmVudFBhZ2UgPT09IDF9XCIgY2xhc3M9XCJwYWdlLWl0ZW0gZmlyc3QtaXRlbVwiPlxyXG4gICAgICA8YSAoY2xpY2spPVwic2V0UGFnZSgxKVwiIGNsYXNzPVwicGFnZS1saW5rXCI+4p2u4p2uPC9hPlxyXG4gIDwvbGk+XHJcbiAgPGxpIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDpwYWdlci5jdXJyZW50UGFnZSA9PT0gMX1cIiBjbGFzcz1cInBhZ2UtaXRlbSBwcmV2aW91cy1pdGVtXCI+XHJcbiAgICAgIDxhIChjbGljayk9XCJzZXRQYWdlKHBhZ2VyLmN1cnJlbnRQYWdlIC0gMSlcIiBjbGFzcz1cInBhZ2UtbGlua1wiPuKdrjwvYT5cclxuICA8L2xpPlxyXG4gIDxsaSAqbmdGb3I9XCJsZXQgcGFnZSBvZiBwYWdlci5wYWdlc1wiIFtuZ0NsYXNzXT1cInthY3RpdmU6cGFnZXIuY3VycmVudFBhZ2UgPT09IHBhZ2V9XCIgY2xhc3M9XCJwYWdlLWl0ZW0gbnVtYmVyLWl0ZW1cIj5cclxuICAgICAgPGEgKGNsaWNrKT1cInNldFBhZ2UocGFnZSlcIiBjbGFzcz1cInBhZ2UtbGlua1wiPnt7cGFnZX19PC9hPlxyXG4gIDwvbGk+XHJcbiAgPGxpIFtuZ0NsYXNzXT1cIntkaXNhYmxlZDpwYWdlci5jdXJyZW50UGFnZSA9PT0gcGFnZXIudG90YWxQYWdlc31cIiBjbGFzcz1cInBhZ2UtaXRlbSBuZXh0LWl0ZW1cIj5cclxuICAgICAgPGEgKGNsaWNrKT1cInNldFBhZ2UocGFnZXIuY3VycmVudFBhZ2UgKyAxKVwiIGNsYXNzPVwicGFnZS1saW5rXCI+4p2vPC9hPlxyXG4gIDwvbGk+XHJcbiAgPGxpICAqbmdJZj1cIlNob3dGaXJzdEFuZExhc3RcIiBbbmdDbGFzc109XCJ7ZGlzYWJsZWQ6cGFnZXIuY3VycmVudFBhZ2UgPT09IHBhZ2VyLnRvdGFsUGFnZXN9XCIgY2xhc3M9XCJwYWdlLWl0ZW0gbGFzdC1pdGVtXCI+XHJcbiAgICAgIDxhIChjbGljayk9XCJzZXRQYWdlKHBhZ2VyLnRvdGFsUGFnZXMpXCIgY2xhc3M9XCJwYWdlLWxpbmtcIj7ina/ina88L2E+XHJcbiAgPC9saT5cclxuPC91bD5cclxuYFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEp3UGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBpdGVtczogQXJyYXk8YW55PjtcclxuICBAT3V0cHV0KCkgY2hhbmdlUGFnZSA9bmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBJbnB1dCgpIGluaXRpYWxQYWdlID0gMTtcclxuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xyXG4gIEBJbnB1dCgpIG1heFBhZ2VzID0gMTA7XHJcbiAgQElucHV0KCkgU2hvd0ZpcnN0QW5kTGFzdCA9IGZhbHNlO1xyXG5cclxuXHJcbiAgcGFnZXI6IGFueSA9IHt9O1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIHNldCBwYWdlIGlmIGl0ZW1zIGFycmF5IGlzbid0IGVtcHR5XHJcbiAgICBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnNldFBhZ2UodGhpcy5pbml0aWFsUGFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICAvLyByZXNldCBwYWdlIGlmIGl0ZW1zIGFycmF5IGhhcyBjaGFuZ2VkXHJcbiAgICBpZiAoY2hhbmdlcy5pdGVtcy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuaXRlbXMucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICB0aGlzLnNldFBhZ2UodGhpcy5pbml0aWFsUGFnZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAgc2V0UGFnZShwYWdlOiBudW1iZXIpIHtcclxuICAgIC8vIGdldCBuZXcgcGFnZXIgb2JqZWN0IGZvciBzcGVjaWZpZWQgcGFnZVxyXG4gICAgdGhpcy5wYWdlciA9IHRoaXMucGFnaW5hdGUodGhpcy5pdGVtcy5sZW5ndGgsIHBhZ2UsIHRoaXMucGFnZVNpemUsIHRoaXMubWF4UGFnZXMpO1xyXG5cclxuICAgIC8vIGdldCBuZXcgcGFnZSBvZiBpdGVtcyBmcm9tIGl0ZW1zIGFycmF5XHJcbiAgICB2YXIgcGFnZU9mSXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKHRoaXMucGFnZXIuc3RhcnRJbmRleCwgdGhpcy5wYWdlci5lbmRJbmRleCArIDEpO1xyXG5cclxuICAgIC8vIGNhbGwgY2hhbmdlIHBhZ2UgZnVuY3Rpb24gaW4gcGFyZW50IGNvbXBvbmVudFxyXG4gICAgdGhpcy5jaGFuZ2VQYWdlLmVtaXQodGhpcy5wYWdlci5jdXJyZW50UGFnZSk7XHJcbiAgfVxyXG4gIFxyXG4gICBwYWdpbmF0ZSh0b3RhbEl0ZW1zLCBjdXJyZW50UGFnZSwgcGFnZVNpemUsIG1heFBhZ2VzKSB7XHJcbiAgICBpZiAoY3VycmVudFBhZ2UgPT09IHZvaWQgMCkgeyBjdXJyZW50UGFnZSA9IDE7IH1cclxuICAgIGlmIChwYWdlU2l6ZSA9PT0gdm9pZCAwKSB7IHBhZ2VTaXplID0gMTA7IH1cclxuICAgIGlmIChtYXhQYWdlcyA9PT0gdm9pZCAwKSB7IG1heFBhZ2VzID0gMTA7IH1cclxuICAgIC8vIGNhbGN1bGF0ZSB0b3RhbCBwYWdlc1xyXG4gICAgdmFyIHRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodG90YWxJdGVtcyAvIHBhZ2VTaXplKTtcclxuICAgIC8vIGVuc3VyZSBjdXJyZW50IHBhZ2UgaXNuJ3Qgb3V0IG9mIHJhbmdlXHJcbiAgICBpZiAoY3VycmVudFBhZ2UgPCAxKSB7XHJcbiAgICAgICAgY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY3VycmVudFBhZ2UgPiB0b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgY3VycmVudFBhZ2UgPSB0b3RhbFBhZ2VzO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0YXJ0UGFnZSwgZW5kUGFnZTtcclxuICAgIGlmICh0b3RhbFBhZ2VzIDw9IG1heFBhZ2VzKSB7XHJcbiAgICAgICAgLy8gdG90YWwgcGFnZXMgbGVzcyB0aGFuIG1heCBzbyBzaG93IGFsbCBwYWdlc1xyXG4gICAgICAgIHN0YXJ0UGFnZSA9IDE7XHJcbiAgICAgICAgZW5kUGFnZSA9IHRvdGFsUGFnZXM7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICAvLyB0b3RhbCBwYWdlcyBtb3JlIHRoYW4gbWF4IHNvIGNhbGN1bGF0ZSBzdGFydCBhbmQgZW5kIHBhZ2VzXHJcbiAgICAgICAgdmFyIG1heFBhZ2VzQmVmb3JlQ3VycmVudFBhZ2UgPSBNYXRoLmZsb29yKG1heFBhZ2VzIC8gMik7XHJcbiAgICAgICAgdmFyIG1heFBhZ2VzQWZ0ZXJDdXJyZW50UGFnZSA9IE1hdGguY2VpbChtYXhQYWdlcyAvIDIpIC0gMTtcclxuICAgICAgICBpZiAoY3VycmVudFBhZ2UgPD0gbWF4UGFnZXNCZWZvcmVDdXJyZW50UGFnZSkge1xyXG4gICAgICAgICAgICAvLyBjdXJyZW50IHBhZ2UgbmVhciB0aGUgc3RhcnRcclxuICAgICAgICAgICAgc3RhcnRQYWdlID0gMTtcclxuICAgICAgICAgICAgZW5kUGFnZSA9IG1heFBhZ2VzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjdXJyZW50UGFnZSArIG1heFBhZ2VzQWZ0ZXJDdXJyZW50UGFnZSA+PSB0b3RhbFBhZ2VzKSB7XHJcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgcGFnZSBuZWFyIHRoZSBlbmRcclxuICAgICAgICAgICAgc3RhcnRQYWdlID0gdG90YWxQYWdlcyAtIG1heFBhZ2VzICsgMTtcclxuICAgICAgICAgICAgZW5kUGFnZSA9IHRvdGFsUGFnZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBjdXJyZW50IHBhZ2Ugc29tZXdoZXJlIGluIHRoZSBtaWRkbGVcclxuICAgICAgICAgICAgc3RhcnRQYWdlID0gY3VycmVudFBhZ2UgLSBtYXhQYWdlc0JlZm9yZUN1cnJlbnRQYWdlO1xyXG4gICAgICAgICAgICBlbmRQYWdlID0gY3VycmVudFBhZ2UgKyBtYXhQYWdlc0FmdGVyQ3VycmVudFBhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gY2FsY3VsYXRlIHN0YXJ0IGFuZCBlbmQgaXRlbSBpbmRleGVzXHJcbiAgICB2YXIgc3RhcnRJbmRleCA9IChjdXJyZW50UGFnZSAtIDEpICogcGFnZVNpemU7XHJcbiAgICB2YXIgZW5kSW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4ICsgcGFnZVNpemUgLSAxLCB0b3RhbEl0ZW1zIC0gMSk7XHJcbiAgICAvLyBjcmVhdGUgYW4gYXJyYXkgb2YgcGFnZXMgdG8gbmctcmVwZWF0IGluIHRoZSBwYWdlciBjb250cm9sXHJcbiAgICB2YXIgcGFnZXMgPSBBcnJheS5mcm9tKEFycmF5KChlbmRQYWdlICsgMSkgLSBzdGFydFBhZ2UpLmtleXMoKSkubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBzdGFydFBhZ2UgKyBpOyB9KTtcclxuICAgIC8vIHJldHVybiBvYmplY3Qgd2l0aCBhbGwgcGFnZXIgcHJvcGVydGllcyByZXF1aXJlZCBieSB0aGUgdmlld1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbEl0ZW1zLFxyXG4gICAgICAgIGN1cnJlbnRQYWdlOiBjdXJyZW50UGFnZSxcclxuICAgICAgICBwYWdlU2l6ZTogcGFnZVNpemUsXHJcbiAgICAgICAgdG90YWxQYWdlczogdG90YWxQYWdlcyxcclxuICAgICAgICBzdGFydFBhZ2U6IHN0YXJ0UGFnZSxcclxuICAgICAgICBlbmRQYWdlOiBlbmRQYWdlLFxyXG4gICAgICAgIHN0YXJ0SW5kZXg6IHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgZW5kSW5kZXg6IGVuZEluZGV4LFxyXG4gICAgICAgIHBhZ2VzOiBwYWdlc1xyXG4gICAgfTtcclxufVxyXG5cclxufSJdfQ==
|