ngx-material-entity 15.3.1 → 16.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/classes/entity.model.d.ts +2 -2
  2. package/components/confirm-dialog/confirm-dialog-data.d.ts +1 -1
  3. package/components/edit-page/edit-page.component.d.ts +1 -1
  4. package/components/edit-page/page-edit-data.builder.d.ts +1 -1
  5. package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +1 -0
  6. package/components/input/array/array-table.class.d.ts +1 -1
  7. package/components/input/base-input.component.d.ts +5 -1
  8. package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +1 -1
  9. package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +1 -1
  10. package/components/input/file/file-input/file-input.component.d.ts +1 -1
  11. package/components/input/input.component.d.ts +2 -1
  12. package/components/table/display-column-value/base-display-column-value.component.d.ts +1 -1
  13. package/components/table/display-column-value/display-column-value.component.d.ts +1 -1
  14. package/components/table/table-data.builder.d.ts +1 -1
  15. package/components/table/table-data.d.ts +1 -1
  16. package/components/table/table.component.d.ts +1 -1
  17. package/decorators/base/decorator-types.enum.d.ts +1 -1
  18. package/decorators/base/property-decorator.data.d.ts +1 -1
  19. package/decorators/file/file-decorator.data.d.ts +1 -1
  20. package/decorators/number/number-decorator.data.d.ts +1 -1
  21. package/decorators/string/string-decorator.data.d.ts +1 -1
  22. package/encapsulation/jszip.utilities.d.ts +1 -1
  23. package/encapsulation/uuid.utilities.d.ts +11 -0
  24. package/esm2022/classes/base.builder.mjs +44 -0
  25. package/esm2022/classes/entity.model.mjs +26 -0
  26. package/esm2022/components/confirm-dialog/confirm-dialog-data.builder.mjs +58 -0
  27. package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +60 -0
  28. package/esm2022/components/edit-page/edit-page.component.mjs +291 -0
  29. package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +23 -0
  30. package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +49 -0
  31. package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +49 -0
  32. package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +50 -0
  33. package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +69 -0
  34. package/esm2022/components/input/array/array-table.class.mjs +100 -0
  35. package/esm2022/components/input/base-input.component.mjs +88 -0
  36. package/esm2022/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +21 -0
  37. package/esm2022/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +17 -0
  38. package/esm2022/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +21 -0
  39. package/esm2022/components/input/custom/custom.component.mjs +28 -0
  40. package/esm2022/components/input/date/date-input/date-input.component.mjs +19 -0
  41. package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +68 -0
  42. package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +69 -0
  43. package/{esm2020 → esm2022}/components/input/file/file-default-input/file-default-input.component.mjs +4 -4
  44. package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +101 -0
  45. package/esm2022/components/input/file/file-input/dragDrop.directive.mjs +62 -0
  46. package/esm2022/components/input/file/file-input/file-input.component.mjs +206 -0
  47. package/esm2022/components/input/input.component.mjs +849 -0
  48. package/esm2022/components/input/input.module.mjs +172 -0
  49. package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +23 -0
  50. package/esm2022/components/input/number/number-input/number-input.component.mjs +16 -0
  51. package/esm2022/components/input/number/number-slider-input/number-slider-input.component.mjs +17 -0
  52. package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +102 -0
  53. package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +36 -0
  54. package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +23 -0
  55. package/esm2022/components/input/string/string-input/string-input.component.mjs +16 -0
  56. package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +39 -0
  57. package/esm2022/components/input/string/string-textbox-input/string-textbox-input.component.mjs +17 -0
  58. package/esm2022/components/table/create-dialog/create-dialog-data.builder.mjs +42 -0
  59. package/esm2022/components/table/create-dialog/create-entity-dialog-data.builder.mjs +32 -0
  60. package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +107 -0
  61. package/esm2022/components/table/display-column-value/base-display-column-value.component.mjs +28 -0
  62. package/esm2022/components/table/display-column-value/display-column-value.component.mjs +37 -0
  63. package/esm2022/components/table/edit-dialog/edit-data.builder.mjs +106 -0
  64. package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +209 -0
  65. package/esm2022/components/table/edit-dialog/edit-entity.builder.mjs +39 -0
  66. package/esm2022/components/table/table-data.builder.mjs +269 -0
  67. package/esm2022/components/table/table.component.mjs +348 -0
  68. package/esm2022/decorators/array/array-decorator-internal.data.mjs +286 -0
  69. package/esm2022/decorators/array/array-decorator.data.mjs +21 -0
  70. package/esm2022/decorators/base/property-decorator-internal.data.mjs +82 -0
  71. package/esm2022/decorators/base/property-decorator.data.mjs +56 -0
  72. package/esm2022/decorators/boolean/boolean-decorator-internal.data.mjs +43 -0
  73. package/esm2022/decorators/boolean/boolean-decorator.data.mjs +11 -0
  74. package/esm2022/decorators/custom/custom-decorator-internal.data.mjs +35 -0
  75. package/{esm2020 → esm2022}/decorators/date/date-decorator-internal.data.mjs +43 -1
  76. package/esm2022/decorators/date/date-decorator.data.mjs +11 -0
  77. package/esm2022/decorators/file/file-decorator-internal.data.mjs +143 -0
  78. package/esm2022/decorators/file/file-decorator.data.mjs +64 -0
  79. package/esm2022/decorators/has-many/has-many-decorator-internal.data.mjs +42 -0
  80. package/esm2022/decorators/number/number-decorator-internal.data.mjs +76 -0
  81. package/esm2022/decorators/number/number-decorator.data.mjs +11 -0
  82. package/esm2022/decorators/object/object-decorator-internal.data.mjs +20 -0
  83. package/esm2022/decorators/object/object-decorator.data.mjs +22 -0
  84. package/esm2022/decorators/references-many/references-many-decorator-internal.data.mjs +48 -0
  85. package/esm2022/decorators/references-one/references-one-decorator-internal.data.mjs +24 -0
  86. package/esm2022/decorators/string/string-decorator-internal.data.mjs +114 -0
  87. package/esm2022/decorators/string/string-decorator.data.mjs +11 -0
  88. package/esm2022/encapsulation/uuid.utilities.mjs +15 -0
  89. package/esm2022/services/entity.service.mjs +276 -0
  90. package/esm2022/utilities/date.utilities.mjs +159 -0
  91. package/esm2022/utilities/entity.utilities.mjs +905 -0
  92. package/{fesm2020 → fesm2022}/ngx-material-entity.mjs +1225 -376
  93. package/fesm2022/ngx-material-entity.mjs.map +1 -0
  94. package/package.json +11 -17
  95. package/utilities/date.utilities.d.ts +1 -1
  96. package/esm2020/classes/base.builder.mjs +0 -42
  97. package/esm2020/classes/entity.model.mjs +0 -22
  98. package/esm2020/components/confirm-dialog/confirm-dialog-data.builder.mjs +0 -44
  99. package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +0 -57
  100. package/esm2020/components/edit-page/edit-page.component.mjs +0 -277
  101. package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +0 -26
  102. package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +0 -50
  103. package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +0 -49
  104. package/esm2020/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +0 -49
  105. package/esm2020/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +0 -70
  106. package/esm2020/components/input/array/array-table.class.mjs +0 -96
  107. package/esm2020/components/input/base-input.component.mjs +0 -64
  108. package/esm2020/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +0 -21
  109. package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +0 -17
  110. package/esm2020/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +0 -21
  111. package/esm2020/components/input/custom/custom.component.mjs +0 -26
  112. package/esm2020/components/input/date/date-input/date-input.component.mjs +0 -22
  113. package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +0 -71
  114. package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +0 -71
  115. package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +0 -100
  116. package/esm2020/components/input/file/file-input/dragDrop.directive.mjs +0 -63
  117. package/esm2020/components/input/file/file-input/file-input.component.mjs +0 -198
  118. package/esm2020/components/input/input.component.mjs +0 -755
  119. package/esm2020/components/input/input.module.mjs +0 -173
  120. package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +0 -26
  121. package/esm2020/components/input/number/number-input/number-input.component.mjs +0 -16
  122. package/esm2020/components/input/number/number-slider-input/number-slider-input.component.mjs +0 -17
  123. package/esm2020/components/input/relations/references-many-input/references-many-input.component.mjs +0 -100
  124. package/esm2020/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +0 -34
  125. package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +0 -26
  126. package/esm2020/components/input/string/string-input/string-input.component.mjs +0 -16
  127. package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +0 -42
  128. package/esm2020/components/input/string/string-textbox-input/string-textbox-input.component.mjs +0 -17
  129. package/esm2020/components/table/create-dialog/create-dialog-data.builder.mjs +0 -32
  130. package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +0 -26
  131. package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +0 -100
  132. package/esm2020/components/table/display-column-value/base-display-column-value.component.mjs +0 -27
  133. package/esm2020/components/table/display-column-value/display-column-value.component.mjs +0 -33
  134. package/esm2020/components/table/edit-dialog/edit-data.builder.mjs +0 -76
  135. package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +0 -198
  136. package/esm2020/components/table/edit-dialog/edit-entity.builder.mjs +0 -29
  137. package/esm2020/components/table/table-data.builder.mjs +0 -205
  138. package/esm2020/components/table/table.component.mjs +0 -333
  139. package/esm2020/decorators/array/array-decorator-internal.data.mjs +0 -150
  140. package/esm2020/decorators/array/array-decorator.data.mjs +0 -7
  141. package/esm2020/decorators/base/property-decorator-internal.data.mjs +0 -58
  142. package/esm2020/decorators/base/property-decorator.data.mjs +0 -6
  143. package/esm2020/decorators/boolean/boolean-decorator-internal.data.mjs +0 -33
  144. package/esm2020/decorators/boolean/boolean-decorator.data.mjs +0 -7
  145. package/esm2020/decorators/custom/custom-decorator-internal.data.mjs +0 -27
  146. package/esm2020/decorators/date/date-decorator.data.mjs +0 -7
  147. package/esm2020/decorators/file/file-decorator-internal.data.mjs +0 -97
  148. package/esm2020/decorators/file/file-decorator.data.mjs +0 -7
  149. package/esm2020/decorators/has-many/has-many-decorator-internal.data.mjs +0 -32
  150. package/esm2020/decorators/number/number-decorator-internal.data.mjs +0 -54
  151. package/esm2020/decorators/number/number-decorator.data.mjs +0 -7
  152. package/esm2020/decorators/object/object-decorator-internal.data.mjs +0 -14
  153. package/esm2020/decorators/object/object-decorator.data.mjs +0 -7
  154. package/esm2020/decorators/references-many/references-many-decorator-internal.data.mjs +0 -30
  155. package/esm2020/decorators/references-one/references-one-decorator-internal.data.mjs +0 -16
  156. package/esm2020/decorators/string/string-decorator-internal.data.mjs +0 -72
  157. package/esm2020/decorators/string/string-decorator.data.mjs +0 -7
  158. package/esm2020/services/entity.service.mjs +0 -274
  159. package/esm2020/utilities/date.utilities.mjs +0 -159
  160. package/esm2020/utilities/entity.utilities.mjs +0 -905
  161. package/fesm2015/ngx-material-entity.mjs +0 -6322
  162. package/fesm2015/ngx-material-entity.mjs.map +0 -1
  163. package/fesm2020/ngx-material-entity.mjs.map +0 -1
  164. /package/{esm2020 → esm2022}/components/confirm-dialog/confirm-dialog-data.mjs +0 -0
  165. /package/{esm2020 → esm2022}/components/edit-page/edit-data.route.mjs +0 -0
  166. /package/{esm2020 → esm2022}/components/edit-page/page-edit-data.builder.mjs +0 -0
  167. /package/{esm2020 → esm2022}/components/get-validation-error-message.function.mjs +0 -0
  168. /package/{esm2020 → esm2022}/components/table/create-dialog/create-entity-dialog-data.mjs +0 -0
  169. /package/{esm2020 → esm2022}/components/table/default.actions.mjs +0 -0
  170. /package/{esm2020 → esm2022}/components/table/edit-dialog/edit-entity-data.mjs +0 -0
  171. /package/{esm2020 → esm2022}/components/table/table-data.mjs +0 -0
  172. /package/{esm2020 → esm2022}/decorators/array/array.decorator.mjs +0 -0
  173. /package/{esm2020 → esm2022}/decorators/base/base-property.decorator.mjs +0 -0
  174. /package/{esm2020 → esm2022}/decorators/base/decorator-types.enum.mjs +0 -0
  175. /package/{esm2020 → esm2022}/decorators/base/dropdown-value.interface.mjs +0 -0
  176. /package/{esm2020 → esm2022}/decorators/boolean/boolean.decorator.mjs +0 -0
  177. /package/{esm2020 → esm2022}/decorators/custom/custom-decorator.data.mjs +0 -0
  178. /package/{esm2020 → esm2022}/decorators/custom/custom.decorator.mjs +0 -0
  179. /package/{esm2020 → esm2022}/decorators/date/date.decorator.mjs +0 -0
  180. /package/{esm2020 → esm2022}/decorators/file/file.decorator.mjs +0 -0
  181. /package/{esm2020 → esm2022}/decorators/has-many/has-many-decorator.data.mjs +0 -0
  182. /package/{esm2020 → esm2022}/decorators/has-many/has-many.decorator.mjs +0 -0
  183. /package/{esm2020 → esm2022}/decorators/number/number.decorator.mjs +0 -0
  184. /package/{esm2020 → esm2022}/decorators/object/object.decorator.mjs +0 -0
  185. /package/{esm2020 → esm2022}/decorators/references-many/references-many-decorator.data.mjs +0 -0
  186. /package/{esm2020 → esm2022}/decorators/references-many/references-many.decorator.mjs +0 -0
  187. /package/{esm2020 → esm2022}/decorators/references-one/references-one-decorator.data.mjs +0 -0
  188. /package/{esm2020 → esm2022}/decorators/references-one/references-one.decorator.mjs +0 -0
  189. /package/{esm2020 → esm2022}/decorators/string/string.decorator.mjs +0 -0
  190. /package/{esm2020 → esm2022}/encapsulation/js-2-xml.utilities.mjs +0 -0
  191. /package/{esm2020 → esm2022}/encapsulation/jszip.utilities.mjs +0 -0
  192. /package/{esm2020 → esm2022}/encapsulation/lodash.utilities.mjs +0 -0
  193. /package/{esm2020 → esm2022}/encapsulation/reflect.utilities.mjs +0 -0
  194. /package/{esm2020 → esm2022}/functions/default-false.function.mjs +0 -0
  195. /package/{esm2020 → esm2022}/functions/default-true.function.mjs +0 -0
  196. /package/{esm2020 → esm2022}/functions/is-async-function.function.mjs +0 -0
  197. /package/{esm2020 → esm2022}/mocks/placeholder-data.png.mjs +0 -0
  198. /package/{esm2020 → esm2022}/ngx-material-entity.mjs +0 -0
  199. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  200. /package/{esm2020 → esm2022}/services/unsaved-changes.guard.mjs +0 -0
  201. /package/{esm2020 → esm2022}/utilities/file.utilities.mjs +0 -0
  202. /package/{esm2020 → esm2022}/utilities/selection.utilities.mjs +0 -0
