bpm-core 0.0.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.
Files changed (186) hide show
  1. package/README.md +30 -0
  2. package/esm2022/bpm-core.mjs +5 -0
  3. package/esm2022/lib/classes/form-validation.mjs +80 -0
  4. package/esm2022/lib/classes/index.mjs +2 -0
  5. package/esm2022/lib/components/app-component-sections/activities/activities.component.mjs +51 -0
  6. package/esm2022/lib/components/app-component-sections/comment-section/comment-section.component.mjs +66 -0
  7. package/esm2022/lib/components/app-component-sections/faq-sidenav/faq-sidenav.component.mjs +29 -0
  8. package/esm2022/lib/components/app-component-sections/faqs/faqs.component.mjs +32 -0
  9. package/esm2022/lib/components/app-component-sections/faqs/index.mjs +2 -0
  10. package/esm2022/lib/components/app-component-sections/feedback-section/feedback-section.component.mjs +236 -0
  11. package/esm2022/lib/components/app-component-sections/form-section/form-section.component.mjs +270 -0
  12. package/esm2022/lib/components/app-component-sections/index.mjs +9 -0
  13. package/esm2022/lib/components/app-component-sections/main-request-details/main-request-details.component.mjs +34 -0
  14. package/esm2022/lib/components/app-component-sections/profile-section/profile-section.component.mjs +45 -0
  15. package/esm2022/lib/components/app-component-sections/service-header/service-header.component.mjs +162 -0
  16. package/esm2022/lib/components/app-component-sections/status/status.component.mjs +38 -0
  17. package/esm2022/lib/components/app-component-sections/workflow-section/workflow-section.component.mjs +162 -0
  18. package/esm2022/lib/components/shared-components/confirmation-popup/confirmation-popup.component.mjs +39 -0
  19. package/esm2022/lib/components/shared-components/delete-popup/delete-popup.component.mjs +19 -0
  20. package/esm2022/lib/components/shared-components/dialogs/confirm-dialog/confirm-dialog.component.mjs +30 -0
  21. package/esm2022/lib/components/shared-components/dialogs/delete-dialog/delete-dialog.component.mjs +28 -0
  22. package/esm2022/lib/components/shared-components/dialogs/submit-dialog/submit-dialog.component.mjs +72 -0
  23. package/esm2022/lib/components/shared-components/doc-uploader/docs-uploader.component.mjs +686 -0
  24. package/esm2022/lib/components/shared-components/form-field/add-attachment-section/add-attachment-section.component.mjs +77 -0
  25. package/esm2022/lib/components/shared-components/form-field/attachment-section/attachment-section.component.mjs +181 -0
  26. package/esm2022/lib/components/shared-components/form-field/base-component/base-component.component.mjs +198 -0
  27. package/esm2022/lib/components/shared-components/form-field/checkbox/checkbox.component.mjs +69 -0
  28. package/esm2022/lib/components/shared-components/form-field/custom-searchable-autocomplete/custom-searchable.component.mjs +201 -0
  29. package/esm2022/lib/components/shared-components/form-field/date-picker/date-format.mjs +31 -0
  30. package/esm2022/lib/components/shared-components/form-field/date-picker/date-picker.component.mjs +244 -0
  31. package/esm2022/lib/components/shared-components/form-field/date-range-picker/date-range-picker.component.mjs +26 -0
  32. package/esm2022/lib/components/shared-components/form-field/form-label/form-label.component.mjs +31 -0
  33. package/esm2022/lib/components/shared-components/form-field/index.mjs +25 -0
  34. package/esm2022/lib/components/shared-components/form-field/info-item/info-item.component.mjs +72 -0
  35. package/esm2022/lib/components/shared-components/form-field/input/input.component.mjs +155 -0
  36. package/esm2022/lib/components/shared-components/form-field/input-autocomplete/index.mjs +3 -0
  37. package/esm2022/lib/components/shared-components/form-field/input-autocomplete/input-autocomplete.model.mjs +2 -0
  38. package/esm2022/lib/components/shared-components/form-field/input-currency/input-currency.component.mjs +157 -0
  39. package/esm2022/lib/components/shared-components/form-field/input-email/input-email.component.mjs +114 -0
  40. package/esm2022/lib/components/shared-components/form-field/input-mask/input-mask.component.mjs +111 -0
  41. package/esm2022/lib/components/shared-components/form-field/input-number/input-number.component.mjs +153 -0
  42. package/esm2022/lib/components/shared-components/form-field/input-telephone/input-telephone.component.mjs +176 -0
  43. package/esm2022/lib/components/shared-components/form-field/radio/radio.component.mjs +38 -0
  44. package/esm2022/lib/components/shared-components/form-field/repeated-list/repeated-list.component.mjs +32 -0
  45. package/esm2022/lib/components/shared-components/form-field/search-employee/search-employee.component.mjs +228 -0
  46. package/esm2022/lib/components/shared-components/form-field/select/select.component.mjs +191 -0
  47. package/esm2022/lib/components/shared-components/form-field/table-list/table-list.component.mjs +116 -0
  48. package/esm2022/lib/components/shared-components/form-field/textarea/special-chars.directive.mjs +39 -0
  49. package/esm2022/lib/components/shared-components/form-field/textarea/textarea.component.mjs +88 -0
  50. package/esm2022/lib/components/shared-components/form-field/toggle-button/toggle-button.component.mjs +75 -0
  51. package/esm2022/lib/components/shared-components/index.mjs +10 -0
  52. package/esm2022/lib/components/shared-components/terms-conditions/terms-conditions.component.mjs +31 -0
  53. package/esm2022/lib/components/shared-components/title-section/title-section.component.mjs +31 -0
  54. package/esm2022/lib/constants/constants.mjs +144 -0
  55. package/esm2022/lib/constants/index.mjs +2 -0
  56. package/esm2022/lib/environments/environment.local.mjs +27 -0
  57. package/esm2022/lib/functions/data-to-blob.mjs +12 -0
  58. package/esm2022/lib/functions/encode-password.mjs +14 -0
  59. package/esm2022/lib/functions/handel-error-response.mjs +12 -0
  60. package/esm2022/lib/functions/index.mjs +5 -0
  61. package/esm2022/lib/functions/is-valid-data.mjs +42 -0
  62. package/esm2022/lib/hooks/index.mjs +3 -0
  63. package/esm2022/lib/hooks/load-form.mjs +13 -0
  64. package/esm2022/lib/hooks/save-form.mjs +18 -0
  65. package/esm2022/lib/i18n/ar.mjs +183 -0
  66. package/esm2022/lib/i18n/en.mjs +187 -0
  67. package/esm2022/lib/i18n/index.mjs +3 -0
  68. package/esm2022/lib/interfaces/api-response.interface.mjs +2 -0
  69. package/esm2022/lib/interfaces/document-file.interface.mjs +2 -0
  70. package/esm2022/lib/interfaces/form-items.interface.mjs +2 -0
  71. package/esm2022/lib/interfaces/form.interface.mjs +150 -0
  72. package/esm2022/lib/interfaces/igate-user.interface.mjs +2 -0
  73. package/esm2022/lib/interfaces/index.mjs +8 -0
  74. package/esm2022/lib/interfaces/lov-list.interface.mjs +2 -0
  75. package/esm2022/lib/interfaces/lov.interface.mjs +2 -0
  76. package/esm2022/lib/interfaces/shared.interface.mjs +2 -0
  77. package/esm2022/lib/pipes/currency.pipe.mjs +66 -0
  78. package/esm2022/lib/pipes/format-as-password.pipe.mjs +19 -0
  79. package/esm2022/lib/pipes/index.mjs +3 -0
  80. package/esm2022/lib/services/feedBack.service.mjs +80 -0
  81. package/esm2022/lib/services/i18n.service.mjs +36 -0
  82. package/esm2022/lib/services/index.mjs +3 -0
  83. package/esm2022/lib/services/sidenav.service.mjs +69 -0
  84. package/esm2022/lib/validators/ar.directive.mjs +53 -0
  85. package/esm2022/lib/validators/currency.directive.mjs +74 -0
  86. package/esm2022/lib/validators/en.directive.mjs +50 -0
  87. package/esm2022/lib/validators/id.validator.mjs +66 -0
  88. package/esm2022/lib/validators/index.mjs +8 -0
  89. package/esm2022/lib/validators/string-to-boolean.pipe.mjs +16 -0
  90. package/esm2022/lib/validators/text.directive.mjs +50 -0
  91. package/esm2022/lib/validators/timer.pipe.mjs +19 -0
  92. package/esm2022/public-api.mjs +16 -0
  93. package/fesm2022/bpm-core.mjs +6005 -0
  94. package/fesm2022/bpm-core.mjs.map +1 -0
  95. package/index.d.ts +5 -0
  96. package/lib/classes/form-validation.d.ts +19 -0
  97. package/lib/classes/index.d.ts +1 -0
  98. package/lib/components/app-component-sections/activities/activities.component.d.ts +22 -0
  99. package/lib/components/app-component-sections/comment-section/comment-section.component.d.ts +19 -0
  100. package/lib/components/app-component-sections/faq-sidenav/faq-sidenav.component.d.ts +13 -0
  101. package/lib/components/app-component-sections/faqs/faqs.component.d.ts +17 -0
  102. package/lib/components/app-component-sections/faqs/index.d.ts +1 -0
  103. package/lib/components/app-component-sections/feedback-section/feedback-section.component.d.ts +38 -0
  104. package/lib/components/app-component-sections/form-section/form-section.component.d.ts +58 -0
  105. package/lib/components/app-component-sections/index.d.ts +8 -0
  106. package/lib/components/app-component-sections/main-request-details/main-request-details.component.d.ts +13 -0
  107. package/lib/components/app-component-sections/profile-section/profile-section.component.d.ts +17 -0
  108. package/lib/components/app-component-sections/service-header/service-header.component.d.ts +35 -0
  109. package/lib/components/app-component-sections/status/status.component.d.ts +23 -0
  110. package/lib/components/app-component-sections/workflow-section/workflow-section.component.d.ts +29 -0
  111. package/lib/components/shared-components/confirmation-popup/confirmation-popup.component.d.ts +25 -0
  112. package/lib/components/shared-components/delete-popup/delete-popup.component.d.ts +6 -0
  113. package/lib/components/shared-components/dialogs/confirm-dialog/confirm-dialog.component.d.ts +11 -0
  114. package/lib/components/shared-components/dialogs/delete-dialog/delete-dialog.component.d.ts +11 -0
  115. package/lib/components/shared-components/dialogs/submit-dialog/submit-dialog.component.d.ts +15 -0
  116. package/lib/components/shared-components/doc-uploader/docs-uploader.component.d.ts +144 -0
  117. package/lib/components/shared-components/form-field/add-attachment-section/add-attachment-section.component.d.ts +16 -0
  118. package/lib/components/shared-components/form-field/attachment-section/attachment-section.component.d.ts +30 -0
  119. package/lib/components/shared-components/form-field/base-component/base-component.component.d.ts +63 -0
  120. package/lib/components/shared-components/form-field/checkbox/checkbox.component.d.ts +18 -0
  121. package/lib/components/shared-components/form-field/custom-searchable-autocomplete/custom-searchable.component.d.ts +29 -0
  122. package/lib/components/shared-components/form-field/date-picker/date-format.d.ts +17 -0
  123. package/lib/components/shared-components/form-field/date-picker/date-picker.component.d.ts +41 -0
  124. package/lib/components/shared-components/form-field/date-range-picker/date-range-picker.component.d.ts +10 -0
  125. package/lib/components/shared-components/form-field/form-label/form-label.component.d.ts +12 -0
  126. package/lib/components/shared-components/form-field/index.d.ts +24 -0
  127. package/lib/components/shared-components/form-field/info-item/info-item.component.d.ts +23 -0
  128. package/lib/components/shared-components/form-field/input/input.component.d.ts +32 -0
  129. package/lib/components/shared-components/form-field/input-autocomplete/index.d.ts +1 -0
  130. package/lib/components/shared-components/form-field/input-autocomplete/input-autocomplete.model.d.ts +6 -0
  131. package/lib/components/shared-components/form-field/input-currency/input-currency.component.d.ts +31 -0
  132. package/lib/components/shared-components/form-field/input-email/input-email.component.d.ts +27 -0
  133. package/lib/components/shared-components/form-field/input-mask/input-mask.component.d.ts +27 -0
  134. package/lib/components/shared-components/form-field/input-number/input-number.component.d.ts +30 -0
  135. package/lib/components/shared-components/form-field/input-telephone/input-telephone.component.d.ts +45 -0
  136. package/lib/components/shared-components/form-field/radio/radio.component.d.ts +10 -0
  137. package/lib/components/shared-components/form-field/repeated-list/repeated-list.component.d.ts +9 -0
  138. package/lib/components/shared-components/form-field/search-employee/search-employee.component.d.ts +44 -0
  139. package/lib/components/shared-components/form-field/select/select.component.d.ts +36 -0
  140. package/lib/components/shared-components/form-field/table-list/table-list.component.d.ts +26 -0
  141. package/lib/components/shared-components/form-field/textarea/special-chars.directive.d.ts +10 -0
  142. package/lib/components/shared-components/form-field/textarea/textarea.component.d.ts +20 -0
  143. package/lib/components/shared-components/form-field/toggle-button/toggle-button.component.d.ts +20 -0
  144. package/lib/components/shared-components/index.d.ts +9 -0
  145. package/lib/components/shared-components/terms-conditions/terms-conditions.component.d.ts +12 -0
  146. package/lib/components/shared-components/title-section/title-section.component.d.ts +13 -0
  147. package/lib/constants/constants.d.ts +122 -0
  148. package/lib/constants/index.d.ts +1 -0
  149. package/lib/environments/environment.local.d.ts +26 -0
  150. package/lib/functions/data-to-blob.d.ts +1 -0
  151. package/lib/functions/encode-password.d.ts +1 -0
  152. package/lib/functions/handel-error-response.d.ts +4 -0
  153. package/lib/functions/index.d.ts +4 -0
  154. package/lib/functions/is-valid-data.d.ts +1 -0
  155. package/lib/hooks/index.d.ts +2 -0
  156. package/lib/hooks/load-form.d.ts +10 -0
  157. package/lib/hooks/save-form.d.ts +15 -0
  158. package/lib/i18n/ar.d.ts +170 -0
  159. package/lib/i18n/en.d.ts +174 -0
  160. package/lib/i18n/index.d.ts +2 -0
  161. package/lib/interfaces/api-response.interface.d.ts +5 -0
  162. package/lib/interfaces/document-file.interface.d.ts +12 -0
  163. package/lib/interfaces/form-items.interface.d.ts +14 -0
  164. package/lib/interfaces/form.interface.d.ts +95 -0
  165. package/lib/interfaces/igate-user.interface.d.ts +16 -0
  166. package/lib/interfaces/index.d.ts +7 -0
  167. package/lib/interfaces/lov-list.interface.d.ts +10 -0
  168. package/lib/interfaces/lov.interface.d.ts +19 -0
  169. package/lib/interfaces/shared.interface.d.ts +21 -0
  170. package/lib/pipes/currency.pipe.d.ts +13 -0
  171. package/lib/pipes/format-as-password.pipe.d.ts +7 -0
  172. package/lib/pipes/index.d.ts +2 -0
  173. package/lib/services/feedBack.service.d.ts +21 -0
  174. package/lib/services/i18n.service.d.ts +10 -0
  175. package/lib/services/index.d.ts +2 -0
  176. package/lib/services/sidenav.service.d.ts +28 -0
  177. package/lib/validators/ar.directive.d.ts +11 -0
  178. package/lib/validators/currency.directive.d.ts +16 -0
  179. package/lib/validators/en.directive.d.ts +11 -0
  180. package/lib/validators/id.validator.d.ts +3 -0
  181. package/lib/validators/index.d.ts +7 -0
  182. package/lib/validators/string-to-boolean.pipe.d.ts +7 -0
  183. package/lib/validators/text.directive.d.ts +12 -0
  184. package/lib/validators/timer.pipe.d.ts +7 -0
  185. package/package.json +26 -0
  186. package/public-api.d.ts +13 -0