@@ -1,277 +0,0 @@
1
- import { Location, NgFor, NgIf } from '@angular/common';
2
- import { HttpClient } from '@angular/common/http';
3
- import { Component, EnvironmentInjector, HostListener, Inject, InjectionToken } from '@angular/core';
4
- import { MatButtonModule } from '@angular/material/button';
5
- import { MatDialog } from '@angular/material/dialog';
6
- import { MatMenuModule } from '@angular/material/menu';
7
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
8
- import { MatTabsModule } from '@angular/material/tabs';
9
- import { ActivatedRoute } from '@angular/router';
10
- import { first, map } from 'rxjs';
11
- import { LodashUtilities } from '../../encapsulation/lodash.utilities';
12
- import { EntityService } from '../../services/entity.service';
13
- import { EntityUtilities } from '../../utilities/entity.utilities';
14
- import { ConfirmDialogDataBuilder } from '../confirm-dialog/confirm-dialog-data.builder';
15
- import { NgxMatEntityConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';
16
- import { NgxMatEntityInputModule } from '../input/input.module';
17
- import { PageEditDataBuilder } from './page-edit-data.builder';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/material/dialog";
20
- import * as i2 from "@angular/common";
21
- import * as i3 from "@angular/router";
22
- import * as i4 from "@angular/common/http";
23
- import * as i5 from "@angular/material/button";
24
- import * as i6 from "@angular/material/tabs";
25
- import * as i7 from "../input/input.component";
26
- import * as i8 from "@angular/material/progress-spinner";
27
- import * as i9 from "@angular/material/menu";
28
- import * as i10 from "../../services/entity.service";
29
- /**
30
- * The entity service that needs to be provided in the providers array of the edit page route.
31
- */
32
- // eslint-disable-next-line max-len, @typescript-eslint/no-explicit-any
33
- export const NGX_EDIT_DATA_ENTITY_SERVICE = new InjectionToken('NGX_EDIT_DATA_ENTITY_SERVICE');
34
- /**
35
- * The entity class that needs to be provided in the providers array of the edit page route.
36
- */
37
- // eslint-disable-next-line max-len, @typescript-eslint/no-explicit-any
38
- export const NGX_EDIT_DATA_ENTITY = new InjectionToken('NGX_EDIT_DATA_ENTITY');
39
- /**
40
- * The configuration that needs to be provided in the providers array of the edit page route.
41
- */
42
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
- export const NGX_EDIT_DATA = new InjectionToken('NGX_EDIT_DATA');
44
- /**
45
- * A generic page that allows you to edit a specific entity.
46
- * For this to work you need to provide some data for the route.
47
- */
48
- export class NgxMatEntityEditPageComponent {
49
- constructor(dialog, location, route, injector, entityService, EntityClass, inputData, http) {
50
- this.dialog = dialog;
51
- this.location = location;
52
- this.route = route;
53
- this.injector = injector;
54
- this.entityService = entityService;
55
- this.EntityClass = EntityClass;
56
- this.inputData = inputData;
57
- this.http = http;
58
- this.EntityUtilities = EntityUtilities;
59
- this.isEntityValid = true;
60
- this.isEntityDirty = false;
61
- this.inConfirmNavigation = false;
62
- }
63
- // eslint-disable-next-line jsdoc/require-jsdoc
64
- get hasUnsavedChanges() {
65
- return this.isEntityDirty && this.data.editData.unsavedChangesRequireConfirmDialog;
66
- }
67
- /**
68
- * Checks if the input with the given key is readonly.
69
- *
70
- * @param key - The key for the input to check.
71
- * @returns Whether or not the input for the key is read only.
72
- */
73
- isReadOnly(key) {
74
- return this.injector.runInContext(() => {
75
- const metadata = EntityUtilities.getPropertyMetadata(this.entity, key);
76
- return this.isEntityReadOnly || metadata.isReadOnly(this.entity);
77
- });
78
- }
79
- async ngOnInit() {
80
- this.data = new PageEditDataBuilder(this.inputData).getResult();
81
- if (this.data == null) {
82
- this.confirmNavigateBack();
83
- throw new Error('No edit data was provided for "NGX_EDIT_DATA". You need to provide a value in your routes providers array.');
84
- }
85
- const id = this.route.snapshot.paramMap.get('id');
86
- const foundEntity = await this.entityService.findById(id);
87
- if (foundEntity == null) {
88
- this.confirmNavigateBack();
89
- throw new Error(`Could not find entity with id ${id}`);
90
- }
91
- this.entity = new this.EntityClass(foundEntity);
92
- this.entityPriorChanges = LodashUtilities.cloneDeep(this.entity);
93
- this.injector.runInContext(() => {
94
- this.isEntityReadOnly = !this.data.allowUpdate(this.entityPriorChanges);
95
- this.allowDelete = this.data.allowDelete(this.entityPriorChanges);
96
- });
97
- this.entityTabs = EntityUtilities.getEntityTabs(this.entity, false, true);
98
- }
99
- /**
100
- * Whether the page can be left without confirmation (of unsaved changes).
101
- *
102
- * @returns Whether or not the page can be left without confirmation.
103
- */
104
- canDeactivate() {
105
- return !this.hasUnsavedChanges || this.inConfirmNavigation;
106
- }
107
- /**
108
- * Checks if the entity has become invalid or dirty.
109
- */
110
- async checkEntity() {
111
- this.isEntityValid = EntityUtilities.isEntityValid(this.entity, 'update');
112
- this.isEntityDirty = await EntityUtilities.isDirty(this.entity, this.entityPriorChanges, this.http);
113
- }
114
- /**
115
- * Tries to save the changes and close the dialog afterwards.
116
- * Also handles the confirmation if required.
117
- */
118
- edit() {
119
- if (this.isEntityReadOnly || !this.isEntityValid || !this.isEntityDirty) {
120
- return;
121
- }
122
- if (!this.data.editData.editRequiresConfirmDialog) {
123
- this.confirmEdit();
124
- return;
125
- }
126
- const dialogData = new ConfirmDialogDataBuilder(this.data.editData.confirmEditDialogData)
127
- .withDefault('text', ['Do you really want to save all changes?'])
128
- .withDefault('confirmButtonLabel', 'Save')
129
- .withDefault('title', 'Edit')
130
- .getResult();
131
- const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
132
- data: dialogData,
133
- autoFocus: false,
134
- restoreFocus: false
135
- });
136
- dialogRef.afterClosed().subscribe(res => {
137
- if (res == true) {
138
- this.confirmEdit();
139
- }
140
- });
141
- }
142
- confirmEdit() {
143
- void this.entityService.update(this.entity, this.entityPriorChanges).then(() => this.confirmNavigateBack());
144
- }
145
- /**
146
- * Tries to delete the entity and close the dialog afterwards.
147
- * Also handles the confirmation if required.
148
- */
149
- delete() {
150
- if (!this.data.editData.deleteRequiresConfirmDialog) {
151
- this.confirmDelete();
152
- return;
153
- }
154
- const dialogData = new ConfirmDialogDataBuilder(this.data.editData.confirmDeleteDialogData)
155
- .withDefault('text', ['Do you really want to delete this entity?'])
156
- .withDefault('type', 'delete')
157
- .withDefault('confirmButtonLabel', 'Delete')
158
- .withDefault('title', 'Delete')
159
- .getResult();
160
- const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
161
- data: dialogData,
162
- autoFocus: false,
163
- restoreFocus: false
164
- });
165
- dialogRef.afterClosed().subscribe(res => {
166
- if (res == true) {
167
- this.confirmDelete();
168
- }
169
- });
170
- }
171
- confirmDelete() {
172
- void this.entityService
173
- .delete(this.entityPriorChanges)
174
- .then(() => this.confirmNavigateBack());
175
- }
176
- /**
177
- * Tries to navigate back.
178
- */
179
- navigateBack() {
180
- if (!this.hasUnsavedChanges) {
181
- this.confirmNavigateBack();
182
- return;
183
- }
184
- this.openConfirmNavigationDialog().subscribe(res => {
185
- if (res) {
186
- this.confirmNavigateBack();
187
- }
188
- });
189
- }
190
- /**
191
- * Opens the confirm dialog for navigating with unsaved changes.
192
- * This is exposed because the UnsavedChangesGuard needs to access this.
193
- *
194
- * @returns The first observable result of the confirm dialog.
195
- */
196
- openConfirmNavigationDialog() {
197
- const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
198
- data: this.data.editData.confirmUnsavedChangesDialogData,
199
- autoFocus: false,
200
- restoreFocus: false
201
- });
202
- return dialogRef.afterClosed().pipe(first(), map(p => (p ?? false)));
203
- }
204
- confirmNavigateBack() {
205
- this.inConfirmNavigation = true;
206
- EntityUtilities.resetChangesOnEntity(this.entity, this.entityPriorChanges);
207
- this.location.back();
208
- }
209
- /**
210
- * Runs the edit action on the entity.
211
- *
212
- * @param action - The action to run.
213
- */
214
- runEditAction(action) {
215
- const requireConfirmDialog = this.injector.runInContext(() => {
216
- return action.requireConfirmDialog(this.entityPriorChanges);
217
- });
218
- if (!requireConfirmDialog) {
219
- this.confirmRunEditAction(action);
220
- return;
221
- }
222
- const dialogRef = this.dialog.open(NgxMatEntityConfirmDialogComponent, {
223
- data: action.confirmDialogData,
224
- autoFocus: false,
225
- restoreFocus: false
226
- });
227
- dialogRef.afterClosed().subscribe(res => {
228
- if (res == true) {
229
- this.confirmRunEditAction(action);
230
- }
231
- });
232
- }
233
- confirmRunEditAction(action) {
234
- void this.injector.runInContext(async () => {
235
- await action.action(this.entity, this.entityPriorChanges);
236
- await this.checkEntity();
237
- });
238
- }
239
- /**
240
- * Checks if an EditAction is disabled (e.g. Because the current entry doesn't fullfil the requirements).
241
- *
242
- * @param action - The EditAction to check.
243
- * @returns Whether or not the Action can be used.
244
- */
245
- editActionDisabled(action) {
246
- return this.injector.runInContext(() => {
247
- return !action.enabled(this.entityPriorChanges);
248
- });
249
- }
250
- }
251
- NgxMatEntityEditPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgxMatEntityEditPageComponent, deps: [{ token: i1.MatDialog }, { token: i2.Location }, { token: i3.ActivatedRoute }, { token: i0.EnvironmentInjector }, { token: NGX_EDIT_DATA_ENTITY_SERVICE }, { token: NGX_EDIT_DATA_ENTITY }, { token: NGX_EDIT_DATA }, { token: i4.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
252
- NgxMatEntityEditPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: NgxMatEntityEditPageComponent, isStandalone: true, selector: "ngx-mat-entity-edit-page", host: { listeners: { "window:beforeunload": "canDeactivate()" } }, ngImport: i0, template: "<div *ngIf=\"!entityTabs && data.displayLoadingSpinner\" class=\"container\">\n <br>\n <mat-spinner></mat-spinner>\n <br>\n</div>\n\n<div *ngIf=\"entityTabs\" class=\"container\">\n <br>\n\n <!------------>\n <!-- Header -->\n <!------------>\n <div class=\"header\">\n <div class=\"save-cancel-container\">\n <button type=\"button\" [class.unsavedChanges]=\"hasUnsavedChanges\" mat-raised-button (click)=\"navigateBack()\" class=\"back-button\" tabindex=\"-1\">\n <i class=\"fas fa-chevron-left\"></i>\n {{data.editData.cancelButtonLabel}}\n <i class=\"fas fa-warning\" *ngIf=\"hasUnsavedChanges\"></i>\n </button>\n <button type=\"button\" class=\"save-button\" (click)=\"edit()\" mat-raised-button [disabled]=\"isEntityReadOnly || !isEntityValid || !isEntityDirty\">\n {{data.editData.confirmButtonLabel}}\n </button>\n </div>\n <div class=\"actions-container\">\n <button *ngIf=\"data.editData.actions.length\" type=\"button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{data.editData.actionsLabel}}\n </button>\n <mat-menu #menu=\"matMenu\">\n <button type=\"button\" *ngFor=\"let action of data.editData.actions\" [disabled]=\"editActionDisabled(action)\" (click)=\"runEditAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n \n <button type=\"button\" *ngIf=\"allowDelete\" mat-raised-button (click)=\"delete()\" color=\"warn\" class=\"delete-button\" tabindex=\"-1\">\n {{data.editData.deleteButtonLabel}}\n </button>\n </div>\n </div>\n\n <h1>{{data.editData.title(entityPriorChanges)}}</h1>\n\n <!----------->\n <!-- Input -->\n <!----------->\n <form>\n <mat-tab-group *ngIf=\"entityTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of entityTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"entity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkEntity()\"\n [isReadOnly]=\"isReadOnly(key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"entityTabs.length <= 1\">\n <span class=\"no-entity-tabs\" *ngIf=\"!entityTabs.length\">\n ERROR: No Inputs. Did you correctly assign all values in the model constructor?\n </span>\n <div class=\"row\" *ngFor=\"let row of entityTabs[0]?.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"entity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkEntity()\"\n [isReadOnly]=\"isReadOnly(key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <button type=\"submit\" (click)=\"edit()\" mat-raised-button [disabled]=\"isEntityReadOnly || !isEntityValid || !isEntityDirty\">\n {{data.editData.confirmButtonLabel}}\n </button>\n </form>\n\n <br>\n</div>", styles: ["h1{text-align:center}mat-spinner{margin:10px auto}.fa-warning{color:orange}.no-entity-tabs{padding:10px;background-color:red;color:#f5f5f5}.header{display:flex;margin-bottom:5px;gap:10px;flex-wrap:wrap}.header button{min-width:150px}.header .save-cancel-container{display:flex;justify-content:flex-start;column-gap:10px;width:calc(50% - 10px)}.header .actions-container{display:flex;justify-content:flex-end;gap:10px;width:calc(50% - 10px)}.unsavedChanges{background-color:#ffe48d}@media (max-width: 800px){.header{margin-bottom:10px;gap:15px}.header button{min-width:0px;width:50%}.header .save-cancel-container,.header .actions-container{width:100%;gap:15px}}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i6.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: NgxMatEntityInputModule }, { kind: "component", type: i7.NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit", "validEmpty", "isReadOnly"], outputs: ["inputChangeEvent"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i9.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }] });
253
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: NgxMatEntityEditPageComponent, decorators: [{
254
- type: Component,
255
- args: [{ selector: 'ngx-mat-entity-edit-page', standalone: true, imports: [
256
- NgIf,
257
- NgFor,
258
- MatButtonModule,
259
- MatTabsModule,
260
- NgxMatEntityInputModule,
261
- MatProgressSpinnerModule,
262
- MatMenuModule
263
- ], template: "<div *ngIf=\"!entityTabs && data.displayLoadingSpinner\" class=\"container\">\n <br>\n <mat-spinner></mat-spinner>\n <br>\n</div>\n\n<div *ngIf=\"entityTabs\" class=\"container\">\n <br>\n\n <!------------>\n <!-- Header -->\n <!------------>\n <div class=\"header\">\n <div class=\"save-cancel-container\">\n <button type=\"button\" [class.unsavedChanges]=\"hasUnsavedChanges\" mat-raised-button (click)=\"navigateBack()\" class=\"back-button\" tabindex=\"-1\">\n <i class=\"fas fa-chevron-left\"></i>\n {{data.editData.cancelButtonLabel}}\n <i class=\"fas fa-warning\" *ngIf=\"hasUnsavedChanges\"></i>\n </button>\n <button type=\"button\" class=\"save-button\" (click)=\"edit()\" mat-raised-button [disabled]=\"isEntityReadOnly || !isEntityValid || !isEntityDirty\">\n {{data.editData.confirmButtonLabel}}\n </button>\n </div>\n <div class=\"actions-container\">\n <button *ngIf=\"data.editData.actions.length\" type=\"button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{data.editData.actionsLabel}}\n </button>\n <mat-menu #menu=\"matMenu\">\n <button type=\"button\" *ngFor=\"let action of data.editData.actions\" [disabled]=\"editActionDisabled(action)\" (click)=\"runEditAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n \n <button type=\"button\" *ngIf=\"allowDelete\" mat-raised-button (click)=\"delete()\" color=\"warn\" class=\"delete-button\" tabindex=\"-1\">\n {{data.editData.deleteButtonLabel}}\n </button>\n </div>\n </div>\n\n <h1>{{data.editData.title(entityPriorChanges)}}</h1>\n\n <!----------->\n <!-- Input -->\n <!----------->\n <form>\n <mat-tab-group *ngIf=\"entityTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of entityTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"entity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkEntity()\"\n [isReadOnly]=\"isReadOnly(key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"entityTabs.length <= 1\">\n <span class=\"no-entity-tabs\" *ngIf=\"!entityTabs.length\">\n ERROR: No Inputs. Did you correctly assign all values in the model constructor?\n </span>\n <div class=\"row\" *ngFor=\"let row of entityTabs[0]?.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"entity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(entity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(entity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(entity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkEntity()\"\n [isReadOnly]=\"isReadOnly(key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <button type=\"submit\" (click)=\"edit()\" mat-raised-button [disabled]=\"isEntityReadOnly || !isEntityValid || !isEntityDirty\">\n {{data.editData.confirmButtonLabel}}\n </button>\n </form>\n\n <br>\n</div>", styles: ["h1{text-align:center}mat-spinner{margin:10px auto}.fa-warning{color:orange}.no-entity-tabs{padding:10px;background-color:red;color:#f5f5f5}.header{display:flex;margin-bottom:5px;gap:10px;flex-wrap:wrap}.header button{min-width:150px}.header .save-cancel-container{display:flex;justify-content:flex-start;column-gap:10px;width:calc(50% - 10px)}.header .actions-container{display:flex;justify-content:flex-end;gap:10px;width:calc(50% - 10px)}.unsavedChanges{background-color:#ffe48d}@media (max-width: 800px){.header{margin-bottom:10px;gap:15px}.header button{min-width:0px;width:50%}.header .save-cancel-container,.header .actions-container{width:100%;gap:15px}}\n"] }]
264
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.Location }, { type: i3.ActivatedRoute }, { type: i0.EnvironmentInjector }, { type: i10.EntityService, decorators: [{
265
- type: Inject,
266
- args: [NGX_EDIT_DATA_ENTITY_SERVICE]
267
- }] }, { type: undefined, decorators: [{
268
- type: Inject,
269
- args: [NGX_EDIT_DATA_ENTITY]
270
- }] }, { type: undefined, decorators: [{
271
- type: Inject,
272
- args: [NGX_EDIT_DATA]
273
- }] }, { type: i4.HttpClient }]; }, propDecorators: { canDeactivate: [{
274
- type: HostListener,
275
- args: ['window:beforeunload']
276
- }] } });
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1wYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL2NvbXBvbmVudHMvZWRpdC1wYWdlL2VkaXQtcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2VkaXQtcGFnZS9lZGl0LXBhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFjLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQWEsZUFBZSxFQUFFLE1B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QkFBdUIsK1JBQ3ZCLHdCQUF3QixrT0FDeEIsYUFBYTsyRkFHUiw2QkFBNkI7a0JBZnpDLFNBQVM7K0JBQ0ksMEJBQTBCLGNBR3hCLElBQUksV0FDUDt3QkFDTCxJQUFJO3dCQUNKLEtBQUs7d0JBQ0wsZUFBZTt3QkFDZixhQUFhO3dCQUNiLHVCQUF1Qjt3QkFDdkIsd0JBQXdCO3dCQUN4QixhQUFhO3FCQUNoQjs7MEJBK0JJLE1BQU07MkJBQUMsNEJBQTRCOzswQkFFbkMsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUUzQixNQUFNOzJCQUFDLGFBQWE7cUVBaUR6QixhQUFhO3NCQURaLFlBQVk7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9jYXRpb24sIE5nRm9yLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVudmlyb25tZW50SW5qZWN0b3IsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbmplY3Rpb25Ub2tlbiwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmaXJzdCwgbWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSwgRW50aXR5Q2xhc3NOZXdhYmxlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvYmFzZS9wcm9wZXJ0eS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRW50aXR5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VudGl0eS5zZXJ2aWNlJztcbmltcG9ydCB7IEVudGl0eVRhYiwgRW50aXR5VXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2VudGl0eS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ0RhdGEgfSBmcm9tICcuLi9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy1kYXRhJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlciwgQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCB9IGZyb20gJy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLWRhdGEuYnVpbGRlcic7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IE5neE1hdEVudGl0eUlucHV0TW9kdWxlIH0gZnJvbSAnLi4vaW5wdXQvaW5wdXQubW9kdWxlJztcbmltcG9ydCB7IEVkaXRBY3Rpb25JbnRlcm5hbCB9IGZyb20gJy4uL3RhYmxlL2VkaXQtZGlhbG9nL2VkaXQtZGF0YS5idWlsZGVyJztcbmltcG9ydCB7IEVkaXRFbnRpdHlEYXRhIH0gZnJvbSAnLi4vdGFibGUvZWRpdC1kaWFsb2cvZWRpdC1lbnRpdHktZGF0YSc7XG5pbXBvcnQgeyBFZGl0RGF0YSB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLWRhdGEnO1xuaW1wb3J0IHsgUGFnZUVkaXREYXRhQnVpbGRlciwgUGFnZUVkaXREYXRhSW50ZXJuYWwgfSBmcm9tICcuL3BhZ2UtZWRpdC1kYXRhLmJ1aWxkZXInO1xuXG4vKipcbiAqIFRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcHJvdmlkZWQgZm9yIGEgcm91dGUgdG8gYmUgYWJsZSB0byBlZGl0IGEgZW50aXR5LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuZXhwb3J0IHR5cGUgUGFnZUVkaXREYXRhPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4gPSBPbWl0PEVkaXRFbnRpdHlEYXRhPEVudGl0eVR5cGU+LCAnZW50aXR5JyB8ICdFbnRpdHlTZXJ2aWNlQ2xhc3MnPiAmIHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IGEgbG9hZGluZyBzcGlubmVyIHdoaWxlIHRoZSBlbnRpdHkgZm9yIHRoZSBwYWdlIGlzIGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBkaXNwbGF5TG9hZGluZ1NwaW5uZXI/OiBib29sZWFuLFxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIG9mIHRoZSBkZWZhdWx0IGVkaXQgcGFnZS5cbiAgICAgKi9cbiAgICBlZGl0RGF0YT86IEVkaXREYXRhPEVudGl0eVR5cGU+ICYge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRhdGEgZm9yIHRoZSBkaWFsb2cgd2hlbiB0aGUgdXNlciB0cmllcyB0byBsZWF2ZSB0aGUgc2l0ZSB3aXRoIHVuc2F2ZWQgY2hhbmdlcy5cbiAgICAgICAgICovXG4gICAgICAgIGNvbmZpcm1VbnNhdmVkQ2hhbmdlc0RpYWxvZ0RhdGE/OiBDb25maXJtRGlhbG9nRGF0YSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgb3Igbm90IGxlYXZpbmcgd2l0aCB1bnNhdmVkIGNoYW5nZXMgc2hvdWxkIHJlcXVpcmUgYSBjb25maXJtIGRpYWxvZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKi9cbiAgICAgICAgdW5zYXZlZENoYW5nZXNSZXF1aXJlQ29uZmlybURpYWxvZz86IGJvb2xlYW5cbiAgICB9XG59O1xuXG4vKipcbiAqIFRoZSBlbnRpdHkgc2VydmljZSB0aGF0IG5lZWRzIHRvIGJlIHByb3ZpZGVkIGluIHRoZSBwcm92aWRlcnMgYXJyYXkgb2YgdGhlIGVkaXQgcGFnZSByb3V0ZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW4sIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBOR1hfRURJVF9EQVRBX0VOVElUWV9TRVJWSUNFOiBJbmplY3Rpb25Ub2tlbjxFbnRpdHlTZXJ2aWNlPGFueT4+ID0gbmV3IEluamVjdGlvblRva2VuPEVudGl0eVNlcnZpY2U8YW55Pj4oJ05HWF9FRElUX0RBVEFfRU5USVRZX1NFUlZJQ0UnKTtcbi8qKlxuICogVGhlIGVudGl0eSBjbGFzcyB0aGF0IG5lZWRzIHRvIGJlIHByb3ZpZGVkIGluIHRoZSBwcm92aWRlcnMgYXJyYXkgb2YgdGhlIGVkaXQgcGFnZSByb3V0ZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW4sIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBOR1hfRURJVF9EQVRBX0VOVElUWTogSW5qZWN0aW9uVG9rZW48RW50aXR5Q2xhc3NOZXdhYmxlPGFueT4+ID0gbmV3IEluamVjdGlvblRva2VuPEVudGl0eUNsYXNzTmV3YWJsZTxhbnk+PignTkdYX0VESVRfREFUQV9FTlRJVFknKTtcbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBuZWVkcyB0byBiZSBwcm92aWRlZCBpbiB0aGUgcHJvdmlkZXJzIGFycmF5IG9mIHRoZSBlZGl0IHBhZ2Ugcm91dGUuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgTkdYX0VESVRfREFUQTogSW5qZWN0aW9uVG9rZW48UGFnZUVkaXREYXRhPGFueT4+ID0gbmV3IEluamVjdGlvblRva2VuPFBhZ2VFZGl0RGF0YTxhbnk+PignTkdYX0VESVRfREFUQScpO1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBwYWdlIHRoYXQgYWxsb3dzIHlvdSB0byBlZGl0IGEgc3BlY2lmaWMgZW50aXR5LlxuICogRm9yIHRoaXMgdG8gd29yayB5b3UgbmVlZCB0byBwcm92aWRlIHNvbWUgZGF0YSBmb3IgdGhlIHJvdXRlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1tYXQtZW50aXR5LWVkaXQtcGFnZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VkaXQtcGFnZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZWRpdC1wYWdlLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nRm9yLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE1hdFRhYnNNb2R1bGUsXG4gICAgICAgIE5neE1hdEVudGl0eUlucHV0TW9kdWxlLFxuICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG4gICAgICAgIE1hdE1lbnVNb2R1bGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hdEVudGl0eUVkaXRQYWdlQ29tcG9uZW50PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4gaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgRW50aXR5VXRpbGl0aWVzOiB0eXBlb2YgRW50aXR5VXRpbGl0aWVzID0gRW50aXR5VXRpbGl0aWVzO1xuXG4gICAgZW50aXR5VGFicyE6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdO1xuXG4gICAgZW50aXR5ITogRW50aXR5VHlwZTtcbiAgICBlbnRpdHlQcmlvckNoYW5nZXMhOiBFbnRpdHlUeXBlO1xuXG4gICAgZGF0YSE6IFBhZ2VFZGl0RGF0YUludGVybmFsPEVudGl0eVR5cGU+O1xuXG4gICAgaXNFbnRpdHlWYWxpZDogYm9vbGVhbiA9IHRydWU7XG4gICAgaXNFbnRpdHlEaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgaXNFbnRpdHlSZWFkT25seSE6IGJvb2xlYW47XG4gICAgYWxsb3dEZWxldGUhOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBpbkNvbmZpcm1OYXZpZ2F0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGdldCBoYXNVbnNhdmVkQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNFbnRpdHlEaXJ0eSAmJiB0aGlzLmRhdGEuZWRpdERhdGEudW5zYXZlZENoYW5nZXNSZXF1aXJlQ29uZmlybURpYWxvZztcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBASW5qZWN0KE5HWF9FRElUX0RBVEFfRU5USVRZX1NFUlZJQ0UpXG4gICAgICAgIHJlYWRvbmx5IGVudGl0eVNlcnZpY2U6IEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZT4sXG4gICAgICAgIEBJbmplY3QoTkdYX0VESVRfREFUQV9FTlRJVFkpXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRW50aXR5Q2xhc3M6IEVudGl0eUNsYXNzTmV3YWJsZTxFbnRpdHlUeXBlPixcbiAgICAgICAgQEluamVjdChOR1hfRURJVF9EQVRBKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGlucHV0RGF0YTogUGFnZUVkaXREYXRhPEVudGl0eVR5cGU+LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnRcbiAgICApIHsgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCB3aXRoIHRoZSBnaXZlbiBrZXkgaXMgcmVhZG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBmb3IgdGhlIGlucHV0IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBpbnB1dCBmb3IgdGhlIGtleSBpcyByZWFkIG9ubHkuXG4gICAgICovXG4gICAgaXNSZWFkT25seShrZXk6IGtleW9mIEVudGl0eVR5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGhpcy5lbnRpdHksIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VudGl0eVJlYWRPbmx5IHx8IG1ldGFkYXRhLmlzUmVhZE9ubHkodGhpcy5lbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IFBhZ2VFZGl0RGF0YUJ1aWxkZXIodGhpcy5pbnB1dERhdGEpLmdldFJlc3VsdCgpO1xuICAgICAgICBpZiAodGhpcy5kYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybU5hdmlnYXRlQmFjaygpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBlZGl0IGRhdGEgd2FzIHByb3ZpZGVkIGZvciBcIk5HWF9FRElUX0RBVEFcIi4gWW91IG5lZWQgdG8gcHJvdmlkZSBhIHZhbHVlIGluIHlvdXIgcm91dGVzIHByb3ZpZGVycyBhcnJheS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkOiBFbnRpdHlUeXBlW2tleW9mIEVudGl0eVR5cGVdID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJykgYXMgRW50aXR5VHlwZVtrZXlvZiBFbnRpdHlUeXBlXTtcbiAgICAgICAgY29uc3QgZm91bmRFbnRpdHk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQgPSBhd2FpdCB0aGlzLmVudGl0eVNlcnZpY2UuZmluZEJ5SWQoaWQpO1xuXG4gICAgICAgIGlmIChmb3VuZEVudGl0eSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1OYXZpZ2F0ZUJhY2soKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgZW50aXR5IHdpdGggaWQgJHtpZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW50aXR5ID0gbmV3IHRoaXMuRW50aXR5Q2xhc3MoZm91bmRFbnRpdHkpO1xuICAgICAgICB0aGlzLmVudGl0eVByaW9yQ2hhbmdlcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5lbnRpdHkpO1xuXG4gICAgICAgIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNFbnRpdHlSZWFkT25seSA9ICF0aGlzLmRhdGEuYWxsb3dVcGRhdGUodGhpcy5lbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgdGhpcy5hbGxvd0RlbGV0ZSA9IHRoaXMuZGF0YS5hbGxvd0RlbGV0ZSh0aGlzLmVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVudGl0eVRhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmVudGl0eSwgZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHBhZ2UgY2FuIGJlIGxlZnQgd2l0aG91dCBjb25maXJtYXRpb24gKG9mIHVuc2F2ZWQgY2hhbmdlcykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgcGFnZSBjYW4gYmUgbGVmdCB3aXRob3V0IGNvbmZpcm1hdGlvbi5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJylcbiAgICBjYW5EZWFjdGl2YXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuaGFzVW5zYXZlZENoYW5nZXMgfHwgdGhpcy5pbkNvbmZpcm1OYXZpZ2F0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZW50aXR5IGhhcyBiZWNvbWUgaW52YWxpZCBvciBkaXJ0eS5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja0VudGl0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5pc0VudGl0eVZhbGlkID0gRW50aXR5VXRpbGl0aWVzLmlzRW50aXR5VmFsaWQodGhpcy5lbnRpdHksICd1cGRhdGUnKTtcbiAgICAgICAgdGhpcy5pc0VudGl0eURpcnR5ID0gYXdhaXQgRW50aXR5VXRpbGl0aWVzLmlzRGlydHkodGhpcy5lbnRpdHksIHRoaXMuZW50aXR5UHJpb3JDaGFuZ2VzLCB0aGlzLmh0dHApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHNhdmUgdGhlIGNoYW5nZXMgYW5kIGNsb3NlIHRoZSBkaWFsb2cgYWZ0ZXJ3YXJkcy5cbiAgICAgKiBBbHNvIGhhbmRsZXMgdGhlIGNvbmZpcm1hdGlvbiBpZiByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBlZGl0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0VudGl0eVJlYWRPbmx5IHx8ICF0aGlzLmlzRW50aXR5VmFsaWQgfHwgIXRoaXMuaXNFbnRpdHlEaXJ0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kYXRhLmVkaXREYXRhLmVkaXRSZXF1aXJlc0NvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybUVkaXQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLmRhdGEuZWRpdERhdGEuY29uZmlybUVkaXREaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgWydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gc2F2ZSBhbGwgY2hhbmdlcz8nXSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgnY29uZmlybUJ1dHRvbkxhYmVsJywgJ1NhdmUnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0aXRsZScsICdFZGl0JylcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm1FZGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybUVkaXQoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5lbnRpdHlTZXJ2aWNlLnVwZGF0ZSh0aGlzLmVudGl0eSwgdGhpcy5lbnRpdHlQcmlvckNoYW5nZXMpLnRoZW4oKCkgPT4gdGhpcy5jb25maXJtTmF2aWdhdGVCYWNrKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGRlbGV0ZSB0aGUgZW50aXR5IGFuZCBjbG9zZSB0aGUgZGlhbG9nIGFmdGVyd2FyZHMuXG4gICAgICogQWxzbyBoYW5kbGVzIHRoZSBjb25maXJtYXRpb24gaWYgcmVxdWlyZWQuXG4gICAgICovXG4gICAgZGVsZXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YS5lZGl0RGF0YS5kZWxldGVSZXF1aXJlc0NvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybURlbGV0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuZGF0YS5lZGl0RGF0YS5jb25maXJtRGVsZXRlRGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIFsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGVudGl0eT8nXSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndHlwZScsICdkZWxldGUnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjb25maXJtQnV0dG9uTGFiZWwnLCAnRGVsZXRlJylcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCAnRGVsZXRlJylcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm1EZWxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maXJtRGVsZXRlKCk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMuZW50aXR5U2VydmljZVxuICAgICAgICAgICAgLmRlbGV0ZSh0aGlzLmVudGl0eVByaW9yQ2hhbmdlcylcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuY29uZmlybU5hdmlnYXRlQmFjaygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmllcyB0byBuYXZpZ2F0ZSBiYWNrLlxuICAgICAqL1xuICAgIG5hdmlnYXRlQmFjaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Vuc2F2ZWRDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1OYXZpZ2F0ZUJhY2soKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlbkNvbmZpcm1OYXZpZ2F0aW9uRGlhbG9nKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtTmF2aWdhdGVCYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBjb25maXJtIGRpYWxvZyBmb3IgbmF2aWdhdGluZyB3aXRoIHVuc2F2ZWQgY2hhbmdlcy5cbiAgICAgKiBUaGlzIGlzIGV4cG9zZWQgYmVjYXVzZSB0aGUgVW5zYXZlZENoYW5nZXNHdWFyZCBuZWVkcyB0byBhY2Nlc3MgdGhpcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBmaXJzdCBvYnNlcnZhYmxlIHJlc3VsdCBvZiB0aGUgY29uZmlybSBkaWFsb2cuXG4gICAgICovXG4gICAgb3BlbkNvbmZpcm1OYXZpZ2F0aW9uRGlhbG9nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLmVkaXREYXRhLmNvbmZpcm1VbnNhdmVkQ2hhbmdlc0RpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnBpcGUoZmlyc3QoKSwgbWFwKHAgPT4gKHAgPz8gZmFsc2UpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maXJtTmF2aWdhdGVCYWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluQ29uZmlybU5hdmlnYXRpb24gPSB0cnVlO1xuICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5lbnRpdHksIHRoaXMuZW50aXR5UHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyB0aGUgZWRpdCBhY3Rpb24gb24gdGhlIGVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gLSBUaGUgYWN0aW9uIHRvIHJ1bi5cbiAgICAgKi9cbiAgICBydW5FZGl0QWN0aW9uKGFjdGlvbjogRWRpdEFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVDb25maXJtRGlhbG9nOiBib29sZWFuID0gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5yZXF1aXJlQ29uZmlybURpYWxvZyh0aGlzLmVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVxdWlyZUNvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybVJ1bkVkaXRBY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogYWN0aW9uLmNvbmZpcm1EaWFsb2dEYXRhLFxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtUnVuRWRpdEFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbmZpcm1SdW5FZGl0QWN0aW9uKGFjdGlvbjogRWRpdEFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgYWN0aW9uLmFjdGlvbih0aGlzLmVudGl0eSwgdGhpcy5lbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja0VudGl0eSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gRWRpdEFjdGlvbiBpcyBkaXNhYmxlZCAoZS5nLiBCZWNhdXNlIHRoZSBjdXJyZW50IGVudHJ5IGRvZXNuJ3QgZnVsbGZpbCB0aGUgcmVxdWlyZW1lbnRzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gLSBUaGUgRWRpdEFjdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgQWN0aW9uIGNhbiBiZSB1c2VkLlxuICAgICAqL1xuICAgIGVkaXRBY3Rpb25EaXNhYmxlZChhY3Rpb246IEVkaXRBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFhY3Rpb24uZW5hYmxlZCh0aGlzLmVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn0iLCI8ZGl2ICpuZ0lmPVwiIWVudGl0eVRhYnMgJiYgZGF0YS5kaXNwbGF5TG9hZGluZ1NwaW5uZXJcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgIDxicj5cbiAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8YnI+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImVudGl0eVRhYnNcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgIDxicj5cblxuICAgIDwhLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0gSGVhZGVyIC0tPlxuICAgIDwhLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNhdmUtY2FuY2VsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzLnVuc2F2ZWRDaGFuZ2VzXT1cImhhc1Vuc2F2ZWRDaGFuZ2VzXCIgbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm5hdmlnYXRlQmFjaygpXCIgY2xhc3M9XCJiYWNrLWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnRcIj48L2k+XG4gICAgICAgICAgICAgICAge3tkYXRhLmVkaXREYXRhLmNhbmNlbEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS13YXJuaW5nXCIgKm5nSWY9XCJoYXNVbnNhdmVkQ2hhbmdlc1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzYXZlLWJ1dHRvblwiIChjbGljayk9XCJlZGl0KClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNFbnRpdHlSZWFkT25seSB8fCAhaXNFbnRpdHlWYWxpZCB8fCAhaXNFbnRpdHlEaXJ0eVwiPlxuICAgICAgICAgICAgICAgIHt7ZGF0YS5lZGl0RGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJkYXRhLmVkaXREYXRhLmFjdGlvbnMubGVuZ3RoXCIgdHlwZT1cImJ1dHRvblwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgbWF0LXJhaXNlZC1idXR0b24+XG4gICAgICAgICAgICAgICAge3tkYXRhLmVkaXREYXRhLmFjdGlvbnNMYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGRhdGEuZWRpdERhdGEuYWN0aW9uc1wiIFtkaXNhYmxlZF09XCJlZGl0QWN0aW9uRGlzYWJsZWQoYWN0aW9uKVwiIChjbGljayk9XCJydW5FZGl0QWN0aW9uKGFjdGlvbilcIiBtYXQtbWVudS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICB7e2FjdGlvbi5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICBcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiYWxsb3dEZWxldGVcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlKClcIiBjb2xvcj1cIndhcm5cIiBjbGFzcz1cImRlbGV0ZS1idXR0b25cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgICAge3tkYXRhLmVkaXREYXRhLmRlbGV0ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxoMT57e2RhdGEuZWRpdERhdGEudGl0bGUoZW50aXR5UHJpb3JDaGFuZ2VzKX19PC9oMT5cblxuICAgIDwhLS0tLS0tLS0tLS0+XG4gICAgPCEtLSBJbnB1dCAtLT5cbiAgICA8IS0tLS0tLS0tLS0tPlxuICAgIDxmb3JtPlxuICAgICAgICA8bWF0LXRhYi1ncm91cCAqbmdJZj1cImVudGl0eVRhYnMubGVuZ3RoID4gMVwiIHByZXNlcnZlQ29udGVudD5cbiAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgZW50aXR5VGFic1wiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlLZXldPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChlbnRpdHksIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoZW50aXR5LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGVudGl0eSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNoZWNrRW50aXR5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaXNSZWFkT25seShrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgXG4gICAgICAgIDxkaXYgKm5nSWY9XCJlbnRpdHlUYWJzLmxlbmd0aCA8PSAxXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLWVudGl0eS10YWJzXCIgKm5nSWY9XCIhZW50aXR5VGFicy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICBFUlJPUjogTm8gSW5wdXRzLiBEaWQgeW91IGNvcnJlY3RseSBhc3NpZ24gYWxsIHZhbHVlcyBpbiB0aGUgbW9kZWwgY29uc3RydWN0b3I/XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBlbnRpdHlUYWJzWzBdPy5yb3dzXCI+XG4gICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2Ygcm93LmtleXNcIlxuICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImVudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChlbnRpdHksIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoZW50aXR5LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGVudGl0eSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tFbnRpdHkoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImlzUmVhZE9ubHkoa2V5KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cImVkaXQoKVwiIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpc0VudGl0eVJlYWRPbmx5IHx8ICFpc0VudGl0eVZhbGlkIHx8ICFpc0VudGl0eURpcnR5XCI+XG4gICAgICAgICAgICB7e2RhdGEuZWRpdERhdGEuY29uZmlybUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9mb3JtPlxuXG4gICAgPGJyPlxuPC9kaXY+Il19
@@ -1,26 +0,0 @@
1
- /* eslint-disable jsdoc/require-jsdoc */
2
- import { Component } from '@angular/core';
3
- import { DateUtilities } from '../../../../utilities/date.utilities';
4
- import { ArrayTableComponent } from '../array-table.class';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "@angular/material/input";
8
- import * as i3 from "@angular/material/form-field";
9
- import * as i4 from "@angular/forms";
10
- import * as i5 from "@angular/material/checkbox";
11
- import * as i6 from "@angular/material/table";
12
- import * as i7 from "@angular/material/button";
13
- import * as i8 from "@angular/material/datepicker";
14
- export class ArrayDateInputComponent extends ArrayTableComponent {
15
- constructor() {
16
- super(...arguments);
17
- this.DateUtilities = DateUtilities;
18
- }
19
- }
20
- ArrayDateInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: ArrayDateInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
21
- ArrayDateInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: ArrayDateInputComponent, selector: "array-date-input", usesInheritance: true, ngImport: i0, template: "<div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadata.displayName}}</b>\n </div>\n <div *ngIf=\"!isReadOnly\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"input\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [matDatepicker]=\"picker\"\n [required]=\"metadata.required(entity)\"\n [min]=\"metadata.min ? metadata.min(input) : undefined\"\n [max]=\"metadata.max ? metadata.max(input) : undefined\"\n [matDatepickerFilter]=\"metadata.filter ?? DateUtilities.defaultDateFilter\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n \n <div class=\"buttons\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"model.errors\"\n (click)=\"add()\">\n {{metadata.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!selection.selected.length\"\n (click)=\"remove()\">\n {{metadata.removeButtonLabel}}\n </button>\n </div>\n </div>\n\n <mat-table [dataSource]=\"dataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [disabled]=\"!dataSource.data.length\" (change)=\"$event ? SelectionUtilities.masterToggle(selection, dataSource) : null\" [checked]=\"selection.hasValue() && SelectionUtilities.isAllSelected(selection, dataSource)\" [indeterminate]=\"selection.hasValue() && !SelectionUtilities.isAllSelected(selection, dataSource)\"></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(entity) : null\" [checked]=\"selection.isSelected(entity)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadata.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell class=\"entity\" *matCellDef=\"let entity\">\n {{getDisplayColumnValue(entity, dCol)}}\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n\n <div class=\"array-error\" *ngIf=\"metadata.required && !dataSource.data.length\">\n {{metadata.missingErrorMessage}}\n </div>\n</div>", styles: [".mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}mat-form-field{width:100%}.buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.mat-column-select{flex:0 0 75px}.elevation-container{border-radius:5px;padding:15px;margin-bottom:15px;margin-top:15px}.array-headline{padding-bottom:10px}.array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i8.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i8.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i8.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }] });
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: ArrayDateInputComponent, decorators: [{
23
- type: Component,
24
- args: [{ selector: 'array-date-input', template: "<div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadata.displayName}}</b>\n </div>\n <div *ngIf=\"!isReadOnly\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"input\"\n [name]=\"key.toString()\"\n #model=\"ngModel\"\n [matDatepicker]=\"picker\"\n [required]=\"metadata.required(entity)\"\n [min]=\"metadata.min ? metadata.min(input) : undefined\"\n [max]=\"metadata.max ? metadata.max(input) : undefined\"\n [matDatepickerFilter]=\"metadata.filter ?? DateUtilities.defaultDateFilter\"\n >\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n \n <div class=\"buttons\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"model.errors\"\n (click)=\"add()\">\n {{metadata.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!selection.selected.length\"\n (click)=\"remove()\">\n {{metadata.removeButtonLabel}}\n </button>\n </div>\n </div>\n\n <mat-table [dataSource]=\"dataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [disabled]=\"!dataSource.data.length\" (change)=\"$event ? SelectionUtilities.masterToggle(selection, dataSource) : null\" [checked]=\"selection.hasValue() && SelectionUtilities.isAllSelected(selection, dataSource)\" [indeterminate]=\"selection.hasValue() && !SelectionUtilities.isAllSelected(selection, dataSource)\"></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(entity) : null\" [checked]=\"selection.isSelected(entity)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadata.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell class=\"entity\" *matCellDef=\"let entity\">\n {{getDisplayColumnValue(entity, dCol)}}\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n\n <div class=\"array-error\" *ngIf=\"metadata.required && !dataSource.data.length\">\n {{metadata.missingErrorMessage}}\n </div>\n</div>", styles: [".mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}mat-form-field{width:100%}.buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.mat-column-select{flex:0 0 75px}.elevation-container{border-radius:5px;padding:15px;margin-bottom:15px;margin-top:15px}.array-headline{padding-bottom:10px}.array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}\n"] }]
25
- }] });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktZGF0ZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2FycmF5L2FycmF5LWRhdGUtaW5wdXQvYXJyYXktZGF0ZS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2FycmF5L2FycmF5LWRhdGUtaW5wdXQvYXJyYXktZGF0ZS1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUdsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFRM0QsTUFBTSxPQUFPLHVCQUNULFNBQVEsbUJBQWdFO0lBUDVFOztRQVNJLGtCQUFhLEdBQXlCLGFBQWEsQ0FBQztLQUN2RDs7b0hBSlksdUJBQXVCO3dHQUF2Qix1QkFBdUIsK0VDYnBDLDZrR0FnRU07MkZEbkRPLHVCQUF1QjtrQkFObkMsU0FBUzsrQkFFSSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWpzZG9jICovXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBEZWNvcmF0b3JUeXBlcyB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvYmFzZS9kZWNvcmF0b3ItdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBEYXRlVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbGl0aWVzL2RhdGUudXRpbGl0aWVzJztcbmltcG9ydCB7IEFycmF5VGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9hcnJheS10YWJsZS5jbGFzcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdhcnJheS1kYXRlLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYXJyYXktZGF0ZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYXJyYXktZGF0ZS1pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEFycmF5RGF0ZUlucHV0Q29tcG9uZW50PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj5cbiAgICBleHRlbmRzIEFycmF5VGFibGVDb21wb25lbnQ8RGF0ZSwgRW50aXR5VHlwZSwgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURT4gaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgRGF0ZVV0aWxpdGllczogdHlwZW9mIERhdGVVdGlsaXRpZXMgPSBEYXRlVXRpbGl0aWVzO1xufSIsIjxkaXYgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXo4IGVsZXZhdGlvbi1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYXJyYXktaGVhZGxpbmVcIj5cbiAgICAgICAgPGI+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9iPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhaXNSZWFkT25seVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cImtleS50b1N0cmluZygpXCJcbiAgICAgICAgICAgICAgICAjbW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpXCJcbiAgICAgICAgICAgICAgICBbbWluXT1cIm1ldGFkYXRhLm1pbiA/IG1ldGFkYXRhLm1pbihpbnB1dCkgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgIFttYXhdPVwibWV0YWRhdGEubWF4ID8gbWV0YWRhdGEubWF4KGlucHV0KSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwibWV0YWRhdGEuZmlsdGVyID8/IERhdGVVdGlsaXRpZXMuZGVmYXVsdERhdGVGaWx0ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICBcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGVsLmVycm9yc1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZCgpXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YS5hZGRCdXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlKClcIj5cbiAgICAgICAgICAgICAgICB7e21ldGFkYXRhLnJlbW92ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiPlxuICAgICAgICA8IS0tIHNlbGVjdCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2Rpc2FibGVkXT1cIiFkYXRhU291cmNlLmRhdGEubGVuZ3RoXCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBTZWxlY3Rpb25VdGlsaXRpZXMubWFzdGVyVG9nZ2xlKHNlbGVjdGlvbiwgZGF0YVNvdXJjZSkgOiBudWxsXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgU2VsZWN0aW9uVXRpbGl0aWVzLmlzQWxsU2VsZWN0ZWQoc2VsZWN0aW9uLCBkYXRhU291cmNlKVwiIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFTZWxlY3Rpb25VdGlsaXRpZXMuaXNBbGxTZWxlY3RlZChzZWxlY3Rpb24sIGRhdGFTb3VyY2UpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUoZW50aXR5KSA6IG51bGxcIiBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChlbnRpdHkpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBtZXRhZGF0YS5kaXNwbGF5Q29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5kaXNwbGF5TmFtZVwiPlxuICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgICAgICB7e2RDb2wuZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICA8bWF0LWNlbGwgY2xhc3M9XCJlbnRpdHlcIiAqbWF0Q2VsbERlZj1cImxldCBlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICB7e2dldERpc3BsYXlDb2x1bW5WYWx1ZShlbnRpdHksIGRDb2wpfX1cbiAgICAgICAgICAgIDwvbWF0LWNlbGw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgICA8bWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L21hdC1oZWFkZXItcm93PlxuICAgICAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LXJvdz5cbiAgICA8L21hdC10YWJsZT5cblxuICAgIDxkaXYgY2xhc3M9XCJhcnJheS1lcnJvclwiICpuZ0lmPVwibWV0YWRhdGEucmVxdWlyZWQgJiYgIWRhdGFTb3VyY2UuZGF0YS5sZW5ndGhcIj5cbiAgICAgICAge3ttZXRhZGF0YS5taXNzaW5nRXJyb3JNZXNzYWdlfX1cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
@@ -1,50 +0,0 @@
1
- /* eslint-disable jsdoc/require-jsdoc */
2
- import { Component } from '@angular/core';
3
- import { DateUtilities } from '../../../../utilities/date.utilities';
4
- import { ArrayTableComponent } from '../array-table.class';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "@angular/material/form-field";
8
- import * as i3 from "@angular/forms";
9
- import * as i4 from "@angular/material/checkbox";
10
- import * as i5 from "@angular/material/table";
11
- import * as i6 from "@angular/material/button";
12
- import * as i7 from "@angular/material/datepicker";
13
- export class ArrayDateRangeInputComponent extends ArrayTableComponent {
14
- constructor() {
15
- super(...arguments);
16
- this.DateUtilities = DateUtilities;
17
- }
18
- ngOnInit() {
19
- super.ngOnInit();
20
- this.input = {
21
- start: undefined,
22
- end: undefined,
23
- values: undefined
24
- };
25
- }
26
- /**
27
- * Adds a DateRange to the array.
28
- */
29
- addDateRange() {
30
- if (this.input && this.dateRangeStart && this.dateRangeEnd) {
31
- this.input.start = new Date(this.dateRangeStart);
32
- this.input.end = new Date(this.dateRangeEnd);
33
- const values = DateUtilities.getDatesBetween(this.input.start, this.input.end, this.metadata.filter);
34
- this.input.values = values.length ? values : undefined;
35
- this.add();
36
- }
37
- }
38
- resetInput() {
39
- this.input = undefined;
40
- this.dateRangeStart = undefined;
41
- this.dateRangeEnd = undefined;
42
- }
43
- }
44
- ArrayDateRangeInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: ArrayDateRangeInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
45
- ArrayDateRangeInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.3", type: ArrayDateRangeInputComponent, selector: "array-date-range-input", usesInheritance: true, ngImport: i0, template: "<div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadata.displayName}}</b>\n </div>\n <div *ngIf=\"!isReadOnly\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n \n <mat-date-range-input [rangePicker]=\"picker\" [required]=\"metadata.required(entity)\" [dateFilter]=\"metadata.filter ? metadata.filter : DateUtilities.defaultDateFilter\">\n <input matStartDate\n [(ngModel)]=\"dateRangeStart\"\n [name]=\"key.toString() + 'start'\"\n #startModel=\"ngModel\"\n [required]=\"metadata.required(entity)\"\n [min]=\"metadata.minStart ? metadata.minStart(input?.start) : undefined\"\n [max]=\"metadata.maxStart ? metadata.maxStart(input?.start) : undefined\"\n [placeholder]=\"metadata.placeholderStart\"\n >\n <input matEndDate\n [(ngModel)]=\"dateRangeEnd\"\n [name]=\"key.toString() + 'end'\"\n #endModel=\"ngModel\"\n [required]=\"metadata.required(entity)\"\n [min]=\"metadata.minEnd ? metadata.minEnd(input?.end) : undefined\"\n [max]=\"metadata.maxEnd ? metadata.maxEnd(input?.end) : undefined\"\n [placeholder]=\"metadata.placeholderEnd\"\n >\n </mat-date-range-input>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n \n <mat-error *ngIf=\"startModel.errors\">{{getValidationErrorMessage(startModel)}}</mat-error>\n <mat-error *ngIf=\"!startModel.errors && endModel.errors\">{{getValidationErrorMessage(endModel)}}</mat-error>\n </mat-form-field>\n \n <div class=\"buttons\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"startModel.errors || endModel.errors\"\n (click)=\"addDateRange()\">\n {{metadata.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!selection.selected.length\"\n (click)=\"remove()\">\n {{metadata.removeButtonLabel}}\n </button>\n </div>\n </div>\n\n <mat-table [dataSource]=\"dataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [disabled]=\"!dataSource.data.length\" (change)=\"$event ? SelectionUtilities.masterToggle(selection, dataSource) : null\" [checked]=\"selection.hasValue() && SelectionUtilities.isAllSelected(selection, dataSource)\" [indeterminate]=\"selection.hasValue() && !SelectionUtilities.isAllSelected(selection, dataSource)\"></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(entity) : null\" [checked]=\"selection.isSelected(entity)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadata.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell class=\"entity\" *matCellDef=\"let entity\">\n {{getDisplayColumnValue(entity, dCol)}}\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n\n <div class=\"array-error\" *ngIf=\"metadata.required && !dataSource.data.length\">\n {{metadata.missingErrorMessage}}\n </div>\n</div>", styles: [".mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}mat-form-field{width:100%}.buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}.elevation-container{border-radius:5px;padding:15px;margin-bottom:15px;margin-top:15px}.array-headline{padding-bottom:10px}mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.mat-column-select{flex:0 0 75px}.array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i7.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i7.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i7.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i7.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }] });
46
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.3", ngImport: i0, type: ArrayDateRangeInputComponent, decorators: [{
47
- type: Component,
48
- args: [{ selector: 'array-date-range-input', template: "<div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadata.displayName}}</b>\n </div>\n <div *ngIf=\"!isReadOnly\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n \n <mat-date-range-input [rangePicker]=\"picker\" [required]=\"metadata.required(entity)\" [dateFilter]=\"metadata.filter ? metadata.filter : DateUtilities.defaultDateFilter\">\n <input matStartDate\n [(ngModel)]=\"dateRangeStart\"\n [name]=\"key.toString() + 'start'\"\n #startModel=\"ngModel\"\n [required]=\"metadata.required(entity)\"\n [min]=\"metadata.minStart ? metadata.minStart(input?.start) : undefined\"\n [max]=\"metadata.maxStart ? metadata.maxStart(input?.start) : undefined\"\n [placeholder]=\"metadata.placeholderStart\"\n >\n <input matEndDate\n [(ngModel)]=\"dateRangeEnd\"\n [name]=\"key.toString() + 'end'\"\n #endModel=\"ngModel\"\n [required]=\"metadata.required(entity)\"\n [min]=\"metadata.minEnd ? metadata.minEnd(input?.end) : undefined\"\n [max]=\"metadata.maxEnd ? metadata.maxEnd(input?.end) : undefined\"\n [placeholder]=\"metadata.placeholderEnd\"\n >\n </mat-date-range-input>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n \n <mat-error *ngIf=\"startModel.errors\">{{getValidationErrorMessage(startModel)}}</mat-error>\n <mat-error *ngIf=\"!startModel.errors && endModel.errors\">{{getValidationErrorMessage(endModel)}}</mat-error>\n </mat-form-field>\n \n <div class=\"buttons\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"startModel.errors || endModel.errors\"\n (click)=\"addDateRange()\">\n {{metadata.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!selection.selected.length\"\n (click)=\"remove()\">\n {{metadata.removeButtonLabel}}\n </button>\n </div>\n </div>\n\n <mat-table [dataSource]=\"dataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox [disabled]=\"!dataSource.data.length\" (change)=\"$event ? SelectionUtilities.masterToggle(selection, dataSource) : null\" [checked]=\"selection.hasValue() && SelectionUtilities.isAllSelected(selection, dataSource)\" [indeterminate]=\"selection.hasValue() && !SelectionUtilities.isAllSelected(selection, dataSource)\"></mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(entity) : null\" [checked]=\"selection.isSelected(entity)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadata.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell class=\"entity\" *matCellDef=\"let entity\">\n {{getDisplayColumnValue(entity, dCol)}}\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns\"></mat-row>\n </mat-table>\n\n <div class=\"array-error\" *ngIf=\"metadata.required && !dataSource.data.length\">\n {{metadata.missingErrorMessage}}\n </div>\n</div>", styles: [".mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}mat-form-field{width:100%}.buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}.elevation-container{border-radius:5px;padding:15px;margin-bottom:15px;margin-top:15px}.array-headline{padding-bottom:10px}mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.mat-column-select{flex:0 0 75px}.array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}\n"] }]
49
- }] });
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2FycmF5L2FycmF5LWRhdGUtcmFuZ2UtaW5wdXQvYXJyYXktZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2FycmF5L2FycmF5LWRhdGUtcmFuZ2UtaW5wdXQvYXJyYXktZGF0ZS1yYW5nZS1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUlsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7OztBQVEzRCxNQUFNLE9BQU8sNEJBQ1QsU0FBUSxtQkFBMkU7SUFQdkY7O1FBU0ksa0JBQWEsR0FBeUIsYUFBYSxDQUFDO0tBb0N2RDtJQS9CWSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDVCxLQUFLLEVBQUUsU0FBNEI7WUFDbkMsR0FBRyxFQUFFLFNBQTRCO1lBQ2pDLE1BQU0sRUFBRSxTQUFTO1NBQ3BCLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1IsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLE1BQU0sTUFBTSxHQUFXLGFBQWEsQ0FBQyxlQUFlLENBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUNkO0lBQ0wsQ0FBQztJQUVrQixVQUFVO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO0lBQ2xDLENBQUM7O3lIQXRDUSw0QkFBNEI7NkdBQTVCLDRCQUE0QixxRkNkekMsbS9IQTRFTTsyRkQ5RE8sNEJBQTRCO2tCQU54QyxTQUFTOytCQUVJLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGpzZG9jL3JlcXVpcmUtanNkb2MgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSB9IGZyb20gJy4uLy4uLy4uLy4uL2NsYXNzZXMvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvZGF0ZS9kYXRlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IERhdGVVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXRpZXMvZGF0ZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgQXJyYXlUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2FycmF5LXRhYmxlLmNsYXNzJztcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ2FycmF5LWRhdGUtcmFuZ2UtaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9hcnJheS1kYXRlLXJhbmdlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hcnJheS1kYXRlLXJhbmdlLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQXJyYXlEYXRlUmFuZ2VJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+XG4gICAgZXh0ZW5kcyBBcnJheVRhYmxlQ29tcG9uZW50PERhdGVSYW5nZSwgRW50aXR5VHlwZSwgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRT4gaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgRGF0ZVV0aWxpdGllczogdHlwZW9mIERhdGVVdGlsaXRpZXMgPSBEYXRlVXRpbGl0aWVzO1xuXG4gICAgZGF0ZVJhbmdlU3RhcnQ/OiBEYXRlO1xuICAgIGRhdGVSYW5nZUVuZD86IERhdGU7XG5cbiAgICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBEYXRlLFxuICAgICAgICAgICAgZW5kOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBEYXRlLFxuICAgICAgICAgICAgdmFsdWVzOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgRGF0ZVJhbmdlIHRvIHRoZSBhcnJheS5cbiAgICAgKi9cbiAgICBhZGREYXRlUmFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0ICYmIHRoaXMuZGF0ZVJhbmdlU3RhcnQgJiYgdGhpcy5kYXRlUmFuZ2VFbmQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuc3RhcnQgPSBuZXcgRGF0ZSh0aGlzLmRhdGVSYW5nZVN0YXJ0KTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQuZW5kID0gbmV3IERhdGUodGhpcy5kYXRlUmFuZ2VFbmQpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzOiBEYXRlW10gPSBEYXRlVXRpbGl0aWVzLmdldERhdGVzQmV0d2VlbihcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0LnN0YXJ0LFxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQuZW5kLFxuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGEuZmlsdGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5pbnB1dC52YWx1ZXMgPSB2YWx1ZXMubGVuZ3RoID8gdmFsdWVzIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5hZGQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZXNldElucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRhdGVSYW5nZVN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRhdGVSYW5nZUVuZCA9IHVuZGVmaW5lZDtcbiAgICB9XG59IiwiPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggZWxldmF0aW9uLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJhcnJheS1oZWFkbGluZVwiPlxuICAgICAgICA8Yj57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L2I+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIiFpc1JlYWRPbmx5XCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxtYXQtZGF0ZS1yYW5nZS1pbnB1dCBbcmFuZ2VQaWNrZXJdPVwicGlja2VyXCIgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIiBbZGF0ZUZpbHRlcl09XCJtZXRhZGF0YS5maWx0ZXIgPyBtZXRhZGF0YS5maWx0ZXIgOiBEYXRlVXRpbGl0aWVzLmRlZmF1bHREYXRlRmlsdGVyXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdFN0YXJ0RGF0ZVxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGVSYW5nZVN0YXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwia2V5LnRvU3RyaW5nKCkgKyAnc3RhcnQnXCJcbiAgICAgICAgICAgICAgICAgICAgI3N0YXJ0TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1ldGFkYXRhLm1pblN0YXJ0ID8gbWV0YWRhdGEubWluU3RhcnQoaW5wdXQ/LnN0YXJ0KSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWV0YWRhdGEubWF4U3RhcnQgPyBtZXRhZGF0YS5tYXhTdGFydChpbnB1dD8uc3RhcnQpIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1ldGFkYXRhLnBsYWNlaG9sZGVyU3RhcnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0RW5kRGF0ZVxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGVSYW5nZUVuZFwiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImtleS50b1N0cmluZygpICsgJ2VuZCdcIlxuICAgICAgICAgICAgICAgICAgICAjZW5kTW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1ldGFkYXRhLm1pbkVuZCA/IG1ldGFkYXRhLm1pbkVuZChpbnB1dD8uZW5kKSA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWV0YWRhdGEubWF4RW5kID8gbWV0YWRhdGEubWF4RW5kKGlucHV0Py5lbmQpIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1ldGFkYXRhLnBsYWNlaG9sZGVyRW5kXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L21hdC1kYXRlLXJhbmdlLWlucHV0PlxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgIDxtYXQtZGF0ZS1yYW5nZS1waWNrZXIgI3BpY2tlcj48L21hdC1kYXRlLXJhbmdlLXBpY2tlcj5cbiAgICBcbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJzdGFydE1vZGVsLmVycm9yc1wiPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShzdGFydE1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiIXN0YXJ0TW9kZWwuZXJyb3JzICYmIGVuZE1vZGVsLmVycm9yc1wiPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShlbmRNb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICBcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInN0YXJ0TW9kZWwuZXJyb3JzIHx8IGVuZE1vZGVsLmVycm9yc1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZERhdGVSYW5nZSgpXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YS5hZGRCdXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlKClcIj5cbiAgICAgICAgICAgICAgICB7e21ldGFkYXRhLnJlbW92ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiPlxuICAgICAgICA8IS0tIHNlbGVjdCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2Rpc2FibGVkXT1cIiFkYXRhU291cmNlLmRhdGEubGVuZ3RoXCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBTZWxlY3Rpb25VdGlsaXRpZXMubWFzdGVyVG9nZ2xlKHNlbGVjdGlvbiwgZGF0YVNvdXJjZSkgOiBudWxsXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgU2VsZWN0aW9uVXRpbGl0aWVzLmlzQWxsU2VsZWN0ZWQoc2VsZWN0aW9uLCBkYXRhU291cmNlKVwiIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFTZWxlY3Rpb25VdGlsaXRpZXMuaXNBbGxTZWxlY3RlZChzZWxlY3Rpb24sIGRhdGFTb3VyY2UpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUoZW50aXR5KSA6IG51bGxcIiBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChlbnRpdHkpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBtZXRhZGF0YS5kaXNwbGF5Q29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5kaXNwbGF5TmFtZVwiPlxuICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgICAgICB7e2RDb2wuZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICA8bWF0LWNlbGwgY2xhc3M9XCJlbnRpdHlcIiAqbWF0Q2VsbERlZj1cImxldCBlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICB7e2dldERpc3BsYXlDb2x1bW5WYWx1ZShlbnRpdHksIGRDb2wpfX1cbiAgICAgICAgICAgIDwvbWF0LWNlbGw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgICAgICA8bWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L21hdC1oZWFkZXItcm93PlxuICAgICAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvbWF0LXJvdz5cbiAgICA8L21hdC10YWJsZT5cblxuICAgIDxkaXYgY2xhc3M9XCJhcnJheS1lcnJvclwiICpuZ0lmPVwibWV0YWRhdGEucmVxdWlyZWQgJiYgIWRhdGFTb3VyY2UuZGF0YS5sZW5ndGhcIj5cbiAgICAgICAge3ttZXRhZGF0YS5taXNzaW5nRXJyb3JNZXNzYWdlfX1cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==