@@ -0,0 +1,191 @@
1
+ import { ReactiveFormsModule, Validators } from '@angular/forms';
2
+ /* eslint-disable @angular-eslint/component-selector */
3
+ /* eslint-disable @angular-eslint/use-lifecycle-interface */
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ /* eslint-disable @angular-eslint/no-output-on-prefix */
6
+ import { BaseComponent } from './../base-component/base-component.component';
7
+ import { MatError, MatFormField, MatLabel, MatOption, MatSelect } from '@angular/material/select';
8
+ import { Component, Input, Output, EventEmitter, ViewChild, CUSTOM_ELEMENTS_SCHEMA, } from '@angular/core';
9
+ import { MatProgressSpinner } from "@angular/material/progress-spinner";
10
+ import { NgForOf, NgIf } from "@angular/common";
11
+ import { InfoItemComponent } from "../info-item/info-item.component";
12
+ import { FormLabelComponent } from "../form-label/form-label.component";
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/forms";
15
+ export class SelectComponent extends BaseComponent {
16
+ emitedValues = [];
17
+ valueName = 'description';
18
+ parentKey = '';
19
+ label;
20
+ tooltip;
21
+ className = 'bordered-input';
22
+ showLabel = true;
23
+ readonly = false;
24
+ optional = false;
25
+ data;
26
+ onChange = new EventEmitter();
27
+ error;
28
+ optionAr;
29
+ optionEn;
30
+ hasPlaceHolder = false;
31
+ emitedMultiValue = new EventEmitter();
32
+ selectCtrl;
33
+ selectAllEnabled = true;
34
+ selectAllOption;
35
+ selectedValues = [];
36
+ parentValue;
37
+ ngOnInit() {
38
+ // this.resetPropagator.subscribe(this, this.resetKeyValue);
39
+ if (this.field?.key) {
40
+ this.controller.setValue(this.field.key);
41
+ }
42
+ else {
43
+ this.controller.setValue('');
44
+ }
45
+ if (this.field?.length > 0) {
46
+ this.controller.setValue(this.field);
47
+ }
48
+ if (this.required) {
49
+ this.controller.setValidators([Validators.required]);
50
+ }
51
+ // send back case
52
+ if (this.lov && this.lov?.options?.length &&
53
+ Array.isArray(this.controller?.value) &&
54
+ this.controller?.value?.length === this.lov?.options?.length) {
55
+ this.selectAllOption?.select();
56
+ this.toggleAllOptions(true);
57
+ }
58
+ }
59
+ ngOnChanges(changes) {
60
+ if (changes?.['field'] && !this.multiple) {
61
+ if (changes['field'].currentValue?.key == null) {
62
+ this.controller.setValue('');
63
+ }
64
+ else {
65
+ this.controller.setValue(changes['field'].currentValue.key);
66
+ }
67
+ }
68
+ }
69
+ resetKeyValue() {
70
+ if (!this.isReadOnly) {
71
+ this.controller.setValue(null);
72
+ this.controller.markAsUntouched();
73
+ if (this.multiple) {
74
+ this.field = [];
75
+ this.emitedValues = [];
76
+ this.emitedValue.emit(this.emitedValues);
77
+ }
78
+ else {
79
+ this.field = {
80
+ value: null,
81
+ key: null,
82
+ };
83
+ this.emitedValue.emit(this.field);
84
+ }
85
+ }
86
+ }
87
+ toggleAllOptions(value) {
88
+ this.selectCtrl['options'].forEach((option) => {
89
+ if (value.selected) {
90
+ option.select();
91
+ }
92
+ else {
93
+ option.deselect();
94
+ }
95
+ });
96
+ }
97
+ transformSelectedData(value) {
98
+ if (!value) {
99
+ return '';
100
+ }
101
+ if (value[0] === 'all') {
102
+ return this.lov.options[1]['description'];
103
+ }
104
+ else {
105
+ const selectedOption = this.lov?.options?.find((option) => {
106
+ let val = value[0];
107
+ if (typeof val !== 'string') {
108
+ val = val && val['value'];
109
+ }
110
+ return option.value === val;
111
+ });
112
+ return selectedOption?.description;
113
+ }
114
+ }
115
+ handleOnOptionSelected(value) {
116
+ value = value.filter((value) => value !== 'all'); // without all
117
+ const selectedValues = value.map((val) => {
118
+ const item = this.lov?.options?.find((element) => element.value == val);
119
+ return {
120
+ key: val,
121
+ value: item.description,
122
+ };
123
+ });
124
+ this.emitedMultiValue.emit(selectedValues);
125
+ }
126
+ emitSelectedValue(event) {
127
+ const index = this.lov.options.findIndex((option) => option.value === event.value);
128
+ this.controller.setValue(event.value);
129
+ this.emitedValue.emit({
130
+ key: event.value,
131
+ value: this.lov.options[index].description,
132
+ });
133
+ }
134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
135
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: SelectComponent, isStandalone: true, selector: "app-select", inputs: { valueName: "valueName", parentKey: "parentKey", label: "label", tooltip: "tooltip", className: "className", showLabel: "showLabel", readonly: "readonly", optional: "optional", data: "data", error: "error", optionAr: "optionAr", optionEn: "optionEn", hasPlaceHolder: "hasPlaceHolder", parentValue: "parentValue" }, outputs: { onChange: "onChange", emitedMultiValue: "emitedMultiValue" }, viewQueries: [{ propertyName: "selectCtrl", first: true, predicate: ["selectCtrl"], descendants: true }, { propertyName: "selectAllOption", first: true, predicate: ["selectAllOption"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!isReadOnly\">\r\n <app-form-label [label]=\"label\" [optional]=\"optional\" [hideOption]=\"hideOption\" [showLabel]=\"showLabel\">\r\n </app-form-label>\r\n <mat-form-field class=\"{{className}}\" [floatLabel]=\"'auto'\">\r\n <mat-label>\r\n {{ hasPlaceHolder ? placeholder : i18n.translate('selectYourOption')}}\r\n </mat-label>\r\n <label class=\"mat-form-content\">\r\n <ng-container *ngIf=\"!multiple\">\r\n <mat-select disableOptionCentering [disabled]=\"disabled\" [formControl]=\"controller\"\r\n (selectionChange)=\"emitSelectedValue($event)\"\r\n [placeholder]=\"hasPlaceHolder ? placeholder : i18n.translate('selectYourOption')\">\r\n <ng-container *ngIf=\"parentKey !== ''\">\r\n <ng-container *ngFor=\"let element of lov?.options\">\r\n <mat-option *ngIf=\"element?.parentValue === parentKey\" [value]=\"element.value\">\r\n {{element.description}}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"parentKey ===''\">\r\n <mat-option *ngFor=\"let element of lov?.options\" [value]=\"element.value\">\r\n {{element.description}}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </ng-container>\r\n <ng-container *ngIf=\"multiple\">\r\n <mat-select #selectCtrl [disabled]=\"disabled\" [formControl]=\"controller\" multiple\r\n (selectionChange)=\"handleOnOptionSelected($event?.value)\"\r\n [placeholder]=\"hasPlaceHolder ? placeholder : i18n.translate('selectYourOption')\">\r\n\r\n <mat-select-trigger *ngIf=\"selectAllEnabled\">\r\n {{ transformSelectedData(controller?.getRawValue())}}\r\n <span *ngIf=\"(controller.value?.length || 0) > 1\" >\r\n (+{{ (controller.value?.length || 0) - 1 }} {{ controller.value?.length === 2 ? i18n.translate('other') : i18n.translate('others') }})\r\n </span>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngIf=\"parentKey !== ''\" >\r\n <ng-container *ngFor=\"let element of lov?.options\" class=\"mx-2\">\r\n <mat-option *ngIf=\"element?.parentValue === parentKey\" [value]=\"element.value\">\r\n {{element.description}}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"parentKey ===''\" >\r\n\r\n <mat-option #selectAllOption *ngIf=\"selectAllEnabled && lov?.options?.length\" value=\"all\" class=\"mx-2\" (click)=\"toggleAllOptions(selectAllOption)\">\r\n {{i18n.translate('selectAll')}}\r\n </mat-option>\r\n\r\n <mat-option *ngFor=\"let element of lov?.options\" [value]=\"element.value\" class=\"mx-2\">\r\n {{element.description}}\r\n </mat-option>\r\n\r\n\r\n </ng-container>\r\n </mat-select>\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n <mat-label *ngIf=\"loading\">\r\n <div class=\"select-placeholder-container\">\r\n <!-- <span>Loading...</span> -->\r\n <mat-spinner class=\"spinner\" diameter=\"20\"></mat-spinner>\r\n </div>\r\n </mat-label>\r\n\r\n </label>\r\n\r\n <mat-error class=\"mb-2\" *ngIf=\"(!controller?.valid)\">{{i18n.translate('validSelectError')}}{{label}}\r\n </mat-error>\r\n\r\n <mat-hint *ngIf=\"showHint && hint\" class=\"mb-2\">\r\n <span class=\"mat-error\">{{hint}}</span>\r\n </mat-hint>\r\n\r\n <!-- <mat-error *ngIf=\"!controller.valid\">{{error}}</mat-error> -->\r\n </mat-form-field>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"isReadOnly && (showIfEmpty || field?.value)\" class=\"info-section\">\r\n <app-info-item class=\"info-item w-100\" [label]=\"label\" [hasLabel]=\"hasLabel\" [insideTable]=\"insideTable\"\r\n [value]=\"field?.value || field?.key\"></app-info-item>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"isReadOnly && multiple\" class=\"info-section\">\r\n <app-info-item class=\"info-item w-100\" [label]=\"label\" [type]=\"'multipleSelect'\" [hasLabel]=\"hasLabel\" [insideTable]=\"insideTable\"\r\n [value]=\"field\"></app-info-item>\r\n</ng-container>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: InfoItemComponent, selector: "app-info-item", inputs: ["label", "value", "name", "type", "dateType", "multiple", "insideTable", "hasLabel", "arrayList", "actionType", "download"] }, { kind: "component", type: FormLabelComponent, selector: "app-form-label", inputs: ["hideOption", "showLabel", "label", "optional"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }] });
136
+ }
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SelectComponent, decorators: [{
138
+ type: Component,
139
+ args: [{ selector: 'app-select', schemas: [CUSTOM_ELEMENTS_SCHEMA], standalone: true, imports: [
140
+ ReactiveFormsModule,
141
+ MatSelect,
142
+ MatOption,
143
+ MatLabel,
144
+ MatProgressSpinner,
145
+ MatError,
146
+ NgIf,
147
+ NgForOf,
148
+ InfoItemComponent,
149
+ FormLabelComponent,
150
+ MatFormField
151
+ ], template: "<ng-container *ngIf=\"!isReadOnly\">\r\n <app-form-label [label]=\"label\" [optional]=\"optional\" [hideOption]=\"hideOption\" [showLabel]=\"showLabel\">\r\n </app-form-label>\r\n <mat-form-field class=\"{{className}}\" [floatLabel]=\"'auto'\">\r\n <mat-label>\r\n {{ hasPlaceHolder ? placeholder : i18n.translate('selectYourOption')}}\r\n </mat-label>\r\n <label class=\"mat-form-content\">\r\n <ng-container *ngIf=\"!multiple\">\r\n <mat-select disableOptionCentering [disabled]=\"disabled\" [formControl]=\"controller\"\r\n (selectionChange)=\"emitSelectedValue($event)\"\r\n [placeholder]=\"hasPlaceHolder ? placeholder : i18n.translate('selectYourOption')\">\r\n <ng-container *ngIf=\"parentKey !== ''\">\r\n <ng-container *ngFor=\"let element of lov?.options\">\r\n <mat-option *ngIf=\"element?.parentValue === parentKey\" [value]=\"element.value\">\r\n {{element.description}}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"parentKey ===''\">\r\n <mat-option *ngFor=\"let element of lov?.options\" [value]=\"element.value\">\r\n {{element.description}}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </ng-container>\r\n <ng-container *ngIf=\"multiple\">\r\n <mat-select #selectCtrl [disabled]=\"disabled\" [formControl]=\"controller\" multiple\r\n (selectionChange)=\"handleOnOptionSelected($event?.value)\"\r\n [placeholder]=\"hasPlaceHolder ? placeholder : i18n.translate('selectYourOption')\">\r\n\r\n <mat-select-trigger *ngIf=\"selectAllEnabled\">\r\n {{ transformSelectedData(controller?.getRawValue())}}\r\n <span *ngIf=\"(controller.value?.length || 0) > 1\" >\r\n (+{{ (controller.value?.length || 0) - 1 }} {{ controller.value?.length === 2 ? i18n.translate('other') : i18n.translate('others') }})\r\n </span>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngIf=\"parentKey !== ''\" >\r\n <ng-container *ngFor=\"let element of lov?.options\" class=\"mx-2\">\r\n <mat-option *ngIf=\"element?.parentValue === parentKey\" [value]=\"element.value\">\r\n {{element.description}}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"parentKey ===''\" >\r\n\r\n <mat-option #selectAllOption *ngIf=\"selectAllEnabled && lov?.options?.length\" value=\"all\" class=\"mx-2\" (click)=\"toggleAllOptions(selectAllOption)\">\r\n {{i18n.translate('selectAll')}}\r\n </mat-option>\r\n\r\n <mat-option *ngFor=\"let element of lov?.options\" [value]=\"element.value\" class=\"mx-2\">\r\n {{element.description}}\r\n </mat-option>\r\n\r\n\r\n </ng-container>\r\n </mat-select>\r\n </ng-container>\r\n\r\n\r\n\r\n\r\n\r\n <mat-label *ngIf=\"loading\">\r\n <div class=\"select-placeholder-container\">\r\n <!-- <span>Loading...</span> -->\r\n <mat-spinner class=\"spinner\" diameter=\"20\"></mat-spinner>\r\n </div>\r\n </mat-label>\r\n\r\n </label>\r\n\r\n <mat-error class=\"mb-2\" *ngIf=\"(!controller?.valid)\">{{i18n.translate('validSelectError')}}{{label}}\r\n </mat-error>\r\n\r\n <mat-hint *ngIf=\"showHint && hint\" class=\"mb-2\">\r\n <span class=\"mat-error\">{{hint}}</span>\r\n </mat-hint>\r\n\r\n <!-- <mat-error *ngIf=\"!controller.valid\">{{error}}</mat-error> -->\r\n </mat-form-field>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"isReadOnly && (showIfEmpty || field?.value)\" class=\"info-section\">\r\n <app-info-item class=\"info-item w-100\" [label]=\"label\" [hasLabel]=\"hasLabel\" [insideTable]=\"insideTable\"\r\n [value]=\"field?.value || field?.key\"></app-info-item>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"isReadOnly && multiple\" class=\"info-section\">\r\n <app-info-item class=\"info-item w-100\" [label]=\"label\" [type]=\"'multipleSelect'\" [hasLabel]=\"hasLabel\" [insideTable]=\"insideTable\"\r\n [value]=\"field\"></app-info-item>\r\n</ng-container>\r\n" }]
152
+ }], propDecorators: { valueName: [{
153
+ type: Input
154
+ }], parentKey: [{
155
+ type: Input
156
+ }], label: [{
157
+ type: Input
158
+ }], tooltip: [{
159
+ type: Input
160
+ }], className: [{
161
+ type: Input
162
+ }], showLabel: [{
163
+ type: Input
164
+ }], readonly: [{
165
+ type: Input
166
+ }], optional: [{
167
+ type: Input
168
+ }], data: [{
169
+ type: Input
170
+ }], onChange: [{
171
+ type: Output
172
+ }], error: [{
173
+ type: Input
174
+ }], optionAr: [{
175
+ type: Input
176
+ }], optionEn: [{
177
+ type: Input
178
+ }], hasPlaceHolder: [{
179
+ type: Input
180
+ }], emitedMultiValue: [{
181
+ type: Output
182
+ }], selectCtrl: [{
183
+ type: ViewChild,
184
+ args: ['selectCtrl']
185
+ }], selectAllOption: [{
186
+ type: ViewChild,
187
+ args: ['selectAllOption']
188
+ }], parentValue: [{
189
+ type: Input
190
+ }] } });
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JwbS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zaGFyZWQtY29tcG9uZW50cy9mb3JtLWZpZWxkL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnBtLWNvcmUvc3JjL2xpYi9jb21wb25lbnRzL3NoYXJlZC1jb21wb25lbnRzL2Zvcm0tZmllbGQvc2VsZWN0L3NlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0QsdURBQXVEO0FBQ3ZELDREQUE0RDtBQUM1RCx1REFBdUQ7QUFDdkQsd0RBQXdEO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUM3RSxPQUFPLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBa0IsTUFBTSwwQkFBMEIsQ0FBQztBQUNqSCxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFNBQVMsRUFDVCxzQkFBc0IsR0FDdkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQzs7O0FBc0J0RSxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxhQUFhO0lBQ2hELFlBQVksR0FBRyxF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QUFNO2dCQUNrQixVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBRU8sZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBRW5CLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1JlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvdXNlLWxpZmVjeWNsZS1pbnRlcmZhY2UgKi9cclxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeCAqL1xyXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi8uLi9iYXNlLWNvbXBvbmVudC9iYXNlLWNvbXBvbmVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQge01hdEVycm9yLCBNYXRGb3JtRmllbGQsIE1hdExhYmVsLCBNYXRPcHRpb24sIE1hdFNlbGVjdCwgTWF0U2VsZWN0Q2hhbmdlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgRWxlbWVudFJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtNYXRQcm9ncmVzc1NwaW5uZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyXCI7XHJcbmltcG9ydCB7TmdGb3JPZiwgTmdJZn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge0luZm9JdGVtQ29tcG9uZW50fSBmcm9tIFwiLi4vaW5mby1pdGVtL2luZm8taXRlbS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtGb3JtTGFiZWxDb21wb25lbnR9IGZyb20gXCIuLi9mb3JtLWxhYmVsL2Zvcm0tbGFiZWwuY29tcG9uZW50XCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1zZWxlY3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NlbGVjdC5jb21wb25lbnQuc2NzcyddLFxyXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRTZWxlY3QsXHJcbiAgICBNYXRPcHRpb24sXHJcbiAgICBNYXRMYWJlbCxcclxuICAgIE1hdFByb2dyZXNzU3Bpbm5lcixcclxuICAgIE1hdEVycm9yLFxyXG4gICAgTmdJZixcclxuICAgIE5nRm9yT2YsXHJcbiAgICBJbmZvSXRlbUNvbXBvbmVudCxcclxuICAgIEZvcm1MYWJlbENvbXBvbmVudCxcclxuICAgIE1hdEZvcm1GaWVsZFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xyXG4gIGVtaXRlZFZhbHVlcyA9IFtdO1xyXG4gIEBJbnB1dCgpIHZhbHVlTmFtZTogYW55ID0gJ2Rlc2NyaXB0aW9uJztcclxuICBASW5wdXQoKSBwYXJlbnRLZXkgPSAnJztcclxuICBASW5wdXQoKSBsYWJlbCE6IHN0cmluZztcclxuICBASW5wdXQoKSB0b29sdGlwITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICdib3JkZXJlZC1pbnB1dCc7XHJcbiAgQElucHV0KCkgc2hvd0xhYmVsID0gdHJ1ZTtcclxuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG9wdGlvbmFsID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGF0YSE6IGFueVtdO1xyXG4gIEBPdXRwdXQoKSBvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBASW5wdXQoKSBlcnJvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBvcHRpb25BciE6IHN0cmluZztcclxuICBASW5wdXQoKSBvcHRpb25FbiE6IHN0cmluZztcclxuICBASW5wdXQoKSBoYXNQbGFjZUhvbGRlciA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBlbWl0ZWRNdWx0aVZhbHVlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdEN0cmwnKSBzZWxlY3RDdHJsITogRWxlbWVudFJlZjtcclxuICBzZWxlY3RBbGxFbmFibGVkID0gdHJ1ZTtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RBbGxPcHRpb24nKSBzZWxlY3RBbGxPcHRpb247XHJcbiAgc2VsZWN0ZWRWYWx1ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgQElucHV0KCkgcGFyZW50VmFsdWU6IHN0cmluZztcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIHRoaXMucmVzZXRQcm9wYWdhdG9yLnN1YnNjcmliZSh0aGlzLCB0aGlzLnJlc2V0S2V5VmFsdWUpO1xyXG4gICAgaWYgKHRoaXMuZmllbGQ/LmtleSkge1xyXG4gICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0VmFsdWUodGhpcy5maWVsZC5rZXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5maWVsZD8ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0VmFsdWUodGhpcy5maWVsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzZW5kIGJhY2sgY2FzZVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmxvdiAmJiB0aGlzLmxvdj8ub3B0aW9ucz8ubGVuZ3RoICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5jb250cm9sbGVyPy52YWx1ZSkgJiZcclxuICAgICAgdGhpcy5jb250cm9sbGVyPy52YWx1ZT8ubGVuZ3RoID09PSB0aGlzLmxvdj8ub3B0aW9ucz8ubGVuZ3RoXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5zZWxlY3RBbGxPcHRpb24/LnNlbGVjdCgpO1xyXG4gICAgICB0aGlzLnRvZ2dsZUFsbE9wdGlvbnModHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcz8uWydmaWVsZCddICYmICF0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgIGlmIChjaGFuZ2VzWydmaWVsZCddLmN1cnJlbnRWYWx1ZT8ua2V5ID09IG51bGwpIHtcclxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0VmFsdWUoJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZShjaGFuZ2VzWydmaWVsZCddLmN1cnJlbnRWYWx1ZS5rZXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldEtleVZhbHVlKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzUmVhZE9ubHkpIHtcclxuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKG51bGwpO1xyXG4gICAgICB0aGlzLmNvbnRyb2xsZXIubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgdGhpcy5maWVsZCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZW1pdGVkVmFsdWVzID0gW107XHJcbiAgICAgICAgdGhpcy5lbWl0ZWRWYWx1ZS5lbWl0KHRoaXMuZW1pdGVkVmFsdWVzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZpZWxkID0ge1xyXG4gICAgICAgICAgdmFsdWU6IG51bGwsXHJcbiAgICAgICAgICBrZXk6IG51bGwsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXRlZFZhbHVlLmVtaXQodGhpcy5maWVsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUFsbE9wdGlvbnModmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RDdHJsWydvcHRpb25zJ10uZm9yRWFjaCgob3B0aW9uKSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZCkge1xyXG4gICAgICAgIG9wdGlvbi5zZWxlY3QoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHRpb24uZGVzZWxlY3QoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0cmFuc2Zvcm1TZWxlY3RlZERhdGEodmFsdWUpIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgaWYgKHZhbHVlWzBdID09PSAnYWxsJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5sb3Yub3B0aW9uc1sxXVsnZGVzY3JpcHRpb24nXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5sb3Y/Lm9wdGlvbnM/LmZpbmQoKG9wdGlvbikgPT4ge1xyXG4gICAgICAgIGxldCB2YWwgPSB2YWx1ZVswXTtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIHZhbCA9IHZhbCAmJiB2YWxbJ3ZhbHVlJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvcHRpb24udmFsdWUgPT09IHZhbDtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBzZWxlY3RlZE9wdGlvbj8uZGVzY3JpcHRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVPbk9wdGlvblNlbGVjdGVkKHZhbHVlOiBhbnkpIHtcclxuICAgIHZhbHVlID0gdmFsdWUuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09ICdhbGwnKTsgLy8gd2l0aG91dCBhbGxcclxuXHJcbiAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9IHZhbHVlLm1hcCgodmFsOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgaXRlbSA9IHRoaXMubG92Py5vcHRpb25zPy5maW5kKChlbGVtZW50KSA9PiBlbGVtZW50LnZhbHVlID09IHZhbCk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGtleTogdmFsLFxyXG4gICAgICAgIHZhbHVlOiBpdGVtLmRlc2NyaXB0aW9uLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5lbWl0ZWRNdWx0aVZhbHVlLmVtaXQoc2VsZWN0ZWRWYWx1ZXMpO1xyXG4gIH1cclxuXHJcbiAgZW1pdFNlbGVjdGVkVmFsdWUoZXZlbnQ6IE1hdFNlbGVjdENoYW5nZSk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmxvdi5vcHRpb25zLmZpbmRJbmRleChcclxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBldmVudC52YWx1ZVxyXG4gICAgKTtcclxuICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZShldmVudC52YWx1ZSk7XHJcbiAgICB0aGlzLmVtaXRlZFZhbHVlLmVtaXQoe1xyXG4gICAgICBrZXk6IGV2ZW50LnZhbHVlLFxyXG4gICAgICB2YWx1ZTogdGhpcy5sb3Yub3B0aW9uc1tpbmRleF0uZGVzY3JpcHRpb24sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1JlYWRPbmx5XCI+XHJcbiAgPGFwcC1mb3JtLWxhYmVsIFtsYWJlbF09XCJsYWJlbFwiIFtvcHRpb25hbF09XCJvcHRpb25hbFwiIFtoaWRlT3B0aW9uXT1cImhpZGVPcHRpb25cIiBbc2hvd0xhYmVsXT1cInNob3dMYWJlbFwiPlxyXG4gIDwvYXBwLWZvcm0tbGFiZWw+XHJcbiAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwie3tjbGFzc05hbWV9fVwiIFtmbG9hdExhYmVsXT1cIidhdXRvJ1wiPlxyXG4gICAgPG1hdC1sYWJlbD5cclxuICAgICAge3sgaGFzUGxhY2VIb2xkZXIgPyBwbGFjZWhvbGRlciA6IGkxOG4udHJhbnNsYXRlKCdzZWxlY3RZb3VyT3B0aW9uJyl9fVxyXG4gICAgPC9tYXQtbGFiZWw+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJtYXQtZm9ybS1jb250ZW50XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbXVsdGlwbGVcIj5cclxuICAgICAgICA8bWF0LXNlbGVjdCBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtmb3JtQ29udHJvbF09XCJjb250cm9sbGVyXCJcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiZW1pdFNlbGVjdGVkVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiaGFzUGxhY2VIb2xkZXIgPyBwbGFjZWhvbGRlciA6IGkxOG4udHJhbnNsYXRlKCdzZWxlY3RZb3VyT3B0aW9uJylcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJlbnRLZXkgIT09ICcnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgbG92Py5vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJlbGVtZW50Py5wYXJlbnRWYWx1ZSA9PT0gcGFyZW50S2V5XCIgW3ZhbHVlXT1cImVsZW1lbnQudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIHt7ZWxlbWVudC5kZXNjcmlwdGlvbn19XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhcmVudEtleSA9PT0nJ1wiPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZWxlbWVudCBvZiBsb3Y/Lm9wdGlvbnNcIiBbdmFsdWVdPVwiZWxlbWVudC52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgIHt7ZWxlbWVudC5kZXNjcmlwdGlvbn19XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aXBsZVwiPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0ICAjc2VsZWN0Q3RybCAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xsZXJcIiBtdWx0aXBsZVxyXG4gICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJoYW5kbGVPbk9wdGlvblNlbGVjdGVkKCRldmVudD8udmFsdWUpXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJoYXNQbGFjZUhvbGRlciA/IHBsYWNlaG9sZGVyIDogaTE4bi50cmFuc2xhdGUoJ3NlbGVjdFlvdXJPcHRpb24nKVwiPlxyXG5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXIgKm5nSWY9XCJzZWxlY3RBbGxFbmFibGVkXCI+XHJcbiAgICAgICAgICAgIHt7IHRyYW5zZm9ybVNlbGVjdGVkRGF0YShjb250cm9sbGVyPy5nZXRSYXdWYWx1ZSgpKX19XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiKGNvbnRyb2xsZXIudmFsdWU/Lmxlbmd0aCB8fCAwKSA+IDFcIiAgPlxyXG4gICAgICAgICAgICAgICgre3sgKGNvbnRyb2xsZXIudmFsdWU/Lmxlbmd0aCB8fCAwKSAtIDEgfX0ge3sgY29udHJvbGxlci52YWx1ZT8ubGVuZ3RoID09PSAyID8gaTE4bi50cmFuc2xhdGUoJ290aGVyJykgOiBpMThuLnRyYW5zbGF0ZSgnb3RoZXJzJykgfX0pXHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJlbnRLZXkgIT09ICcnXCIgPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGxvdj8ub3B0aW9uc1wiIGNsYXNzPVwibXgtMlwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiZWxlbWVudD8ucGFyZW50VmFsdWUgPT09IHBhcmVudEtleVwiIFt2YWx1ZV09XCJlbGVtZW50LnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICB7e2VsZW1lbnQuZGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXJlbnRLZXkgPT09JydcIiA+XHJcblxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAjc2VsZWN0QWxsT3B0aW9uICpuZ0lmPVwic2VsZWN0QWxsRW5hYmxlZCAmJiBsb3Y/Lm9wdGlvbnM/Lmxlbmd0aFwiIHZhbHVlPVwiYWxsXCIgY2xhc3M9XCJteC0yXCIgKGNsaWNrKT1cInRvZ2dsZUFsbE9wdGlvbnMoc2VsZWN0QWxsT3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgIHt7aTE4bi50cmFuc2xhdGUoJ3NlbGVjdEFsbCcpfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgbG92Py5vcHRpb25zXCIgW3ZhbHVlXT1cImVsZW1lbnQudmFsdWVcIiBjbGFzcz1cIm14LTJcIj5cclxuICAgICAgICAgICAgICB7e2VsZW1lbnQuZGVzY3JpcHRpb259fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcblxyXG5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXBsYWNlaG9sZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPCEtLSA8c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPiAtLT5cclxuICAgICAgICAgIDxtYXQtc3Bpbm5lciBjbGFzcz1cInNwaW5uZXJcIiBkaWFtZXRlcj1cIjIwXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9tYXQtbGFiZWw+XHJcblxyXG4gICAgPC9sYWJlbD5cclxuXHJcbiAgICA8bWF0LWVycm9yIGNsYXNzPVwibWItMlwiICpuZ0lmPVwiKCFjb250cm9sbGVyPy52YWxpZClcIj57e2kxOG4udHJhbnNsYXRlKCd2YWxpZFNlbGVjdEVycm9yJyl9fXt7bGFiZWx9fVxyXG4gICAgPC9tYXQtZXJyb3I+XHJcblxyXG4gICAgPG1hdC1oaW50ICpuZ0lmPVwic2hvd0hpbnQgJiYgaGludFwiICBjbGFzcz1cIm1iLTJcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj57e2hpbnR9fTwvc3Bhbj5cclxuICAgIDwvbWF0LWhpbnQ+XHJcblxyXG4gICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwiIWNvbnRyb2xsZXIudmFsaWRcIj57e2Vycm9yfX08L21hdC1lcnJvcj4gLS0+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPVwiaXNSZWFkT25seSAmJiAoc2hvd0lmRW1wdHkgfHwgZmllbGQ/LnZhbHVlKVwiIGNsYXNzPVwiaW5mby1zZWN0aW9uXCI+XHJcbiAgPGFwcC1pbmZvLWl0ZW0gY2xhc3M9XCJpbmZvLWl0ZW0gdy0xMDBcIiBbbGFiZWxdPVwibGFiZWxcIiBbaGFzTGFiZWxdPVwiaGFzTGFiZWxcIiBbaW5zaWRlVGFibGVdPVwiaW5zaWRlVGFibGVcIlxyXG4gICAgW3ZhbHVlXT1cImZpZWxkPy52YWx1ZSB8fCBmaWVsZD8ua2V5XCI+PC9hcHAtaW5mby1pdGVtPlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc1JlYWRPbmx5ICYmIG11bHRpcGxlXCIgY2xhc3M9XCJpbmZvLXNlY3Rpb25cIj5cclxuICA8YXBwLWluZm8taXRlbSBjbGFzcz1cImluZm8taXRlbSB3LTEwMFwiIFtsYWJlbF09XCJsYWJlbFwiIFt0eXBlXT1cIidtdWx0aXBsZVNlbGVjdCdcIiBbaGFzTGFiZWxdPVwiaGFzTGFiZWxcIiBbaW5zaWRlVGFibGVdPVwiaW5zaWRlVGFibGVcIlxyXG4gICAgW3ZhbHVlXT1cImZpZWxkXCI+PC9hcHAtaW5mby1pdGVtPlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19
@@ -0,0 +1,116 @@
1
+ /* eslint-disable @angular-eslint/use-lifecycle-interface */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ /* eslint-disable @angular-eslint/component-selector */
4
+ import { CUSTOM_ELEMENTS_SCHEMA, EventEmitter } from '@angular/core';
5
+ import { BaseComponent } from './../base-component/base-component.component';
6
+ import { Component, Input, Output } from '@angular/core';
7
+ import { MatTableDataSource, MatTableModule } from '@angular/material/table';
8
+ import { MatPaginatorModule } from '@angular/material/paginator';
9
+ import { DatePipe, NgClass, NgForOf, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from "@angular/common";
10
+ import { RouterLink } from "@angular/router";
11
+ import { RepeatedListComponent } from "../repeated-list/repeated-list.component";
12
+ import { MatButton } from "@angular/material/button";
13
+ import { MatMenu, MatMenuItem, MatMenuTrigger } from "@angular/material/menu";
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/material/paginator";
16
+ import * as i2 from "@angular/material/table";
17
+ // import { ConfirmationPopupComponent } from '../../confirmation-popup/confirmation-popup.component';
18
+ export class TableListComponent extends BaseComponent {
19
+ columns;
20
+ columnsConfig;
21
+ rows;
22
+ actions = [];
23
+ totalRecords;
24
+ className = '';
25
+ dataSource = new MatTableDataSource();
26
+ pageChanged = new EventEmitter();
27
+ buttonAction = new EventEmitter();
28
+ emitDataRow = new EventEmitter();
29
+ // constructor(public dialog: MatDialog) { }
30
+ ngOnInit() {
31
+ this.dataSource.data = this.rows;
32
+ }
33
+ truncateName(text) {
34
+ if (text) {
35
+ const characters = text.match(/\b(\w)/g);
36
+ if (characters) {
37
+ return characters.join('');
38
+ }
39
+ else {
40
+ return '';
41
+ }
42
+ }
43
+ else {
44
+ return '';
45
+ }
46
+ }
47
+ onPageChange(event) {
48
+ this.pageChanged.emit(event);
49
+ }
50
+ delete() {
51
+ // const dialogRef = this.dialog.open(ConfirmationPopupComponent, {
52
+ // width: '700px',
53
+ // panelClass: ['confirm-popup', 'main-popup'],
54
+ // data: {
55
+ // title: 'Delete Match',
56
+ // message: 'Are you sure you want delete',
57
+ // confirmText: 'match making example name',
58
+ // moreText: '',
59
+ // type: 'delete',
60
+ // icon: 'delete-match',
61
+ // }
62
+ // });
63
+ // dialogRef.afterClosed().subscribe(() => {
64
+ // // closed
65
+ // });
66
+ }
67
+ buttonClicked(element, fn, $event) {
68
+ }
69
+ selectedRow(row) {
70
+ }
71
+ getSlaColor(value, max) {
72
+ }
73
+ sentBack() {
74
+ }
75
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: TableListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
76
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: TableListComponent, isStandalone: true, selector: "app-table-list", inputs: { columns: "columns", columnsConfig: "columnsConfig", rows: "rows", actions: "actions", totalRecords: "totalRecords", className: "className" }, outputs: { pageChanged: "pageChanged", buttonAction: "buttonAction", emitDataRow: "emitDataRow" }, usesInheritance: true, ngImport: i0, template: "<div class=\"overflow-auto\">\r\n <!-- #table (scroll)=\"onPageChange($event)\" -->\r\n <ng-container >\r\n <!-- (matSortChange)=\"sortData($event)\" -->\r\n <table mat-table [dataSource]=\"dataSource\" class=\"primary-table {{className}}\" matSort >\r\n <ng-container *ngFor=\"let column of columns; let i = index;\">\r\n <ng-container [matColumnDef]=\"column\">\r\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"{'last-column' : columnsConfig[i].type === 'actions', 'sortArrow': columnsConfig[i]?.sortName?.length }\" mat-sort-header>\r\n {{i18n.translate(columnsConfig[i].label)}} </th>\r\n \r\n <td mat-cell [ngClass]=\"{'account-disabled': element?.user?.disabledCleanUp===true}\" *matCellDef=\"let element\">\r\n <ng-container [ngSwitch]=\"columnsConfig[i].type\" *ngIf=\"rows.length\">\r\n <a [ngClass]=\"columnsConfig[i].type\" [href]=\"element[column]\" *ngSwitchCase=\"'link'\">\r\n {{ element[column] }}\r\n </a>\r\n \r\n <a [ngClass]=\"columnsConfig[i].type\" [routerLink]=\"[element.id]\" [href]=\"element[column]\"\r\n *ngSwitchCase=\"'rout'\">\r\n {{ element[column] }}\r\n </a>\r\n \r\n <span class=\"d-inline-flex align-items-center\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'date'\">\r\n <span class=\"sfi sfi-clock text-color-coral\" *ngIf=\"!loading\"></span>\r\n <span class=\"mx-2\">\r\n <!-- {{ element?.Date.from }}\r\n <ng-container *ngIf=\"element?.Date.to\">\r\n : {{ element?.Date.to }}\r\n </ng-container> -->\r\n {{ element[column] | date: 'dd/MM/YYYY' }}\r\n </span>\r\n </span>\r\n \r\n <div class=\"d-inline-flex align-items-center\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'sla'\">\r\n <app-sla [value]=\"element?.SLA.value\" [maxValue]=\"element?.SLA.max\" [canvasScale]=\"45\"\r\n [outerLineColor]=\"getSlaColor(element?.SLA.value, element?.SLA.max)\"></app-sla>\r\n </div>\r\n \r\n <div class=\"img-card table-img\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'image'\">\r\n <img [src]=\"element?.image\" alt=\"\">\r\n </div>\r\n \r\n <span class=\"{{ element[column].type }}\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'status'\">\r\n {{ element[column].label }}\r\n </span>\r\n \r\n \r\n <div class=\"d-flex mx-n1\" *ngSwitchCase=\"'RequestType'\">\r\n <div class=\"request-type mx-1 {{item.status}}\" *ngFor=\"let item of element?.RequestType\">\r\n {{ item.label }}\r\n <span class=\"mx-1\" *ngIf=\"item.status === 'need-action'\"></span>\r\n <span class=\"sfi sfi-info \" *ngIf=\"item.status === 'need-action'\"></span>\r\n </div>\r\n </div>\r\n \r\n \r\n <span class=\"{{ element[column].type }} {{ element[column] ? 'text-color-coral underline' : '' }}\"\r\n [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'number'\">\r\n {{ element[column] ? element[column] : '-' }}\r\n </span>\r\n \r\n <div class=\"text-nowrap d-flex align-items-center\" [ngClass]=\"columnsConfig[i].type\"\r\n *ngSwitchCase=\"'group'\">\r\n <span>{{element?.Group.groupName}}</span>\r\n <span class=\"mx-2\"></span>\r\n <app-repeated-list type=\"users-avatar\" [listOfItems]=\"element?.Group.users\"></app-repeated-list>\r\n </div>\r\n \r\n <div class=\"d-flex align-items-center gap-2\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'user'\">\r\n <span class=\"img-card circled-img small\" *ngIf=\"!loading\">\r\n <img src=\"{{'data:image/png;base64,' + element?.user?.personalPhoto}}\"\r\n onerror=\"this.onerror=null;this.src='assets/images/user.svg';\" alt=\"\">\r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"font-14 font-weight-medium\">{{element?.user?.name}}</span>\r\n <span class=\"font-12 font-weight-normal text-color-dark-gray mt-1\">{{element?.user?.email}}</span>\r\n </div>\r\n </div>\r\n \r\n \r\n <div class=\"delegate d-flex align-items-center\" [ngClass]=\"columnsConfig[i].type\"\r\n *ngSwitchCase=\"'assigned'\">\r\n <div class=\"img-card x-small circled-img\">\r\n <img [src]=\"element?.AssignedTo.image\" alt=\"\">\r\n </div>\r\n <span class=\"mx-1\"></span>\r\n <span class=\"font-14 font-weight-medium text-color-onyx\">{{element?.AssignedTo.name}}</span>\r\n <span class=\"sfi sfi-close text-color-coral\"></span>\r\n </div>\r\n \r\n \r\n <ng-container *ngSwitchCase=\"'statusAction'\">\r\n <div class=\"table-action\">\r\n \r\n <div class=\"count-down mx-n1\" *ngIf=\"element[column] === 'need-action'\">\r\n <div class=\"item mx-1\">\r\n <span class=\"font-12 font-weight-medium text-color-onyx d-block\">01</span>\r\n <span class=\"font-8 font-weight-light text-color-onyx d-block\">Days</span>\r\n </div>\r\n <div class=\"item mx-1\">\r\n <span class=\"font-12 font-weight-medium text-color-onyx d-block\">18</span>\r\n <span class=\"font-8 font-weight-light text-color-onyx d-block\">Hours</span>\r\n </div>\r\n <div class=\"item mx-1\">\r\n <span class=\"font-12 font-weight-medium text-color-onyx d-block\">44</span>\r\n <span class=\"font-8 font-weight-light text-color-onyx d-block\">Mins</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"d-flex align-items-center\" *ngIf=\"element[column] === 'approved'\">\r\n <span class=\"status approved\">\r\n Approved\r\n </span>\r\n </div>\r\n \r\n <div class=\"d-flex align-items-center\" *ngIf=\"element[column] === 'sent-back'\">\r\n <span class=\"status rejected\">\r\n Sent Back\r\n </span>\r\n <span class=\"mx-2\"></span>\r\n <button mat-stroked-button class=\"btn button-primary square br-w-1 font-14 font-weight-medium\"\r\n (click)=\"sentBack()\">\r\n <span class=\"sfi sfi-chat-o\"></span>\r\n </button>\r\n </div>\r\n \r\n <div class=\"d-flex align-items-center\" *ngIf=\"element[column] === 'pending'\">\r\n <span class=\"status pending\">\r\n Pending\r\n </span>\r\n <span class=\"mx-2\"></span>\r\n \r\n <div class=\"d-flex align-items-center mx-n1\">\r\n <div class=\"img-card circled-img x-small mx-1\">\r\n <img [src]=\"element?.pendingWith.image\" alt=\"\">\r\n </div>\r\n \r\n <div class=\"d-flex flex-column mx-1\">\r\n <span class=\"font-8 font-weight-medium text-color-yellow text-nowrap\">Pending With</span>\r\n <span class=\"font-11 font-weight-medium text-nowrap\">{{element?.pendingWith.name}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n </div>\r\n </ng-container>\r\n \r\n \r\n <ng-container *ngSwitchCase=\"'actions'\">\r\n \r\n <div class=\"d-flex justify-content-between mx-n2\">\r\n <ng-container *ngFor=\"let action of element[column]\">\r\n \r\n <div class=\"flex-grow-1\">\r\n <ng-container *ngIf=\"action.type.buttonType === 'stroked'\">\r\n <button mat-stroked-button (click)=\"buttonClicked(element,action.fn, $event)\"\r\n class=\"btn button-{{action.type.buttonClass}} mx-2\">\r\n {{action.label}}\r\n </button>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"action.type.buttonType === 'flat'\">\r\n <button mat-flat-button (click)=\"buttonClicked(element,action.fn, $event)\"\r\n class=\"btn button-{{action.type.buttonClass}} mx-2\">\r\n {{action.label}}\r\n </button>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"action.type.buttonType === 'icon'\">\r\n <button mat-icon-button (click)=\"buttonClicked(element,action.fn, $event)\"\r\n class=\"btn button-{{action.type.buttonClass}} mx-2\">\r\n <span class=\"sfi sfi-{{action.type.icon}}\"></span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n \r\n <ng-container *ngIf=\"action.type.buttonType === 'all'\">\r\n <button mat-icon-button class=\"btn button-transparent square medium mx-2 text-end\"\r\n [matMenuTriggerFor]=\"menuAction\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"sfi sfi-dots text-color-onyx\"></span>\r\n </button>\r\n <mat-menu #menuAction=\"matMenu\" xPosition=\"before\" class=\"actions-menu\">\r\n <button *ngIf=\"!element?.user?.email && element?.user?.disabledCleanUp!==true\" mat-menu-item class=\"text-color-onyx font-12\"\r\n (click)=\"buttonClicked(element,'CreateEmail', $event)\">\r\n {{i18n.translate('createEmail')}} \r\n </button>\r\n <button *ngIf=\"element?.user?.email && element?.user?.enabled==='true'\" mat-menu-item class=\"text-color-red font-12\"\r\n (click)=\"buttonClicked(element,'DisableEmail', $event)\">\r\n {{ i18n.translate('disableEmail')}}\r\n </button>\r\n <button *ngIf=\"element?.user?.email && element?.user?.disabledCleanUp===true\" mat-menu-item class=\"text-color-red font-12\"\r\n (click)=\"buttonClicked(element,'EnableEmail', $event)\">\r\n {{ i18n.translate('enableEmail')}}\r\n </button>\r\n <button *ngIf=\"element?.user!==null && element?.user?.disabledCleanUp!==true\" mat-menu-item class=\"text-color-onyx font-12\"\r\n (click)=\"buttonClicked(element,'CreateEntryPermission', $event)\">\r\n {{ i18n.translate('createCEP')}}\r\n </button>\r\n <!-- <button *ngIf=\"!element?.user?.email\" mat-menu-item class=\"text-color-red font-12\"\r\n (click)=\"buttonClicked(element,'DisableEntryPermission', $event)\">\r\n {{i18n.translate('disableEntryPermission')}}\r\n </button> -->\r\n <button *ngIf=\"!element?.user?.email && element?.user?.disabledCleanUp!==true\" mat-menu-item class=\"text-color-red font-12\"\r\n (click)=\"buttonClicked(element,'DeleteAccount', $event)\">\r\n {{i18n.translate('deleteAccount')}}\r\n </button>\r\n\r\n <button *ngIf=\"element?.user?.email && element?.user?.disabledCleanUp!==true\" [disabled]=\"!element?.mailExtensionAllowed\" mat-menu-item class=\"text-color-onyx font-12\"\r\n (click)=\"buttonClicked(element,'ExtendAccount', $event)\">\r\n {{ i18n.translate('extendAccount')}}\r\n </button>\r\n <button mat-menu-item class=\"text-color-onyx font-12\" *ngIf=\"element?.user?.disabledCleanUp!==true\" (click)=\"buttonClicked(element,'update', $event)\">\r\n {{ i18n.translate('updateEmploymentInformation')}}\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n \r\n <span class=\"text-nowrap\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchDefault>\r\n {{ element[column] }}\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"loading\">\r\n <span class=\" d-block loading-bg\"></span>\r\n </ng-container>\r\n \r\n </td>\r\n \r\n \r\n </ng-container>\r\n </ng-container>\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"columns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: columns;\" class=\"cursor-pointer\" (click)=\"selectedRow(row)\"></tr>\r\n </table>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"loading\">\r\n <span>loading...</span>\r\n </ng-container> -->\r\n <!-- <ng-container *ngIf=\"loading\">-->\r\n <!-- <td *matCellDef=\"let element\" >loading....</td>-->\r\n <!-- </ng-container>-->\r\n <!--{{this.rows | json}}-->\r\n \r\n<!-- <app-no-data-placeholder *ngIf=\"noData && !loading\" [noDataPlaceholder]=\"noDataObj\"></app-no-data-placeholder> -->\r\n\r\n <mat-paginator [pageSize]=\"10\" [length]=\"totalRecords\" (page)=\"onPageChange($event)\" \r\n [pageSizeOptions]=\"[5, 10, 25, 100]\" aria-label=\"Select page of users\"></mat-paginator>\r\n <!-- style-paginator -->\r\n <!-- showFirstLastButtons -->\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i1.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "component", type: RepeatedListComponent, selector: "app-repeated-list", inputs: ["listOfItems", "type"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
77
+ }
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: TableListComponent, decorators: [{
79
+ type: Component,
80
+ args: [{ selector: 'app-table-list', schemas: [CUSTOM_ELEMENTS_SCHEMA], standalone: true, imports: [
81
+ MatPaginatorModule,
82
+ MatTableModule,
83
+ NgForOf,
84
+ NgClass,
85
+ NgSwitchCase,
86
+ RouterLink,
87
+ NgSwitch,
88
+ NgIf,
89
+ DatePipe,
90
+ RepeatedListComponent,
91
+ MatButton,
92
+ MatMenu,
93
+ MatMenuTrigger,
94
+ MatMenuItem,
95
+ NgSwitchDefault
96
+ ], template: "<div class=\"overflow-auto\">\r\n <!-- #table (scroll)=\"onPageChange($event)\" -->\r\n <ng-container >\r\n <!-- (matSortChange)=\"sortData($event)\" -->\r\n <table mat-table [dataSource]=\"dataSource\" class=\"primary-table {{className}}\" matSort >\r\n <ng-container *ngFor=\"let column of columns; let i = index;\">\r\n <ng-container [matColumnDef]=\"column\">\r\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"{'last-column' : columnsConfig[i].type === 'actions', 'sortArrow': columnsConfig[i]?.sortName?.length }\" mat-sort-header>\r\n {{i18n.translate(columnsConfig[i].label)}} </th>\r\n \r\n <td mat-cell [ngClass]=\"{'account-disabled': element?.user?.disabledCleanUp===true}\" *matCellDef=\"let element\">\r\n <ng-container [ngSwitch]=\"columnsConfig[i].type\" *ngIf=\"rows.length\">\r\n <a [ngClass]=\"columnsConfig[i].type\" [href]=\"element[column]\" *ngSwitchCase=\"'link'\">\r\n {{ element[column] }}\r\n </a>\r\n \r\n <a [ngClass]=\"columnsConfig[i].type\" [routerLink]=\"[element.id]\" [href]=\"element[column]\"\r\n *ngSwitchCase=\"'rout'\">\r\n {{ element[column] }}\r\n </a>\r\n \r\n <span class=\"d-inline-flex align-items-center\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'date'\">\r\n <span class=\"sfi sfi-clock text-color-coral\" *ngIf=\"!loading\"></span>\r\n <span class=\"mx-2\">\r\n <!-- {{ element?.Date.from }}\r\n <ng-container *ngIf=\"element?.Date.to\">\r\n : {{ element?.Date.to }}\r\n </ng-container> -->\r\n {{ element[column] | date: 'dd/MM/YYYY' }}\r\n </span>\r\n </span>\r\n \r\n <div class=\"d-inline-flex align-items-center\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'sla'\">\r\n <app-sla [value]=\"element?.SLA.value\" [maxValue]=\"element?.SLA.max\" [canvasScale]=\"45\"\r\n [outerLineColor]=\"getSlaColor(element?.SLA.value, element?.SLA.max)\"></app-sla>\r\n </div>\r\n \r\n <div class=\"img-card table-img\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'image'\">\r\n <img [src]=\"element?.image\" alt=\"\">\r\n </div>\r\n \r\n <span class=\"{{ element[column].type }}\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'status'\">\r\n {{ element[column].label }}\r\n </span>\r\n \r\n \r\n <div class=\"d-flex mx-n1\" *ngSwitchCase=\"'RequestType'\">\r\n <div class=\"request-type mx-1 {{item.status}}\" *ngFor=\"let item of element?.RequestType\">\r\n {{ item.label }}\r\n <span class=\"mx-1\" *ngIf=\"item.status === 'need-action'\"></span>\r\n <span class=\"sfi sfi-info \" *ngIf=\"item.status === 'need-action'\"></span>\r\n </div>\r\n </div>\r\n \r\n \r\n <span class=\"{{ element[column].type }} {{ element[column] ? 'text-color-coral underline' : '' }}\"\r\n [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'number'\">\r\n {{ element[column] ? element[column] : '-' }}\r\n </span>\r\n \r\n <div class=\"text-nowrap d-flex align-items-center\" [ngClass]=\"columnsConfig[i].type\"\r\n *ngSwitchCase=\"'group'\">\r\n <span>{{element?.Group.groupName}}</span>\r\n <span class=\"mx-2\"></span>\r\n <app-repeated-list type=\"users-avatar\" [listOfItems]=\"element?.Group.users\"></app-repeated-list>\r\n </div>\r\n \r\n <div class=\"d-flex align-items-center gap-2\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchCase=\"'user'\">\r\n <span class=\"img-card circled-img small\" *ngIf=\"!loading\">\r\n <img src=\"{{'data:image/png;base64,' + element?.user?.personalPhoto}}\"\r\n onerror=\"this.onerror=null;this.src='assets/images/user.svg';\" alt=\"\">\r\n </span>\r\n <div class=\"d-flex flex-column\">\r\n <span class=\"font-14 font-weight-medium\">{{element?.user?.name}}</span>\r\n <span class=\"font-12 font-weight-normal text-color-dark-gray mt-1\">{{element?.user?.email}}</span>\r\n </div>\r\n </div>\r\n \r\n \r\n <div class=\"delegate d-flex align-items-center\" [ngClass]=\"columnsConfig[i].type\"\r\n *ngSwitchCase=\"'assigned'\">\r\n <div class=\"img-card x-small circled-img\">\r\n <img [src]=\"element?.AssignedTo.image\" alt=\"\">\r\n </div>\r\n <span class=\"mx-1\"></span>\r\n <span class=\"font-14 font-weight-medium text-color-onyx\">{{element?.AssignedTo.name}}</span>\r\n <span class=\"sfi sfi-close text-color-coral\"></span>\r\n </div>\r\n \r\n \r\n <ng-container *ngSwitchCase=\"'statusAction'\">\r\n <div class=\"table-action\">\r\n \r\n <div class=\"count-down mx-n1\" *ngIf=\"element[column] === 'need-action'\">\r\n <div class=\"item mx-1\">\r\n <span class=\"font-12 font-weight-medium text-color-onyx d-block\">01</span>\r\n <span class=\"font-8 font-weight-light text-color-onyx d-block\">Days</span>\r\n </div>\r\n <div class=\"item mx-1\">\r\n <span class=\"font-12 font-weight-medium text-color-onyx d-block\">18</span>\r\n <span class=\"font-8 font-weight-light text-color-onyx d-block\">Hours</span>\r\n </div>\r\n <div class=\"item mx-1\">\r\n <span class=\"font-12 font-weight-medium text-color-onyx d-block\">44</span>\r\n <span class=\"font-8 font-weight-light text-color-onyx d-block\">Mins</span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"d-flex align-items-center\" *ngIf=\"element[column] === 'approved'\">\r\n <span class=\"status approved\">\r\n Approved\r\n </span>\r\n </div>\r\n \r\n <div class=\"d-flex align-items-center\" *ngIf=\"element[column] === 'sent-back'\">\r\n <span class=\"status rejected\">\r\n Sent Back\r\n </span>\r\n <span class=\"mx-2\"></span>\r\n <button mat-stroked-button class=\"btn button-primary square br-w-1 font-14 font-weight-medium\"\r\n (click)=\"sentBack()\">\r\n <span class=\"sfi sfi-chat-o\"></span>\r\n </button>\r\n </div>\r\n \r\n <div class=\"d-flex align-items-center\" *ngIf=\"element[column] === 'pending'\">\r\n <span class=\"status pending\">\r\n Pending\r\n </span>\r\n <span class=\"mx-2\"></span>\r\n \r\n <div class=\"d-flex align-items-center mx-n1\">\r\n <div class=\"img-card circled-img x-small mx-1\">\r\n <img [src]=\"element?.pendingWith.image\" alt=\"\">\r\n </div>\r\n \r\n <div class=\"d-flex flex-column mx-1\">\r\n <span class=\"font-8 font-weight-medium text-color-yellow text-nowrap\">Pending With</span>\r\n <span class=\"font-11 font-weight-medium text-nowrap\">{{element?.pendingWith.name}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n </div>\r\n </ng-container>\r\n \r\n \r\n <ng-container *ngSwitchCase=\"'actions'\">\r\n \r\n <div class=\"d-flex justify-content-between mx-n2\">\r\n <ng-container *ngFor=\"let action of element[column]\">\r\n \r\n <div class=\"flex-grow-1\">\r\n <ng-container *ngIf=\"action.type.buttonType === 'stroked'\">\r\n <button mat-stroked-button (click)=\"buttonClicked(element,action.fn, $event)\"\r\n class=\"btn button-{{action.type.buttonClass}} mx-2\">\r\n {{action.label}}\r\n </button>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"action.type.buttonType === 'flat'\">\r\n <button mat-flat-button (click)=\"buttonClicked(element,action.fn, $event)\"\r\n class=\"btn button-{{action.type.buttonClass}} mx-2\">\r\n {{action.label}}\r\n </button>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"action.type.buttonType === 'icon'\">\r\n <button mat-icon-button (click)=\"buttonClicked(element,action.fn, $event)\"\r\n class=\"btn button-{{action.type.buttonClass}} mx-2\">\r\n <span class=\"sfi sfi-{{action.type.icon}}\"></span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n \r\n <ng-container *ngIf=\"action.type.buttonType === 'all'\">\r\n <button mat-icon-button class=\"btn button-transparent square medium mx-2 text-end\"\r\n [matMenuTriggerFor]=\"menuAction\" (click)=\"$event.stopPropagation()\">\r\n <span class=\"sfi sfi-dots text-color-onyx\"></span>\r\n </button>\r\n <mat-menu #menuAction=\"matMenu\" xPosition=\"before\" class=\"actions-menu\">\r\n <button *ngIf=\"!element?.user?.email && element?.user?.disabledCleanUp!==true\" mat-menu-item class=\"text-color-onyx font-12\"\r\n (click)=\"buttonClicked(element,'CreateEmail', $event)\">\r\n {{i18n.translate('createEmail')}} \r\n </button>\r\n <button *ngIf=\"element?.user?.email && element?.user?.enabled==='true'\" mat-menu-item class=\"text-color-red font-12\"\r\n (click)=\"buttonClicked(element,'DisableEmail', $event)\">\r\n {{ i18n.translate('disableEmail')}}\r\n </button>\r\n <button *ngIf=\"element?.user?.email && element?.user?.disabledCleanUp===true\" mat-menu-item class=\"text-color-red font-12\"\r\n (click)=\"buttonClicked(element,'EnableEmail', $event)\">\r\n {{ i18n.translate('enableEmail')}}\r\n </button>\r\n <button *ngIf=\"element?.user!==null && element?.user?.disabledCleanUp!==true\" mat-menu-item class=\"text-color-onyx font-12\"\r\n (click)=\"buttonClicked(element,'CreateEntryPermission', $event)\">\r\n {{ i18n.translate('createCEP')}}\r\n </button>\r\n <!-- <button *ngIf=\"!element?.user?.email\" mat-menu-item class=\"text-color-red font-12\"\r\n (click)=\"buttonClicked(element,'DisableEntryPermission', $event)\">\r\n {{i18n.translate('disableEntryPermission')}}\r\n </button> -->\r\n <button *ngIf=\"!element?.user?.email && element?.user?.disabledCleanUp!==true\" mat-menu-item class=\"text-color-red font-12\"\r\n (click)=\"buttonClicked(element,'DeleteAccount', $event)\">\r\n {{i18n.translate('deleteAccount')}}\r\n </button>\r\n\r\n <button *ngIf=\"element?.user?.email && element?.user?.disabledCleanUp!==true\" [disabled]=\"!element?.mailExtensionAllowed\" mat-menu-item class=\"text-color-onyx font-12\"\r\n (click)=\"buttonClicked(element,'ExtendAccount', $event)\">\r\n {{ i18n.translate('extendAccount')}}\r\n </button>\r\n <button mat-menu-item class=\"text-color-onyx font-12\" *ngIf=\"element?.user?.disabledCleanUp!==true\" (click)=\"buttonClicked(element,'update', $event)\">\r\n {{ i18n.translate('updateEmploymentInformation')}}\r\n </button>\r\n </mat-menu>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n \r\n <span class=\"text-nowrap\" [ngClass]=\"columnsConfig[i].type\" *ngSwitchDefault>\r\n {{ element[column] }}\r\n </span>\r\n </ng-container>\r\n <ng-container *ngIf=\"loading\">\r\n <span class=\" d-block loading-bg\"></span>\r\n </ng-container>\r\n \r\n </td>\r\n \r\n \r\n </ng-container>\r\n </ng-container>\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"columns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: columns;\" class=\"cursor-pointer\" (click)=\"selectedRow(row)\"></tr>\r\n </table>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"loading\">\r\n <span>loading...</span>\r\n </ng-container> -->\r\n <!-- <ng-container *ngIf=\"loading\">-->\r\n <!-- <td *matCellDef=\"let element\" >loading....</td>-->\r\n <!-- </ng-container>-->\r\n <!--{{this.rows | json}}-->\r\n \r\n<!-- <app-no-data-placeholder *ngIf=\"noData && !loading\" [noDataPlaceholder]=\"noDataObj\"></app-no-data-placeholder> -->\r\n\r\n <mat-paginator [pageSize]=\"10\" [length]=\"totalRecords\" (page)=\"onPageChange($event)\" \r\n [pageSizeOptions]=\"[5, 10, 25, 100]\" aria-label=\"Select page of users\"></mat-paginator>\r\n <!-- style-paginator -->\r\n <!-- showFirstLastButtons -->\r\n</div>" }]
97
+ }], propDecorators: { columns: [{
98
+ type: Input
99
+ }], columnsConfig: [{
100
+ type: Input
101
+ }], rows: [{
102
+ type: Input
103
+ }], actions: [{
104
+ type: Input
105
+ }], totalRecords: [{
106
+ type: Input
107
+ }], className: [{
108
+ type: Input
109
+ }], pageChanged: [{
110
+ type: Output
111
+ }], buttonAction: [{
112
+ type: Output
113
+ }], emitDataRow: [{
114
+ type: Output
115
+ }] } });
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icG0tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkLWNvbXBvbmVudHMvZm9ybS1maWVsZC90YWJsZS1saXN0L3RhYmxlLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnBtLWNvcmUvc3JjL2xpYi9jb21wb25lbnRzL3NoYXJlZC1jb21wb25lbnRzL2Zvcm0tZmllbGQvdGFibGUtbGlzdC90YWJsZS1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCx1REFBdUQ7QUFDdkQsdURBQXVEO0FBQ3ZELE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzFHLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUMvRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFDLE9B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WTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3VzZS1saWZlY3ljbGUtaW50ZXJmYWNlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xyXG5pbXBvcnQge0NVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIEV2ZW50RW1pdHRlcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QmFzZUNvbXBvbmVudH0gZnJvbSAnLi8uLi9iYXNlLWNvbXBvbmVudC9iYXNlLWNvbXBvbmVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQge01hdFBhZ2luYXRvck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHtEYXRlUGlwZSwgTmdDbGFzcywgTmdGb3JPZiwgTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgTmdTd2l0Y2hEZWZhdWx0fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7Um91dGVyTGlua30gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5pbXBvcnQge1JlcGVhdGVkTGlzdENvbXBvbmVudH0gZnJvbSBcIi4uL3JlcGVhdGVkLWxpc3QvcmVwZWF0ZWQtbGlzdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtNYXRCdXR0b259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcclxuaW1wb3J0IHtNYXRNZW51LCBNYXRNZW51SXRlbSwgTWF0TWVudVRyaWdnZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9tZW51XCI7XHJcblxyXG4vLyBpbXBvcnQgeyBDb25maXJtYXRpb25Qb3B1cENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbmZpcm1hdGlvbi1wb3B1cC9jb25maXJtYXRpb24tcG9wdXAuY29tcG9uZW50JztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC10YWJsZS1saXN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUtbGlzdC5jb21wb25lbnQuc2NzcyddLFxyXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIE1hdFBhZ2luYXRvck1vZHVsZSxcclxuICAgIE1hdFRhYmxlTW9kdWxlLFxyXG4gICAgTmdGb3JPZixcclxuICAgIE5nQ2xhc3MsXHJcbiAgICBOZ1N3aXRjaENhc2UsXHJcbiAgICBSb3V0ZXJMaW5rLFxyXG4gICAgTmdTd2l0Y2gsXHJcbiAgICBOZ0lmLFxyXG4gICAgRGF0ZVBpcGUsXHJcbiAgICBSZXBlYXRlZExpc3RDb21wb25lbnQsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBNYXRNZW51LFxyXG4gICAgTWF0TWVudVRyaWdnZXIsXHJcbiAgICBNYXRNZW51SXRlbSxcclxuICAgIE5nU3dpdGNoRGVmYXVsdFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxlTGlzdENvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IGFueTtcclxuICBASW5wdXQoKSBjb2x1bW5zQ29uZmlnOiBhbnk7XHJcbiAgQElucHV0KCkgcm93czogYW55O1xyXG4gIEBJbnB1dCgpIGFjdGlvbnM6IGFueSA9IFtdO1xyXG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkcyAhOiBudW1iZXI7XHJcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XHJcbiAgcHVibGljIGRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBidXR0b25BY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBlbWl0RGF0YVJvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZykgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLnJvd3M7XHJcbiAgfVxyXG5cclxuICB0cnVuY2F0ZU5hbWUodGV4dDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGV4dCkge1xyXG4gICAgICBjb25zdCBjaGFyYWN0ZXJzID0gdGV4dC5tYXRjaCgvXFxiKFxcdykvZyk7XHJcbiAgICAgIGlmIChjaGFyYWN0ZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIGNoYXJhY3RlcnMuam9pbignJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KGV2ZW50KVxyXG4gIH1cclxuXHJcblxyXG4gIGRlbGV0ZSgpOiB2b2lkIHtcclxuICAgIC8vIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uUG9wdXBDb21wb25lbnQsIHtcclxuICAgIC8vICAgd2lkdGg6ICc3MDBweCcsXHJcbiAgICAvLyAgIHBhbmVsQ2xhc3M6IFsnY29uZmlybS1wb3B1cCcsICdtYWluLXBvcHVwJ10sXHJcbiAgICAvLyAgIGRhdGE6IHtcclxuICAgIC8vICAgICB0aXRsZTogJ0RlbGV0ZSBNYXRjaCcsXHJcbiAgICAvLyAgICAgbWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCBkZWxldGUnLFxyXG4gICAgLy8gICAgIGNvbmZpcm1UZXh0OiAnbWF0Y2ggbWFraW5nIGV4YW1wbGUgbmFtZScsXHJcbiAgICAvLyAgICAgbW9yZVRleHQ6ICcnLFxyXG4gICAgLy8gICAgIHR5cGU6ICdkZWxldGUnLFxyXG4gICAgLy8gICAgIGljb246ICdkZWxldGUtbWF0Y2gnLFxyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICAvLyBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgLy8gICAvLyBjbG9zZWRcclxuICAgIC8vIH0pO1xyXG4gIH1cclxuXHJcbiAgYnV0dG9uQ2xpY2tlZChlbGVtZW50LCBmbjogc3RyaW5nLCAkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZFJvdyhyb3cpIHtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRTbGFDb2xvcih2YWx1ZTogYW55LCBtYXg6IG51bWJlcikge1xyXG5cclxuICB9XHJcblxyXG4gIHNlbnRCYWNrKCkge1xyXG5cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm92ZXJmbG93LWF1dG9cIj5cclxuICA8IS0tICN0YWJsZSAgKHNjcm9sbCk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIC0tPlxyXG4gIDxuZy1jb250YWluZXIgPlxyXG4gICAgPCEtLSAobWF0U29ydENoYW5nZSk9XCJzb3J0RGF0YSgkZXZlbnQpXCIgLS0+XHJcbiAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBjbGFzcz1cInByaW1hcnktdGFibGUge3tjbGFzc05hbWV9fVwiIG1hdFNvcnQgPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleDtcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uXCI+XHJcbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtuZ0NsYXNzXT1cInsnbGFzdC1jb2x1bW4nIDogY29sdW1uc0NvbmZpZ1tpXS50eXBlID09PSAnYWN0aW9ucycsICdzb3J0QXJyb3cnOiBjb2x1bW5zQ29uZmlnW2ldPy5zb3J0TmFtZT8ubGVuZ3RoIH1cIiBtYXQtc29ydC1oZWFkZXI+XHJcbiAgICAgICAgICAgIHt7aTE4bi50cmFuc2xhdGUoY29sdW1uc0NvbmZpZ1tpXS5sYWJlbCl9fSA8L3RoPlxyXG4gIFxyXG4gICAgICAgICAgPHRkIG1hdC1jZWxsICBbbmdDbGFzc109XCJ7J2FjY291bnQtZGlzYWJsZWQnOiBlbGVtZW50Py51c2VyPy5kaXNhYmxlZENsZWFuVXA9PT10cnVlfVwiICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbnNDb25maWdbaV0udHlwZVwiICpuZ0lmPVwicm93cy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICA8YSBbbmdDbGFzc109XCJjb2x1bW5zQ29uZmlnW2ldLnR5cGVcIiBbaHJlZl09XCJlbGVtZW50W2NvbHVtbl1cIiAqbmdTd2l0Y2hDYXNlPVwiJ2xpbmsnXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBlbGVtZW50W2NvbHVtbl0gfX1cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgXHJcbiAgICAgICAgICAgICAgPGEgW25nQ2xhc3NdPVwiY29sdW1uc0NvbmZpZ1tpXS50eXBlXCIgW3JvdXRlckxpbmtdPVwiW2VsZW1lbnQuaWRdXCIgW2hyZWZdPVwiZWxlbWVudFtjb2x1bW5dXCJcclxuICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCIncm91dCdcIj5cclxuICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbY29sdW1uXSB9fVxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICBcclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgW25nQ2xhc3NdPVwiY29sdW1uc0NvbmZpZ1tpXS50eXBlXCIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZmkgc2ZpLWNsb2NrIHRleHQtY29sb3ItY29yYWxcIiAqbmdJZj1cIiFsb2FkaW5nXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0ge3sgZWxlbWVudD8uRGF0ZS5mcm9tIH19XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50Py5EYXRlLnRvXCI+XHJcbiAgICAgICAgICAgICAgICAgIDoge3sgZWxlbWVudD8uRGF0ZS50byB9fVxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICAgICAgICAgICAgICB7eyBlbGVtZW50W2NvbHVtbl0gfCBkYXRlOiAnZGQvTU0vWVlZWScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCIgW25nQ2xhc3NdPVwiY29sdW1uc0NvbmZpZ1tpXS50eXBlXCIgKm5nU3dpdGNoQ2FzZT1cIidzbGEnXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLXNsYSBbdmFsdWVdPVwiZWxlbWVudD8uU0xBLnZhbHVlXCIgW21heFZhbHVlXT1cImVsZW1lbnQ/LlNMQS5tYXhcIiBbY2FudmFzU2NhbGVdPVwiNDVcIlxyXG4gICAgICAgICAgICAgICAgICBbb3V0ZXJMaW5lQ29sb3JdPVwiZ2V0U2xhQ29sb3IoZWxlbWVudD8uU0xBLnZhbHVlLCBlbGVtZW50Py5TTEEubWF4KVwiPjwvYXBwLXNsYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWNhcmQgdGFibGUtaW1nXCIgW25nQ2xhc3NdPVwiY29sdW1uc0NvbmZpZ1tpXS50eXBlXCIgKm5nU3dpdGNoQ2FzZT1cIidpbWFnZSdcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJlbGVtZW50Py5pbWFnZVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gIFxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwie3sgZWxlbWVudFtjb2x1bW5dLnR5cGUgfX1cIiBbbmdDbGFzc109XCJjb2x1bW5zQ29uZmlnW2ldLnR5cGVcIiAqbmdTd2l0Y2hDYXNlPVwiJ3N0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbY29sdW1uXS5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICBcclxuICBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG14LW4xXCIgKm5nU3dpdGNoQ2FzZT1cIidSZXF1ZXN0VHlwZSdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1ZXN0LXR5cGUgbXgtMSB7e2l0ZW0uc3RhdHVzfX1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBlbGVtZW50Py5SZXF1ZXN0VHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMVwiICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09ICduZWVkLWFjdGlvbidcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2ZpIHNmaS1pbmZvIFwiICpuZ0lmPVwiaXRlbS5zdGF0dXMgPT09ICduZWVkLWFjdGlvbidcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICBcclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInt7IGVsZW1lbnRbY29sdW1uXS50eXBlIH19IHt7IGVsZW1lbnRbY29sdW1uXSA/ICd0ZXh0LWNvbG9yLWNvcmFsIHVuZGVybGluZScgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW5zQ29uZmlnW2ldLnR5cGVcIiAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cclxuICAgICAgICAgICAgICAgIHt7IGVsZW1lbnRbY29sdW1uXSA/IGVsZW1lbnRbY29sdW1uXSA6ICctJyB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ub3dyYXAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIFtuZ0NsYXNzXT1cImNvbHVtbnNDb25maWdbaV0udHlwZVwiXHJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2dyb3VwJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3tlbGVtZW50Py5Hcm91cC5ncm91cE5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMlwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxhcHAtcmVwZWF0ZWQtbGlzdCB0eXBlPVwidXNlcnMtYXZhdGFyXCIgW2xpc3RPZkl0ZW1zXT1cImVsZW1lbnQ/Lkdyb3VwLnVzZXJzXCI+PC9hcHAtcmVwZWF0ZWQtbGlzdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiIFtuZ0NsYXNzXT1cImNvbHVtbnNDb25maWdbaV0udHlwZVwiICpuZ1N3aXRjaENhc2U9XCIndXNlcidcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW1nLWNhcmQgY2lyY2xlZC1pbWcgc21hbGxcIiAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwie3snZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyBlbGVtZW50Py51c2VyPy5wZXJzb25hbFBob3RvfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIG9uZXJyb3I9XCJ0aGlzLm9uZXJyb3I9bnVsbDt0aGlzLnNyYz0nYXNzZXRzL2ltYWdlcy91c2VyLnN2Zyc7XCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC0xNCBmb250LXdlaWdodC1tZWRpdW1cIj57e2VsZW1lbnQ/LnVzZXI/Lm5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LTEyIGZvbnQtd2VpZ2h0LW5vcm1hbCB0ZXh0LWNvbG9yLWRhcmstZ3JheSBtdC0xXCI+e3tlbGVtZW50Py51c2VyPy5lbWFpbH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGVnYXRlIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBbbmdDbGFzc109XCJjb2x1bW5zQ29uZmlnW2ldLnR5cGVcIlxyXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidhc3NpZ25lZCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWctY2FyZCB4LXNtYWxsIGNpcmNsZWQtaW1nXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJlbGVtZW50Py5Bc3NpZ25lZFRvLmltYWdlXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC0xNCBmb250LXdlaWdodC1tZWRpdW0gdGV4dC1jb2xvci1vbnl4XCI+e3tlbGVtZW50Py5Bc3NpZ25lZFRvLm5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2ZpIHNmaS1jbG9zZSB0ZXh0LWNvbG9yLWNvcmFsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gIFxyXG4gIFxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0dXNBY3Rpb24nXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYWN0aW9uXCI+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudC1kb3duIG14LW4xXCIgKm5nSWY9XCJlbGVtZW50W2NvbHVtbl0gPT09ICduZWVkLWFjdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbSBteC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtMTIgZm9udC13ZWlnaHQtbWVkaXVtIHRleHQtY29sb3Itb255eCBkLWJsb2NrXCI+MDE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtOCBmb250LXdlaWdodC1saWdodCB0ZXh0LWNvbG9yLW9ueXggZC1ibG9ja1wiPkRheXM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0gbXgtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LTEyIGZvbnQtd2VpZ2h0LW1lZGl1bSB0ZXh0LWNvbG9yLW9ueXggZC1ibG9ja1wiPjE4PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LTggZm9udC13ZWlnaHQtbGlnaHQgdGV4dC1jb2xvci1vbnl4IGQtYmxvY2tcIj5Ib3Vyczwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbSBteC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtMTIgZm9udC13ZWlnaHQtbWVkaXVtIHRleHQtY29sb3Itb255eCBkLWJsb2NrXCI+NDQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtOCBmb250LXdlaWdodC1saWdodCB0ZXh0LWNvbG9yLW9ueXggZC1ibG9ja1wiPk1pbnM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiZWxlbWVudFtjb2x1bW5dID09PSAnYXBwcm92ZWQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMgYXBwcm92ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIEFwcHJvdmVkXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImVsZW1lbnRbY29sdW1uXSA9PT0gJ3NlbnQtYmFjaydcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cyByZWplY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgU2VudCBCYWNrXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMlwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjbGFzcz1cImJ0biBidXR0b24tcHJpbWFyeSBzcXVhcmUgYnItdy0xIGZvbnQtMTQgZm9udC13ZWlnaHQtbWVkaXVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZW50QmFjaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNmaSBzZmktY2hhdC1vXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImVsZW1lbnRbY29sdW1uXSA9PT0gJ3BlbmRpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMgcGVuZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTJcIj48L3NwYW4+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXgtbjFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWctY2FyZCBjaXJjbGVkLWltZyB4LXNtYWxsIG14LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImVsZW1lbnQ/LnBlbmRpbmdXaXRoLmltYWdlXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gbXgtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtOCBmb250LXdlaWdodC1tZWRpdW0gdGV4dC1jb2xvci15ZWxsb3cgdGV4dC1ub3dyYXBcIj5QZW5kaW5nIFdpdGg8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC0xMSBmb250LXdlaWdodC1tZWRpdW0gdGV4dC1ub3dyYXBcIj57e2VsZW1lbnQ/LnBlbmRpbmdXaXRoLm5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gIFxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhY3Rpb25zJ1wiPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBteC1uMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgZWxlbWVudFtjb2x1bW5dXCI+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uLnR5cGUuYnV0dG9uVHlwZSA9PT0gJ3N0cm9rZWQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJidXR0b25DbGlja2VkKGVsZW1lbnQsYWN0aW9uLmZuLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidXR0b24te3thY3Rpb24udHlwZS5idXR0b25DbGFzc319IG14LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FjdGlvbi5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uLnR5cGUuYnV0dG9uVHlwZSA9PT0gJ2ZsYXQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIChjbGljayk9XCJidXR0b25DbGlja2VkKGVsZW1lbnQsYWN0aW9uLmZuLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidXR0b24te3thY3Rpb24udHlwZS5idXR0b25DbGFzc319IG14LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FjdGlvbi5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uLnR5cGUuYnV0dG9uVHlwZSA9PT0gJ2ljb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJidXR0b25DbGlja2VkKGVsZW1lbnQsYWN0aW9uLmZuLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidXR0b24te3thY3Rpb24udHlwZS5idXR0b25DbGFzc319IG14LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNmaSBzZmkte3thY3Rpb24udHlwZS5pY29ufX1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbi50eXBlLmJ1dHRvblR5cGUgPT09ICdhbGwnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cImJ0biBidXR0b24tdHJhbnNwYXJlbnQgc3F1YXJlIG1lZGl1bSBteC0yIHRleHQtZW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVBY3Rpb25cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2ZpIHNmaS1kb3RzIHRleHQtY29sb3Itb255eFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51QWN0aW9uPVwibWF0TWVudVwiIHhQb3NpdGlvbj1cImJlZm9yZVwiIGNsYXNzPVwiYWN0aW9ucy1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWxlbWVudD8udXNlcj8uZW1haWwgJiYgZWxlbWVudD8udXNlcj8uZGlzYWJsZWRDbGVhblVwIT09dHJ1ZVwiIG1hdC1tZW51LWl0ZW0gY2xhc3M9XCJ0ZXh0LWNvbG9yLW9ueXggZm9udC0xMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbkNsaWNrZWQoZWxlbWVudCwnQ3JlYXRlRW1haWwnLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3tpMThuLnRyYW5zbGF0ZSgnY3JlYXRlRW1haWwnKX19IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVsZW1lbnQ/LnVzZXI/LmVtYWlsICYmIGVsZW1lbnQ/LnVzZXI/LmVuYWJsZWQ9PT0ndHJ1ZSdcIiBtYXQtbWVudS1pdGVtIGNsYXNzPVwidGV4dC1jb2xvci1yZWQgZm9udC0xMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbkNsaWNrZWQoZWxlbWVudCwnRGlzYWJsZUVtYWlsJywgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGkxOG4udHJhbnNsYXRlKCdkaXNhYmxlRW1haWwnKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWxlbWVudD8udXNlcj8uZW1haWwgICYmIGVsZW1lbnQ/LnVzZXI/LmRpc2FibGVkQ2xlYW5VcD09PXRydWVcIiBtYXQtbWVudS1pdGVtIGNsYXNzPVwidGV4dC1jb2xvci1yZWQgZm9udC0xMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbkNsaWNrZWQoZWxlbWVudCwnRW5hYmxlRW1haWwnLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaTE4bi50cmFuc2xhdGUoJ2VuYWJsZUVtYWlsJyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVsZW1lbnQ/LnVzZXIhPT1udWxsICYmIGVsZW1lbnQ/LnVzZXI/LmRpc2FibGVkQ2xlYW5VcCE9PXRydWVcIiBtYXQtbWVudS1pdGVtIGNsYXNzPVwidGV4dC1jb2xvci1vbnl4IGZvbnQtMTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJidXR0b25DbGlja2VkKGVsZW1lbnQsJ0NyZWF0ZUVudHJ5UGVybWlzc2lvbicsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpMThuLnRyYW5zbGF0ZSgnY3JlYXRlQ0VQJyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uICAqbmdJZj1cIiFlbGVtZW50Py51c2VyPy5lbWFpbFwiIG1hdC1tZW51LWl0ZW0gY2xhc3M9XCJ0ZXh0LWNvbG9yLXJlZCBmb250LTEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYnV0dG9uQ2xpY2tlZChlbGVtZW50LCdEaXNhYmxlRW50cnlQZXJtaXNzaW9uJywgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7aTE4bi50cmFuc2xhdGUoJ2Rpc2FibGVFbnRyeVBlcm1pc3Npb24nKX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAgKm5nSWY9XCIhZWxlbWVudD8udXNlcj8uZW1haWwgJiYgZWxlbWVudD8udXNlcj8uZGlzYWJsZWRDbGVhblVwIT09dHJ1ZVwiIG1hdC1tZW51LWl0ZW0gY2xhc3M9XCJ0ZXh0LWNvbG9yLXJlZCBmb250LTEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbkNsaWNrZWQoZWxlbWVudCwnRGVsZXRlQWNjb3VudCcsICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tpMThuLnRyYW5zbGF0ZSgnZGVsZXRlQWNjb3VudCcpfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVsZW1lbnQ/LnVzZXI/LmVtYWlsICYmIGVsZW1lbnQ/LnVzZXI/LmRpc2FibGVkQ2xlYW5VcCE9PXRydWVcIiBbZGlzYWJsZWRdPVwiIWVsZW1lbnQ/Lm1haWxFeHRlbnNpb25BbGxvd2VkXCIgbWF0LW1lbnUtaXRlbSBjbGFzcz1cInRleHQtY29sb3Itb255eCBmb250LTEyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYnV0dG9uQ2xpY2tlZChlbGVtZW50LCdFeHRlbmRBY2NvdW50JywgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGkxOG4udHJhbnNsYXRlKCdleHRlbmRBY2NvdW50Jyl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGNsYXNzPVwidGV4dC1jb2xvci1vbnl4IGZvbnQtMTJcIiAqbmdJZj1cImVsZW1lbnQ/LnVzZXI/LmRpc2FibGVkQ2xlYW5VcCE9PXRydWVcIiAoY2xpY2spPVwiYnV0dG9uQ2xpY2tlZChlbGVtZW50LCd1cGRhdGUnLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaTE4bi50cmFuc2xhdGUoJ3VwZGF0ZUVtcGxveW1lbnRJbmZvcm1hdGlvbicpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ub3dyYXBcIiBbbmdDbGFzc109XCJjb2x1bW5zQ29uZmlnW2ldLnR5cGVcIiAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAge3sgZWxlbWVudFtjb2x1bW5dIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIiBkLWJsb2NrIGxvYWRpbmctYmdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgICAgICAgPC90ZD5cclxuICBcclxuICBcclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgXHJcbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbnNcIj48L3RyPlxyXG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1ucztcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInNlbGVjdGVkUm93KHJvdylcIj48L3RyPlxyXG4gICAgPC90YWJsZT5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICA8c3Bhbj5sb2FkaW5nLi4uPC9zcGFuPlxyXG4gIDwvbmctY29udGFpbmVyPiAtLT5cclxuICA8IS0tICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZ1wiPi0tPlxyXG4gIDwhLS0gICAgPHRkICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiA+bG9hZGluZy4uLi48L3RkPi0tPlxyXG4gIDwhLS0gIDwvbmctY29udGFpbmVyPi0tPlxyXG4gIDwhLS17e3RoaXMucm93cyB8IGpzb259fS0tPlxyXG4gIFxyXG48IS0tIDxhcHAtbm8tZGF0YS1wbGFjZWhvbGRlciAqbmdJZj1cIm5vRGF0YSAmJiAhbG9hZGluZ1wiIFtub0RhdGFQbGFjZWhvbGRlcl09XCJub0RhdGFPYmpcIj48L2FwcC1uby1kYXRhLXBsYWNlaG9sZGVyPiAtLT5cclxuXHJcbiAgPG1hdC1wYWdpbmF0b3IgW3BhZ2VTaXplXT1cIjEwXCIgW2xlbmd0aF09XCJ0b3RhbFJlY29yZHNcIiAocGFnZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIFxyXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJbNSwgMTAsIDI1LCAxMDBdXCIgYXJpYS1sYWJlbD1cIlNlbGVjdCBwYWdlIG9mIHVzZXJzXCI+PC9tYXQtcGFnaW5hdG9yPlxyXG4gIDwhLS0gc3R5bGUtcGFnaW5hdG9yIC0tPlxyXG4gIDwhLS0gc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgLS0+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,39 @@
1
+ /* eslint-disable @angular-eslint/directive-selector */
2
+ /* eslint-disable @typescript-eslint/no-empty-function */
3
+ import { Directive, HostListener } from '@angular/core';
4
+ import * as i0 from "@angular/core";
5
+ export class SpecialCharacterDirective {
6
+ regexStr = '^[a-zA-Z0-9]*$';
7
+ constructor() {
8
+ }
9
+ onInputChange(event) {
10
+ const inputElement = event.target;
11
+ inputElement.value = inputElement.value.replace(/[\'\`]/g, '');
12
+ }
13
+ blockPaste(event) {
14
+ const inputElement = event.target;
15
+ inputElement.value = inputElement.value.replace(/[\'\`]/g, '');
16
+ }
17
+ onDrop(event) {
18
+ const inputElement = event.target;
19
+ inputElement.value = inputElement.value.replace(/[\'\`]/g, '');
20
+ }
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SpecialCharacterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
22
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: SpecialCharacterDirective, selector: "[specialIsAlphaNumeric]", host: { listeners: { "input": "onInputChange($event)", "paste": "blockPaste($event)", "drop": "onDrop($event)" } }, ngImport: i0 });
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: SpecialCharacterDirective, decorators: [{
25
+ type: Directive,
26
+ args: [{
27
+ selector: '[specialIsAlphaNumeric]'
28
+ }]
29
+ }], ctorParameters: () => [], propDecorators: { onInputChange: [{
30
+ type: HostListener,
31
+ args: ['input', ['$event']]
32
+ }], blockPaste: [{
33
+ type: HostListener,
34
+ args: ['paste', ['$event']]
35
+ }], onDrop: [{
36
+ type: HostListener,
37
+ args: ['drop', ['$event']]
38
+ }] } });
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lhbC1jaGFycy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icG0tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkLWNvbXBvbmVudHMvZm9ybS1maWVsZC90ZXh0YXJlYS9zcGVjaWFsLWNoYXJzLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQseURBQXlEO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUt4RCxNQUFNLE9BQU8seUJBQXlCO0lBQ3BDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztJQUU1QjtJQUVBLENBQUM7SUFFa0MsYUFBYSxDQUFDLEtBQUs7UUFDcEQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQTBCLENBQUM7UUFDdEQsWUFBWSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUdELFVBQVUsQ0FBQyxLQUFxQjtRQUM5QixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUN0RCxZQUFZLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBR0QsTUFBTSxDQUFDLEtBQUs7UUFDVixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBMEIsQ0FBQztRQUN0RCxZQUFZLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO3VHQXRCVSx5QkFBeUI7MkZBQXpCLHlCQUF5Qjs7MkZBQXpCLHlCQUF5QjtrQkFIckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO2lCQUNwQzt3REFRb0MsYUFBYTtzQkFBL0MsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTWpDLFVBQVU7c0JBRFQsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBT2pDLE1BQU07c0JBREwsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvbiAqL1xyXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbc3BlY2lhbElzQWxwaGFOdW1lcmljXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwZWNpYWxDaGFyYWN0ZXJEaXJlY3RpdmUge1xyXG4gIHJlZ2V4U3RyID0gJ15bYS16QS1aMC05XSokJztcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKSBvbklucHV0Q2hhbmdlKGV2ZW50KSB7XHJcbiAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlucHV0RWxlbWVudC52YWx1ZSA9IGlucHV0RWxlbWVudC52YWx1ZS5yZXBsYWNlKC9bXFwnXFxgXS9nLCAnJyk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXHJcbiAgYmxvY2tQYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaW5wdXRFbGVtZW50LnZhbHVlID0gaW5wdXRFbGVtZW50LnZhbHVlLnJlcGxhY2UoL1tcXCdcXGBdL2csICcnKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxyXG4gIG9uRHJvcChldmVudCkge1xyXG4gICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSBpbnB1dEVsZW1lbnQudmFsdWUucmVwbGFjZSgvW1xcJ1xcYF0vZywgJycpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19