@ecodev/natural 62.1.2 → 63.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 (183) hide show
  1. package/fesm2022/ecodev-natural-vanilla.mjs +1193 -0
  2. package/fesm2022/ecodev-natural-vanilla.mjs.map +1 -0
  3. package/fesm2022/ecodev-natural.mjs +436 -425
  4. package/fesm2022/ecodev-natural.mjs.map +1 -1
  5. package/lib/classes/network-activity.service.d.ts +54 -0
  6. package/lib/classes/validators.d.ts +1 -1
  7. package/lib/modules/columns-picker/columns-picker.component.d.ts +2 -2
  8. package/lib/modules/common/services/seo.provider.d.ts +2 -2
  9. package/lib/modules/dropdown-components/type-select/type-select.component.d.ts +1 -1
  10. package/lib/modules/file/abstract-file.d.ts +6 -3
  11. package/lib/modules/file/component/file.component.d.ts +2 -2
  12. package/lib/modules/file/file-drop.directive.d.ts +2 -3
  13. package/lib/modules/fixed-button-detail/fixed-button-detail.component.d.ts +2 -3
  14. package/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.d.ts +3 -3
  15. package/lib/modules/icon/icon.module.d.ts +2 -2
  16. package/lib/modules/panels/panels.service.d.ts +1 -2
  17. package/lib/modules/relations/relations.component.d.ts +3 -3
  18. package/lib/modules/search/dropdown-container/dropdown-container.component.d.ts +2 -3
  19. package/lib/modules/search/group/group.component.d.ts +2 -3
  20. package/lib/modules/search/input/input.component.d.ts +5 -5
  21. package/lib/modules/search/search/search.component.d.ts +2 -2
  22. package/lib/modules/select/abstract-select.component.d.ts +3 -3
  23. package/lib/modules/select/select/select.component.d.ts +1 -1
  24. package/lib/modules/sidenav/sidenav-container/sidenav-container.component.d.ts +1 -1
  25. package/lib/modules/table-button/table-button.component.d.ts +4 -2
  26. package/package.json +16 -14
  27. package/public-api.d.ts +1 -0
  28. package/src/lib/_natural.theme.scss +1 -2
  29. package/vanilla/index.d.ts +5 -0
  30. package/vanilla/package.json +3 -0
  31. package/vanilla/public-api.d.ts +11 -0
  32. package/vanilla/src/lib/classes/crypto.d.ts +8 -0
  33. package/vanilla/src/lib/classes/data-source.d.ts +32 -0
  34. package/vanilla/src/lib/classes/query-variable-manager-utils.d.ts +2 -0
  35. package/vanilla/src/lib/classes/query-variable-manager.d.ts +91 -0
  36. package/vanilla/src/lib/classes/signing.d.ts +7 -0
  37. package/vanilla/src/lib/classes/utility.d.ts +77 -0
  38. package/vanilla/src/lib/modules/search/classes/graphql-doctrine.types.d.ts +83 -0
  39. package/vanilla/src/lib/modules/search/classes/utils.d.ts +17 -0
  40. package/vanilla/src/lib/modules/search/types/dropdown-component.d.ts +20 -0
  41. package/vanilla/src/lib/modules/search/types/facet.d.ts +75 -0
  42. package/vanilla/src/lib/modules/search/types/values.d.ts +32 -0
  43. package/vanilla/src/lib/services/abstract-model.service.d.ts +244 -0
  44. package/vanilla/src/lib/services/debounce.service.d.ts +52 -0
  45. package/vanilla/src/lib/types/types.d.ts +100 -0
  46. package/esm2022/ecodev-natural.mjs +0 -5
  47. package/esm2022/lib/classes/abstract-detail.mjs +0 -229
  48. package/esm2022/lib/classes/abstract-editable-list.mjs +0 -99
  49. package/esm2022/lib/classes/abstract-list.mjs +0 -461
  50. package/esm2022/lib/classes/abstract-navigable-list.mjs +0 -133
  51. package/esm2022/lib/classes/apollo-utils.mjs +0 -59
  52. package/esm2022/lib/classes/crypto.mjs +0 -23
  53. package/esm2022/lib/classes/cumulative-changes.mjs +0 -50
  54. package/esm2022/lib/classes/data-source.mjs +0 -71
  55. package/esm2022/lib/classes/providers.mjs +0 -13
  56. package/esm2022/lib/classes/query-variable-manager-utils.mjs +0 -14
  57. package/esm2022/lib/classes/query-variable-manager.mjs +0 -172
  58. package/esm2022/lib/classes/rxjs.mjs +0 -54
  59. package/esm2022/lib/classes/signing.mjs +0 -38
  60. package/esm2022/lib/classes/tld.mjs +0 -1476
  61. package/esm2022/lib/classes/utility.mjs +0 -234
  62. package/esm2022/lib/classes/validators.mjs +0 -179
  63. package/esm2022/lib/directives/http-prefix.directive.mjs +0 -47
  64. package/esm2022/lib/modules/alert/alert.service.mjs +0 -53
  65. package/esm2022/lib/modules/alert/confirm.component.mjs +0 -16
  66. package/esm2022/lib/modules/alert/public-api.mjs +0 -6
  67. package/esm2022/lib/modules/avatar/component/avatar.component.mjs +0 -203
  68. package/esm2022/lib/modules/avatar/public-api.mjs +0 -6
  69. package/esm2022/lib/modules/avatar/service/avatar.service.mjs +0 -63
  70. package/esm2022/lib/modules/avatar/sources/gravatar.mjs +0 -29
  71. package/esm2022/lib/modules/avatar/sources/image.mjs +0 -13
  72. package/esm2022/lib/modules/avatar/sources/initials.mjs +0 -39
  73. package/esm2022/lib/modules/avatar/sources/source.mjs +0 -16
  74. package/esm2022/lib/modules/columns-picker/columns-picker.component.mjs +0 -145
  75. package/esm2022/lib/modules/columns-picker/public-api.mjs +0 -5
  76. package/esm2022/lib/modules/columns-picker/types.mjs +0 -2
  77. package/esm2022/lib/modules/common/directives/background-density.directive.mjs +0 -63
  78. package/esm2022/lib/modules/common/directives/linkable-tab.directive.mjs +0 -93
  79. package/esm2022/lib/modules/common/directives/src-density.directive.mjs +0 -72
  80. package/esm2022/lib/modules/common/pipes/capitalize.pipe.mjs +0 -24
  81. package/esm2022/lib/modules/common/pipes/ellipsis.pipe.mjs +0 -17
  82. package/esm2022/lib/modules/common/pipes/enum.pipe.mjs +0 -24
  83. package/esm2022/lib/modules/common/pipes/time-ago.pipe.mjs +0 -140
  84. package/esm2022/lib/modules/common/public-api.mjs +0 -14
  85. package/esm2022/lib/modules/common/services/memory-storage.mjs +0 -110
  86. package/esm2022/lib/modules/common/services/seo.provider.mjs +0 -23
  87. package/esm2022/lib/modules/common/services/seo.service.mjs +0 -235
  88. package/esm2022/lib/modules/detail-header/detail-header.component.mjs +0 -84
  89. package/esm2022/lib/modules/detail-header/public-api.mjs +0 -5
  90. package/esm2022/lib/modules/dialog-trigger/dialog-trigger.component.mjs +0 -72
  91. package/esm2022/lib/modules/dialog-trigger/public-api.mjs +0 -5
  92. package/esm2022/lib/modules/dropdown-components/abstract-association-select-component.directive.mjs +0 -100
  93. package/esm2022/lib/modules/dropdown-components/public-api.mjs +0 -14
  94. package/esm2022/lib/modules/dropdown-components/type-boolean/type-boolean.component.mjs +0 -39
  95. package/esm2022/lib/modules/dropdown-components/type-date/type-date.component.mjs +0 -173
  96. package/esm2022/lib/modules/dropdown-components/type-date-range/type-date-range.component.mjs +0 -134
  97. package/esm2022/lib/modules/dropdown-components/type-hierarchic-selector/type-hierarchic-selector.component.mjs +0 -80
  98. package/esm2022/lib/modules/dropdown-components/type-natural-select/type-natural-select.component.mjs +0 -48
  99. package/esm2022/lib/modules/dropdown-components/type-number/type-number.component.mjs +0 -110
  100. package/esm2022/lib/modules/dropdown-components/type-options/type-options.component.mjs +0 -64
  101. package/esm2022/lib/modules/dropdown-components/type-select/type-select.component.mjs +0 -175
  102. package/esm2022/lib/modules/dropdown-components/type-text/type-text.component.mjs +0 -62
  103. package/esm2022/lib/modules/dropdown-components/types.mjs +0 -41
  104. package/esm2022/lib/modules/dropdown-components/utils.mjs +0 -35
  105. package/esm2022/lib/modules/file/abstract-file.mjs +0 -230
  106. package/esm2022/lib/modules/file/component/file.component.mjs +0 -172
  107. package/esm2022/lib/modules/file/file-drop.directive.mjs +0 -111
  108. package/esm2022/lib/modules/file/file-select.directive.mjs +0 -26
  109. package/esm2022/lib/modules/file/file.service.mjs +0 -43
  110. package/esm2022/lib/modules/file/public-api.mjs +0 -9
  111. package/esm2022/lib/modules/file/types.mjs +0 -2
  112. package/esm2022/lib/modules/file/utils.mjs +0 -129
  113. package/esm2022/lib/modules/fixed-button/fixed-button.component.mjs +0 -30
  114. package/esm2022/lib/modules/fixed-button/public-api.mjs +0 -5
  115. package/esm2022/lib/modules/fixed-button-detail/fixed-button-detail.component.mjs +0 -56
  116. package/esm2022/lib/modules/fixed-button-detail/public-api.mjs +0 -5
  117. package/esm2022/lib/modules/hierarchic-selector/classes/flat-node.mjs +0 -18
  118. package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-configuration.mjs +0 -2
  119. package/esm2022/lib/modules/hierarchic-selector/classes/hierarchic-filters-configuration.mjs +0 -2
  120. package/esm2022/lib/modules/hierarchic-selector/classes/model-node.mjs +0 -14
  121. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.component.mjs +0 -398
  122. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector/hierarchic-selector.service.mjs +0 -243
  123. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.component.mjs +0 -38
  124. package/esm2022/lib/modules/hierarchic-selector/hierarchic-selector-dialog/hierarchic-selector-dialog.service.mjs +0 -22
  125. package/esm2022/lib/modules/hierarchic-selector/public-api.mjs +0 -10
  126. package/esm2022/lib/modules/icon/icon.directive.mjs +0 -96
  127. package/esm2022/lib/modules/icon/icon.module.mjs +0 -33
  128. package/esm2022/lib/modules/icon/public-api.mjs +0 -6
  129. package/esm2022/lib/modules/logger/error-handler.mjs +0 -87
  130. package/esm2022/lib/modules/logger/error.module.mjs +0 -22
  131. package/esm2022/lib/modules/logger/public-api.mjs +0 -6
  132. package/esm2022/lib/modules/matomo/matomo.service.mjs +0 -96
  133. package/esm2022/lib/modules/matomo/public-api.mjs +0 -5
  134. package/esm2022/lib/modules/panels/abstract-panel.mjs +0 -76
  135. package/esm2022/lib/modules/panels/fallback-if-no-opened-panels.urlmatcher.mjs +0 -12
  136. package/esm2022/lib/modules/panels/panels.component.mjs +0 -27
  137. package/esm2022/lib/modules/panels/panels.module.mjs +0 -10
  138. package/esm2022/lib/modules/panels/panels.service.mjs +0 -329
  139. package/esm2022/lib/modules/panels/panels.urlmatcher.mjs +0 -75
  140. package/esm2022/lib/modules/panels/public-api.mjs +0 -11
  141. package/esm2022/lib/modules/panels/types.mjs +0 -3
  142. package/esm2022/lib/modules/relations/public-api.mjs +0 -5
  143. package/esm2022/lib/modules/relations/relations.component.mjs +0 -254
  144. package/esm2022/lib/modules/search/classes/graphql-doctrine.mjs +0 -111
  145. package/esm2022/lib/modules/search/classes/graphql-doctrine.types.mjs +0 -14
  146. package/esm2022/lib/modules/search/classes/transformers.mjs +0 -142
  147. package/esm2022/lib/modules/search/classes/url.mjs +0 -53
  148. package/esm2022/lib/modules/search/classes/utils.mjs +0 -25
  149. package/esm2022/lib/modules/search/dropdown-container/dropdown-container-animations.mjs +0 -44
  150. package/esm2022/lib/modules/search/dropdown-container/dropdown-container.component.mjs +0 -87
  151. package/esm2022/lib/modules/search/dropdown-container/dropdown-ref.mjs +0 -24
  152. package/esm2022/lib/modules/search/dropdown-container/dropdown.service.mjs +0 -90
  153. package/esm2022/lib/modules/search/facet-selector/facet-selector.component.mjs +0 -45
  154. package/esm2022/lib/modules/search/group/group.component.mjs +0 -53
  155. package/esm2022/lib/modules/search/input/input.component.mjs +0 -365
  156. package/esm2022/lib/modules/search/public-api.mjs +0 -7
  157. package/esm2022/lib/modules/search/search/search.component.mjs +0 -102
  158. package/esm2022/lib/modules/search/types/dropdown-component.mjs +0 -2
  159. package/esm2022/lib/modules/search/types/facet.mjs +0 -2
  160. package/esm2022/lib/modules/search/types/values.mjs +0 -2
  161. package/esm2022/lib/modules/select/abstract-select.component.mjs +0 -232
  162. package/esm2022/lib/modules/select/public-api.mjs +0 -7
  163. package/esm2022/lib/modules/select/select/select.component.mjs +0 -310
  164. package/esm2022/lib/modules/select/select-enum/select-enum.component.mjs +0 -57
  165. package/esm2022/lib/modules/select/select-hierarchic/select-hierarchic.component.mjs +0 -155
  166. package/esm2022/lib/modules/sidenav/public-api.mjs +0 -9
  167. package/esm2022/lib/modules/sidenav/sidenav/sidenav.component.mjs +0 -15
  168. package/esm2022/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +0 -90
  169. package/esm2022/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +0 -11
  170. package/esm2022/lib/modules/sidenav/sidenav-stack.service.mjs +0 -50
  171. package/esm2022/lib/modules/sidenav/sidenav.service.mjs +0 -196
  172. package/esm2022/lib/modules/stamp/public-api.mjs +0 -5
  173. package/esm2022/lib/modules/stamp/stamp.component.mjs +0 -23
  174. package/esm2022/lib/modules/table-button/public-api.mjs +0 -5
  175. package/esm2022/lib/modules/table-button/table-button.component.mjs +0 -78
  176. package/esm2022/lib/services/abstract-model.service.mjs +0 -526
  177. package/esm2022/lib/services/debounce.service.mjs +0 -149
  178. package/esm2022/lib/services/enum.service.mjs +0 -64
  179. package/esm2022/lib/services/link-mutation.service.mjs +0 -154
  180. package/esm2022/lib/services/persistence.service.mjs +0 -115
  181. package/esm2022/lib/services/swiss-parsing-date-adapter.service.mjs +0 -63
  182. package/esm2022/lib/types/types.mjs +0 -2
  183. package/esm2022/public-api.mjs +0 -46
@@ -0,0 +1,52 @@
1
+ import { Observable } from 'rxjs';
2
+ import { UntypedModelService } from '../types/types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Debounce subscriptions to update mutations, with the possibility to cancel one, flush one, or flush all of them.
6
+ *
7
+ * `modelService` is also used to separate objects by their types. So User with ID 1 is not confused with Product with ID 1.
8
+ *
9
+ * `id` must be the ID of the object that will be updated.
10
+ */
11
+ export declare class NaturalDebounceService {
12
+ /**
13
+ * Stores the debounced update function
14
+ */
15
+ private readonly allDebouncedUpdateCache;
16
+ /**
17
+ * Debounce the `modelService.updateNow()` mutation for a short time. If called multiple times with the same
18
+ * modelService and id, it will postpone the subscription to the mutation.
19
+ *
20
+ * All input variables for the same object (same service and ID) will be cumulated over time. So it is possible
21
+ * to update `field1`, then `field2`, and they will be batched into a single XHR including `field1` and `field2`.
22
+ *
23
+ * But it will always keep the same debouncing timeline.
24
+ */
25
+ debounce<T extends UntypedModelService>(modelService: UntypedModelService, id: string, object: Parameters<T['updateNow']>[0]): ReturnType<T['updateNow']>;
26
+ cancelOne(modelService: UntypedModelService, id: string): void;
27
+ /**
28
+ * Immediately execute the pending update, if any.
29
+ *
30
+ * It should typically be called before resolving the object, to mutate it before re-fetching it from server.
31
+ *
32
+ * The returned observable will complete when the update completes, even if it errors.
33
+ */
34
+ flushOne(modelService: UntypedModelService, id: string): Observable<void>;
35
+ /**
36
+ * Immediately execute all pending updates.
37
+ *
38
+ * It should typically be called before login out.
39
+ *
40
+ * The returned observable will complete when all updates complete, even if some of them error.
41
+ */
42
+ flush(): Observable<void>;
43
+ private internalFlush;
44
+ /**
45
+ * Count of pending updates
46
+ */
47
+ get count(): number;
48
+ private getMap;
49
+ private delete;
50
+ static ɵfac: i0.ɵɵFactoryDeclaration<NaturalDebounceService, never>;
51
+ static ɵprov: i0.ɵɵInjectableDeclaration<NaturalDebounceService>;
52
+ }
@@ -0,0 +1,100 @@
1
+ import { PaginatedData } from '../classes/data-source';
2
+ import { NaturalAbstractModelService, VariablesWithInput } from '../services/abstract-model.service';
3
+ import { QueryVariables } from '../classes/query-variable-manager';
4
+ import { ObservedValueOf } from 'rxjs';
5
+ import { ResolveData } from '@angular/router';
6
+ /**
7
+ * An object literal with any keys and values
8
+ */
9
+ export type Literal = Record<string, any>;
10
+ /**
11
+ * An object with either a name or a fullName (or maybe both)
12
+ */
13
+ export type NameOrFullName = {
14
+ id: string;
15
+ name: string;
16
+ fullName?: string;
17
+ } | {
18
+ id: string;
19
+ name?: string;
20
+ fullName: string;
21
+ };
22
+ /**
23
+ * Extract the Tone type from a NaturalAbstractModelService
24
+ */
25
+ export type ExtractTone<P> = P extends NaturalAbstractModelService<infer Tone, any, any, any, any, any, any, any, any, any> ? Tone : never;
26
+ /**
27
+ * Extract the Vone type from a NaturalAbstractModelService
28
+ */
29
+ export type ExtractVone<P> = P extends NaturalAbstractModelService<any, infer Vone, any, any, any, any, any, any, any, any> ? Vone extends {
30
+ id: string;
31
+ } ? Vone : never : never;
32
+ /**
33
+ * Extract the Tall type from a NaturalAbstractModelService
34
+ */
35
+ export type ExtractTall<P> = P extends NaturalAbstractModelService<any, any, infer Tall, any, any, any, any, any, any, any> ? Tall extends PaginatedData<Literal> ? Tall : never : never;
36
+ /**
37
+ * Extract the TallOne type for a single item coming from a list of items from a NaturalAbstractModelService
38
+ */
39
+ export type ExtractTallOne<P> = P extends NaturalAbstractModelService<any, any, PaginatedData<infer TallOne extends Literal>, any, any, any, any, any, any, any> ? TallOne extends Literal ? TallOne : never : never;
40
+ /**
41
+ * Extract the Vall type from a NaturalAbstractModelService
42
+ */
43
+ export type ExtractVall<P> = P extends NaturalAbstractModelService<any, any, any, infer Vall, any, any, any, any, any, any> ? Vall extends QueryVariables ? Vall : never : never;
44
+ /**
45
+ * Extract the Tcreate type from a NaturalAbstractModelService
46
+ */
47
+ export type ExtractTcreate<P> = P extends NaturalAbstractModelService<any, any, any, any, infer Tcreate, any, any, any, any, any> ? Tcreate : never;
48
+ /**
49
+ * Extract the Vcreate type from a NaturalAbstractModelService
50
+ */
51
+ export type ExtractVcreate<P> = P extends NaturalAbstractModelService<any, any, any, any, any, infer Vcreate, any, any, any, any> ? Vcreate extends VariablesWithInput ? Vcreate : never : never;
52
+ /**
53
+ * Extract the Tupdate type from a NaturalAbstractModelService
54
+ */
55
+ export type ExtractTupdate<P> = P extends NaturalAbstractModelService<any, any, any, any, any, any, infer Tupdate, any, any, any> ? Tupdate : never;
56
+ /**
57
+ * Extract the Vupdate type from a NaturalAbstractModelService
58
+ */
59
+ export type ExtractVupdate<P> = P extends NaturalAbstractModelService<any, any, any, any, any, any, any, infer Vupdate, any, any> ? Vupdate extends {
60
+ id: string;
61
+ input: Literal;
62
+ } ? Vupdate : never : never;
63
+ /**
64
+ * Extract the Tdelete type from a NaturalAbstractModelService
65
+ */
66
+ export type ExtractTdelete<P> = P extends NaturalAbstractModelService<any, any, any, any, any, any, any, any, infer Tdelete, any> ? Tdelete : never;
67
+ /**
68
+ * Extract the Vdelete type from a NaturalAbstractModelService
69
+ */
70
+ export type ExtractVdelete<P> = P extends NaturalAbstractModelService<any, any, any, any, any, any, any, any, any, infer Vdelete> ? Vdelete extends {
71
+ ids: string[];
72
+ } ? Vdelete : never : never;
73
+ /**
74
+ * Extract the resolve type from a NaturalAbstractModelService
75
+ */
76
+ export type ExtractResolve<P> = P extends NaturalAbstractModelService<any, any, any, any, any, any, any, any, any, any> ? ObservedValueOf<ObservedValueOf<ReturnType<P['resolve']>>> : never;
77
+ /**
78
+ * This should be avoided if possible, and instead use a more precise type with some constraints on it to ensure that the model
79
+ * service is able to fulfill its requirements.
80
+ */
81
+ export type UntypedModelService = NaturalAbstractModelService<any, any, any, any, any, any, any, any, any, any>;
82
+ /**
83
+ * Returns the resolved data type, as available in components, from the given resolvers
84
+ *
85
+ * Eg:
86
+ *
87
+ * ```ts
88
+ * const actionResolvers = {
89
+ * model: resolveAction,
90
+ * statuses: () => inject(NaturalEnumService).get('Status'),
91
+ * } as const;
92
+ *
93
+ * // In action.component.ts
94
+ * const data: ResolvedData<typeof actionResolvers>;
95
+ * data.statuses.forEach(...);
96
+ * ```
97
+ */
98
+ export type ResolvedData<T extends ResolveData> = {
99
+ readonly [KeyType in keyof Pick<T, keyof T>]: ObservedValueOf<ReturnType<Pick<T, keyof T>[KeyType]>>;
100
+ };
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNvZGV2LW5hdHVyYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9lY29kZXYtbmF0dXJhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -1,229 +0,0 @@
1
- import { Directive, inject } from '@angular/core';
2
- import { UntypedFormGroup } from '@angular/forms';
3
- import { ActivatedRoute, Router } from '@angular/router';
4
- import { kebabCase } from 'lodash-es';
5
- import { NaturalAlertService } from '../modules/alert/alert.service';
6
- import { NaturalAbstractPanel } from '../modules/panels/abstract-panel';
7
- import { EMPTY, endWith, finalize, last, Observable, switchMap, tap } from 'rxjs';
8
- import { ifValid, validateAllFormControls } from './validators';
9
- import { CumulativeChanges } from './cumulative-changes';
10
- import { MAT_DIALOG_DATA } from '@angular/material/dialog';
11
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
12
- import * as i0 from "@angular/core";
13
- function isNaturalDialogTriggerProvidedData(dialogData) {
14
- return (!!dialogData &&
15
- typeof dialogData === 'object' &&
16
- 'activatedRoute' in dialogData &&
17
- dialogData.activatedRoute instanceof ActivatedRoute);
18
- }
19
- // @dynamic
20
- export class NaturalAbstractDetail extends NaturalAbstractPanel {
21
- key;
22
- service;
23
- /**
24
- * Data retrieved by the server via route resolvers.
25
- *
26
- * The key `model` is special. It is readonly and represents the model being updated
27
- * as it exists on server. The value is kept up to date when Apollo mutates it on server.
28
- *
29
- * The only time when `model` is not readonly is during creation. Only then can we modify the model values directly.
30
- *
31
- * Other keys, if present, are whatever is returned from route resolvers as-is.
32
- */
33
- data;
34
- /**
35
- * Form that manages the data from the controller
36
- */
37
- form = new UntypedFormGroup({});
38
- /**
39
- * Show / hides the bottom fab button (mostly to hide it when we are on other tabs where semantic of button can conflict with ...
40
- * semantic of data on other tab, like relations that list other objects)
41
- */
42
- showFabButton = true;
43
- alertService = inject(NaturalAlertService);
44
- router = inject(Router);
45
- route = inject(ActivatedRoute);
46
- _dialogData = inject(MAT_DIALOG_DATA, { optional: true });
47
- /**
48
- * Once set, this must not change anymore, especially not right after the creation mutation,
49
- * so the form does not switch from creation mode to update mode without an actual reload of
50
- * model from DB (by navigating to update page).
51
- */
52
- _isUpdatePage = false;
53
- changes = new CumulativeChanges();
54
- constructor(key, service) {
55
- super();
56
- this.key = key;
57
- this.service = service;
58
- this.data = {
59
- model: this.service.getDefaultForServer(),
60
- };
61
- }
62
- /**
63
- * You probably should not override this method. Instead, consider overriding `initForm()`.
64
- */
65
- ngOnInit() {
66
- if (this.isPanel) {
67
- this.initForm();
68
- }
69
- else {
70
- const route = isNaturalDialogTriggerProvidedData(this._dialogData)
71
- ? this._dialogData.activatedRoute
72
- : this.route;
73
- this.#subscribeToModelFromResolvedData(route);
74
- }
75
- }
76
- changeTab(index) {
77
- this.showFabButton = index === 0;
78
- }
79
- #subscribeToModelFromResolvedData(route) {
80
- let previousId = -1;
81
- route.data
82
- .pipe(switchMap(data => {
83
- if (!(data.model instanceof Observable)) {
84
- throw new Error('Resolved data must include the key `model`, and it must be an observable (usually one from Apollo).');
85
- }
86
- // Subscribe to model to know when Apollo cache is changed, so we can reflect it into `data.model`
87
- return data.model.pipe(tap((model) => {
88
- this.data = {
89
- ...data,
90
- model: model,
91
- };
92
- if (previousId !== model.id) {
93
- previousId = model.id;
94
- this.initForm();
95
- }
96
- }));
97
- }), takeUntilDestroyed(this.destroyRef))
98
- .subscribe();
99
- }
100
- /**
101
- * Returns whether `data.model` was fetched from DB, so we are on an update page, or if it is a new object
102
- * with (only) default values, so we are on a creation page.
103
- *
104
- * This should be used instead of checking `data.model.id` directly, in order to type guard and get proper typing
105
- */
106
- isUpdatePage() {
107
- return this._isUpdatePage;
108
- }
109
- /**
110
- * Update the object on the server with the values from the form fields that were modified since
111
- * the initialization, or since the previous successful update.
112
- *
113
- * Form fields that are never modified are **not** sent to the server, unless if you specify `submitAllFields`.
114
- */
115
- update(now = false, submitAllFields = false) {
116
- if (!this.isUpdatePage()) {
117
- return;
118
- }
119
- validateAllFormControls(this.form);
120
- ifValid(this.form).subscribe(() => {
121
- const newValues = this.form.getRawValue();
122
- if (submitAllFields) {
123
- this.changes.initialize({});
124
- }
125
- const toSubmit = {
126
- id: this.data.model.id,
127
- ...this.changes.differences(newValues),
128
- };
129
- const update = now ? this.service.updateNow(toSubmit) : this.service.update(toSubmit);
130
- update.subscribe(model => {
131
- this.changes.commit(newValues);
132
- this.alertService.info($localize `Mis à jour`);
133
- this.postUpdate(model);
134
- });
135
- });
136
- }
137
- create(redirect = true) {
138
- validateAllFormControls(this.form);
139
- if (!this.form.valid) {
140
- return;
141
- }
142
- const newValues = this.form.getRawValue();
143
- this.form.disable();
144
- this.service
145
- .create(newValues)
146
- .pipe(switchMap(model => {
147
- this.alertService.info($localize `Créé`);
148
- return this.postCreate(model).pipe(endWith(model), last());
149
- }), switchMap((model) => {
150
- if (redirect) {
151
- if (this.isPanel) {
152
- const oldUrl = this.router.url;
153
- const nextUrl = this.panelData?.config.params.nextRoute;
154
- const newUrl = oldUrl.replace('/new', '/' + model.id) + (nextUrl ? '/' + nextUrl : '');
155
- return this.router.navigateByUrl(newUrl); // replace /new by /123
156
- }
157
- else {
158
- const queryParams = this.route.snapshot.queryParams;
159
- return this.router.navigate(['..', model.id], { relativeTo: this.route, queryParams });
160
- }
161
- }
162
- return EMPTY;
163
- }), finalize(() => this.form.enable()))
164
- .subscribe();
165
- }
166
- /**
167
- * `confirmer` can be used to open a custom dialog, or anything else, to confirm the deletion, instead of the standard dialog
168
- */
169
- delete(redirectionRoute, confirmer) {
170
- this.form.disable();
171
- (confirmer ??
172
- this.alertService.confirm($localize `Suppression`, $localize `Voulez-vous supprimer définitivement cet élément ?`, $localize `Supprimer définitivement`))
173
- .pipe(switchMap(confirmed => {
174
- if (!confirmed || !this.isUpdatePage()) {
175
- return EMPTY;
176
- }
177
- this.preDelete(this.data.model);
178
- return this.service.delete([this.data.model]).pipe(switchMap(() => {
179
- this.alertService.info($localize `Supprimé`);
180
- if (this.isPanel) {
181
- this.panelService?.goToPenultimatePanel();
182
- return EMPTY;
183
- }
184
- else {
185
- const defaultRoute = ['../../' + kebabCase(this.key)];
186
- return this.router.navigate(redirectionRoute ? redirectionRoute : defaultRoute, {
187
- relativeTo: this.route,
188
- });
189
- }
190
- }));
191
- }), finalize(() => this.form.enable()))
192
- .subscribe();
193
- }
194
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
195
- postUpdate(model) {
196
- // noop
197
- }
198
- /**
199
- * Returns an observable that will be subscribed to immediately and the
200
- * redirect navigation will only happen after the observable completes.
201
- */
202
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
203
- postCreate(model) {
204
- return EMPTY;
205
- }
206
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
207
- preDelete(model) {
208
- // noop
209
- }
210
- /**
211
- * Initialize the form whenever it is needed.
212
- *
213
- * You should override this method, and not `ngOnInit()` if you need to customize the form. Because this will
214
- * correctly be called more than one time per component instance if needed, when the route changes. But `ngOnInit()`
215
- * will incorrectly be called exactly 1 time per component instance, even if the object changes via route navigation.
216
- */
217
- initForm() {
218
- this._isUpdatePage = !!this.data.model.id;
219
- this.form = this.service.getFormGroup(this.data.model);
220
- this.changes.initialize(this.form.getRawValue());
221
- }
222
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalAbstractDetail, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
223
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.3", type: NaturalAbstractDetail, isStandalone: true, usesInheritance: true, ngImport: i0 });
224
- }
225
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalAbstractDetail, decorators: [{
226
- type: Directive,
227
- args: [{ standalone: true }]
228
- }], ctorParameters: () => [{ type: undefined }, { type: undefined }] });
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZGV0YWlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmF0dXJhbC9zcmMvbGliL2NsYXNzZXMvYWJzdHJhY3QtZGV0YWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxjQUFjLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUd0RSxPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHOUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRXpELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOztBQVE5RCxTQUFTLGtDQUFrQyxDQUN2QyxVQUFtQjtJQUVuQixPQUFPLENBQ0gsQ0FBQyxDQUFDLFVBQVU7UUFDWixPQUFPLFVBQVUsS0FBSyxRQUFRO1FBQzlCLGdCQUFnQixJQUFJLFVBQVU7UUFDOUIsVUFBVSxDQUFDLGNBQWMsWUFBWSxjQUFjLENBQ3RELENBQUM7QUFDTixDQUFDO0FBRUQsV0FBVztB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QUMsS0FBSyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7dUdBaFJRLHFCQUFxQjsyRkFBckIscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQURqQyxTQUFTO21CQUFDLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBpbmplY3QsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1VudHlwZWRGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7a2ViYWJDYXNlfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtOYXR1cmFsQWxlcnRTZXJ2aWNlfSBmcm9tICcuLi9tb2R1bGVzL2FsZXJ0L2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHtOYXR1cmFsQWJzdHJhY3RQYW5lbH0gZnJvbSAnLi4vbW9kdWxlcy9wYW5lbHMvYWJzdHJhY3QtcGFuZWwnO1xuaW1wb3J0IHtOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2UsIFdpdGhJZH0gZnJvbSAnLi4vc2VydmljZXMvYWJzdHJhY3QtbW9kZWwuc2VydmljZSc7XG5pbXBvcnQge0V4dHJhY3RSZXNvbHZlLCBFeHRyYWN0VGNyZWF0ZSwgRXh0cmFjdFRvbmUsIEV4dHJhY3RUdXBkYXRlLCBMaXRlcmFsfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQge0VNUFRZLCBlbmRXaXRoLCBmaW5hbGl6ZSwgbGFzdCwgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwLCB0YXB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtpZlZhbGlkLCB2YWxpZGF0ZUFsbEZvcm1Db250cm9sc30gZnJvbSAnLi92YWxpZGF0b3JzJztcbmltcG9ydCB7UGFnaW5hdGVkRGF0YX0gZnJvbSAnLi9kYXRhLXNvdXJjZSc7XG5pbXBvcnQge1F1ZXJ5VmFyaWFibGVzfSBmcm9tICcuL3F1ZXJ5LXZhcmlhYmxlLW1hbmFnZXInO1xuaW1wb3J0IHtDdW11bGF0aXZlQ2hhbmdlc30gZnJvbSAnLi9jdW11bGF0aXZlLWNoYW5nZXMnO1xuaW1wb3J0IHtNQVRfRElBTE9HX0RBVEF9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQge05hdHVyYWxEaWFsb2dUcmlnZ2VyUHJvdmlkZWREYXRhfSBmcm9tICcuLi9tb2R1bGVzL2RpYWxvZy10cmlnZ2VyL2RpYWxvZy10cmlnZ2VyLmNvbXBvbmVudCc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG4vKipcbiAqIGBEYXRhYCBjb250YWlucyBpbiBgbW9kZWxgIGVpdGhlciB0aGUgbW9kZWwgZmV0Y2hlZCBmcm9tIERCIG9yIGRlZmF1bHQgdmFsdWVzICh3aXRob3V0IElEKS4gQW5kIGJlc2lkZXMgYG1vZGVsYCxcbiAqIGFueSBvdGhlciBleHRyYSBrZXlzIGRlZmluZWQgYnkgRXh0cmEuXG4gKi9cbnR5cGUgRGF0YTxUU2VydmljZSwgRXh0cmE+ID0ge21vZGVsOiB7aWQ/OiBzdHJpbmd9ICYgRXh0cmFjdFJlc29sdmU8VFNlcnZpY2U+fSAmIEV4dHJhO1xuXG5mdW5jdGlvbiBpc05hdHVyYWxEaWFsb2dUcmlnZ2VyUHJvdmlkZWREYXRhKFxuICAgIGRpYWxvZ0RhdGE6IHVua25vd24sXG4pOiBkaWFsb2dEYXRhIGlzIE5hdHVyYWxEaWFsb2dUcmlnZ2VyUHJvdmlkZWREYXRhPG5ldmVyPiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgISFkaWFsb2dEYXRhICYmXG4gICAgICAgIHR5cGVvZiBkaWFsb2dEYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAnYWN0aXZhdGVkUm91dGUnIGluIGRpYWxvZ0RhdGEgJiZcbiAgICAgICAgZGlhbG9nRGF0YS5hY3RpdmF0ZWRSb3V0ZSBpbnN0YW5jZW9mIEFjdGl2YXRlZFJvdXRlXG4gICAgKTtcbn1cblxuLy8gQGR5bmFtaWNcbkBEaXJlY3RpdmUoe3N0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxBYnN0cmFjdERldGFpbDxcbiAgICAgICAgVFNlcnZpY2UgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgICAgICAgICB7aWQ6IHN0cmluZ30sXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBQYWdpbmF0ZWREYXRhPExpdGVyYWw+LFxuICAgICAgICAgICAgUXVlcnlWYXJpYWJsZXMsXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICBhbnksXG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgYW55XG4gICAgICAgID4sXG4gICAgICAgIEV4dHJhUmVzb2x2ZSBleHRlbmRzIExpdGVyYWwgPSBSZWNvcmQ8bmV2ZXIsIG5ldmVyPixcbiAgICA+XG4gICAgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RQYW5lbFxuICAgIGltcGxlbWVudHMgT25Jbml0XG57XG4gICAgLyoqXG4gICAgICogRGF0YSByZXRyaWV2ZWQgYnkgdGhlIHNlcnZlciB2aWEgcm91dGUgcmVzb2x2ZXJzLlxuICAgICAqXG4gICAgICogVGhlIGtleSBgbW9kZWxgIGlzIHNwZWNpYWwuIEl0IGlzIHJlYWRvbmx5IGFuZCByZXByZXNlbnRzIHRoZSBtb2RlbCBiZWluZyB1cGRhdGVkXG4gICAgICogYXMgaXQgZXhpc3RzIG9uIHNlcnZlci4gVGhlIHZhbHVlIGlzIGtlcHQgdXAgdG8gZGF0ZSB3aGVuIEFwb2xsbyBtdXRhdGVzIGl0IG9uIHNlcnZlci5cbiAgICAgKlxuICAgICAqIFRoZSBvbmx5IHRpbWUgd2hlbiBgbW9kZWxgIGlzIG5vdCByZWFkb25seSBpcyBkdXJpbmcgY3JlYXRpb24uIE9ubHkgdGhlbiBjYW4gd2UgbW9kaWZ5IHRoZSBtb2RlbCB2YWx1ZXMgZGlyZWN0bHkuXG4gICAgICpcbiAgICAgKiBPdGhlciBrZXlzLCBpZiBwcmVzZW50LCBhcmUgd2hhdGV2ZXIgaXMgcmV0dXJuZWQgZnJvbSByb3V0ZSByZXNvbHZlcnMgYXMtaXMuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGRhdGE6IERhdGE8VFNlcnZpY2UsIEV4dHJhUmVzb2x2ZT47XG5cbiAgICAvKipcbiAgICAgKiBGb3JtIHRoYXQgbWFuYWdlcyB0aGUgZGF0YSBmcm9tIHRoZSBjb250cm9sbGVyXG4gICAgICovXG4gICAgcHVibGljIGZvcm06IFVudHlwZWRGb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XG5cbiAgICAvKipcbiAgICAgKiBTaG93IC8gaGlkZXMgdGhlIGJvdHRvbSBmYWIgYnV0dG9uIChtb3N0bHkgdG8gaGlkZSBpdCB3aGVuIHdlIGFyZSBvbiBvdGhlciB0YWJzIHdoZXJlIHNlbWFudGljIG9mIGJ1dHRvbiBjYW4gY29uZmxpY3Qgd2l0aCAuLi5cbiAgICAgKiBzZW1hbnRpYyBvZiBkYXRhIG9uIG90aGVyIHRhYiwgbGlrZSByZWxhdGlvbnMgdGhhdCBsaXN0IG90aGVyIG9iamVjdHMpXG4gICAgICovXG4gICAgcHVibGljIHNob3dGYWJCdXR0b24gPSB0cnVlO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFsZXJ0U2VydmljZSA9IGluamVjdChOYXR1cmFsQWxlcnRTZXJ2aWNlKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kaWFsb2dEYXRhOiB1bmtub3duID0gaW5qZWN0KE1BVF9ESUFMT0dfREFUQSwge29wdGlvbmFsOiB0cnVlfSk7XG5cbiAgICAvKipcbiAgICAgKiBPbmNlIHNldCwgdGhpcyBtdXN0IG5vdCBjaGFuZ2UgYW55bW9yZSwgZXNwZWNpYWxseSBub3QgcmlnaHQgYWZ0ZXIgdGhlIGNyZWF0aW9uIG11dGF0aW9uLFxuICAgICAqIHNvIHRoZSBmb3JtIGRvZXMgbm90IHN3aXRjaCBmcm9tIGNyZWF0aW9uIG1vZGUgdG8gdXBkYXRlIG1vZGUgd2l0aG91dCBhbiBhY3R1YWwgcmVsb2FkIG9mXG4gICAgICogbW9kZWwgZnJvbSBEQiAoYnkgbmF2aWdhdGluZyB0byB1cGRhdGUgcGFnZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfaXNVcGRhdGVQYWdlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VzID0gbmV3IEN1bXVsYXRpdmVDaGFuZ2VzPHR5cGVvZiB0aGlzLmZvcm0uZ2V0UmF3VmFsdWU+KCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBrZXk6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2U6IFRTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgIG1vZGVsOiB0aGlzLnNlcnZpY2UuZ2V0RGVmYXVsdEZvclNlcnZlcigpLFxuICAgICAgICB9IGFzIERhdGE8VFNlcnZpY2UsIEV4dHJhUmVzb2x2ZT47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWW91IHByb2JhYmx5IHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIEluc3RlYWQsIGNvbnNpZGVyIG92ZXJyaWRpbmcgYGluaXRGb3JtKClgLlxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQYW5lbCkge1xuICAgICAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgcm91dGUgPSBpc05hdHVyYWxEaWFsb2dUcmlnZ2VyUHJvdmlkZWREYXRhKHRoaXMuX2RpYWxvZ0RhdGEpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9kaWFsb2dEYXRhLmFjdGl2YXRlZFJvdXRlXG4gICAgICAgICAgICAgICAgOiB0aGlzLnJvdXRlO1xuICAgICAgICAgICAgdGhpcy4jc3Vic2NyaWJlVG9Nb2RlbEZyb21SZXNvbHZlZERhdGEocm91dGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZVRhYihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd0ZhYkJ1dHRvbiA9IGluZGV4ID09PSAwO1xuICAgIH1cblxuICAgICNzdWJzY3JpYmVUb01vZGVsRnJvbVJlc29sdmVkRGF0YShyb3V0ZTogQWN0aXZhdGVkUm91dGUpOiB2b2lkIHtcbiAgICAgICAgbGV0IHByZXZpb3VzSWQgPSAtMTtcbiAgICAgICAgcm91dGUuZGF0YVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShkYXRhLm1vZGVsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmVzb2x2ZWQgZGF0YSBtdXN0IGluY2x1ZGUgdGhlIGtleSBgbW9kZWxgLCBhbmQgaXQgbXVzdCBiZSBhbiBvYnNlcnZhYmxlICh1c3VhbGx5IG9uZSBmcm9tIEFwb2xsbykuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gbW9kZWwgdG8ga25vdyB3aGVuIEFwb2xsbyBjYWNoZSBpcyBjaGFuZ2VkLCBzbyB3ZSBjYW4gcmVmbGVjdCBpdCBpbnRvIGBkYXRhLm1vZGVsYFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5tb2RlbC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFwKChtb2RlbDogRXh0cmFjdFJlc29sdmU8VFNlcnZpY2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbDogbW9kZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBEYXRhPFRTZXJ2aWNlLCBFeHRyYVJlc29sdmU+O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzSWQgIT09IG1vZGVsLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSWQgPSBtb2RlbC5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciBgZGF0YS5tb2RlbGAgd2FzIGZldGNoZWQgZnJvbSBEQiwgc28gd2UgYXJlIG9uIGFuIHVwZGF0ZSBwYWdlLCBvciBpZiBpdCBpcyBhIG5ldyBvYmplY3RcbiAgICAgKiB3aXRoIChvbmx5KSBkZWZhdWx0IHZhbHVlcywgc28gd2UgYXJlIG9uIGEgY3JlYXRpb24gcGFnZS5cbiAgICAgKlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBjaGVja2luZyBgZGF0YS5tb2RlbC5pZGAgZGlyZWN0bHksIGluIG9yZGVyIHRvIHR5cGUgZ3VhcmQgYW5kIGdldCBwcm9wZXIgdHlwaW5nXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGlzVXBkYXRlUGFnZSgpOiB0aGlzIGlzIHtkYXRhOiB7bW9kZWw6IEV4dHJhY3RUb25lPFRTZXJ2aWNlPn19IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVXBkYXRlUGFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIG9iamVjdCBvbiB0aGUgc2VydmVyIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBmb3JtIGZpZWxkcyB0aGF0IHdlcmUgbW9kaWZpZWQgc2luY2VcbiAgICAgKiB0aGUgaW5pdGlhbGl6YXRpb24sIG9yIHNpbmNlIHRoZSBwcmV2aW91cyBzdWNjZXNzZnVsIHVwZGF0ZS5cbiAgICAgKlxuICAgICAqIEZvcm0gZmllbGRzIHRoYXQgYXJlIG5ldmVyIG1vZGlmaWVkIGFyZSAqKm5vdCoqIHNlbnQgdG8gdGhlIHNlcnZlciwgdW5sZXNzIGlmIHlvdSBzcGVjaWZ5IGBzdWJtaXRBbGxGaWVsZHNgLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUobm93ID0gZmFsc2UsIHN1Ym1pdEFsbEZpZWxkcyA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1VwZGF0ZVBhZ2UoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdGVBbGxGb3JtQ29udHJvbHModGhpcy5mb3JtKTtcblxuICAgICAgICBpZlZhbGlkKHRoaXMuZm9ybSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKHN1Ym1pdEFsbEZpZWxkcykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlcy5pbml0aWFsaXplKHt9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdG9TdWJtaXQgPSB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuZGF0YS5tb2RlbC5pZCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNoYW5nZXMuZGlmZmVyZW5jZXMobmV3VmFsdWVzKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZSA9IG5vdyA/IHRoaXMuc2VydmljZS51cGRhdGVOb3codG9TdWJtaXQpIDogdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0b1N1Ym1pdCk7XG4gICAgICAgICAgICB1cGRhdGUuc3Vic2NyaWJlKG1vZGVsID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZXMuY29tbWl0KG5ld1ZhbHVlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuaW5mbygkbG9jYWxpemVgTWlzIMOgIGpvdXJgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3RVcGRhdGUobW9kZWwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGUocmVkaXJlY3QgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHZhbGlkYXRlQWxsRm9ybUNvbnRyb2xzKHRoaXMuZm9ybSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICB0aGlzLmZvcm0uZGlzYWJsZSgpO1xuXG4gICAgICAgIHRoaXMuc2VydmljZVxuICAgICAgICAgICAgLmNyZWF0ZShuZXdWYWx1ZXMpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAobW9kZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5pbmZvKCRsb2NhbGl6ZWBDcsOpw6lgKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0Q3JlYXRlKG1vZGVsKS5waXBlKGVuZFdpdGgobW9kZWwpLCBsYXN0KCkpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgobW9kZWw6IFdpdGhJZDxvYmplY3Q+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQYW5lbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFVybCA9IHRoaXMucm91dGVyLnVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0VXJsOiBzdHJpbmcgPSB0aGlzLnBhbmVsRGF0YT8uY29uZmlnLnBhcmFtcy5uZXh0Um91dGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VXJsID0gb2xkVXJsLnJlcGxhY2UoJy9uZXcnLCAnLycgKyBtb2RlbC5pZCkgKyAobmV4dFVybCA/ICcvJyArIG5leHRVcmwgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwobmV3VXJsKTsgLy8gcmVwbGFjZSAvbmV3IGJ5IC8xMjNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4uJywgbW9kZWwuaWRdLCB7cmVsYXRpdmVUbzogdGhpcy5yb3V0ZSwgcXVlcnlQYXJhbXN9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmZvcm0uZW5hYmxlKCkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGBjb25maXJtZXJgIGNhbiBiZSB1c2VkIHRvIG9wZW4gYSBjdXN0b20gZGlhbG9nLCBvciBhbnl0aGluZyBlbHNlLCB0byBjb25maXJtIHRoZSBkZWxldGlvbiwgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgZGlhbG9nXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZShyZWRpcmVjdGlvblJvdXRlPzogdW5rbm93bltdLCBjb25maXJtZXI/OiBPYnNlcnZhYmxlPGJvb2xlYW4gfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XG5cbiAgICAgICAgKFxuICAgICAgICAgICAgY29uZmlybWVyID8/XG4gICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5jb25maXJtKFxuICAgICAgICAgICAgICAgICRsb2NhbGl6ZWBTdXBwcmVzc2lvbmAsXG4gICAgICAgICAgICAgICAgJGxvY2FsaXplYFZvdWxlei12b3VzIHN1cHByaW1lciBkw6lmaW5pdGl2ZW1lbnQgY2V0IMOpbMOpbWVudCA/YCxcbiAgICAgICAgICAgICAgICAkbG9jYWxpemVgU3VwcHJpbWVyIGTDqWZpbml0aXZlbWVudGAsXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChjb25maXJtZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCB8fCAhdGhpcy5pc1VwZGF0ZVBhZ2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVEZWxldGUodGhpcy5kYXRhLm1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmRlbGV0ZShbdGhpcy5kYXRhLm1vZGVsXSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuaW5mbygkbG9jYWxpemVgU3VwcHJpbcOpYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BhbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFuZWxTZXJ2aWNlPy5nb1RvUGVudWx0aW1hdGVQYW5lbCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0Um91dGUgPSBbJy4uLy4uLycgKyBrZWJhYkNhc2UodGhpcy5rZXkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKHJlZGlyZWN0aW9uUm91dGUgPyByZWRpcmVjdGlvblJvdXRlIDogZGVmYXVsdFJvdXRlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmZvcm0uZW5hYmxlKCkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgcG9zdFVwZGF0ZShtb2RlbDogRXh0cmFjdFR1cGRhdGU8VFNlcnZpY2U+KTogdm9pZCB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIG9ic2VydmFibGUgdGhhdCB3aWxsIGJlIHN1YnNjcmliZWQgdG8gaW1tZWRpYXRlbHkgYW5kIHRoZVxuICAgICAqIHJlZGlyZWN0IG5hdmlnYXRpb24gd2lsbCBvbmx5IGhhcHBlbiBhZnRlciB0aGUgb2JzZXJ2YWJsZSBjb21wbGV0ZXMuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBwb3N0Q3JlYXRlKG1vZGVsOiBFeHRyYWN0VGNyZWF0ZTxUU2VydmljZT4pOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgcHJlRGVsZXRlKG1vZGVsOiBFeHRyYWN0VG9uZTxUU2VydmljZT4pOiB2b2lkIHtcbiAgICAgICAgLy8gbm9vcFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGZvcm0gd2hlbmV2ZXIgaXQgaXMgbmVlZGVkLlxuICAgICAqXG4gICAgICogWW91IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCwgYW5kIG5vdCBgbmdPbkluaXQoKWAgaWYgeW91IG5lZWQgdG8gY3VzdG9taXplIHRoZSBmb3JtLiBCZWNhdXNlIHRoaXMgd2lsbFxuICAgICAqIGNvcnJlY3RseSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uZSB0aW1lIHBlciBjb21wb25lbnQgaW5zdGFuY2UgaWYgbmVlZGVkLCB3aGVuIHRoZSByb3V0ZSBjaGFuZ2VzLiBCdXQgYG5nT25Jbml0KClgXG4gICAgICogd2lsbCBpbmNvcnJlY3RseSBiZSBjYWxsZWQgZXhhY3RseSAxIHRpbWUgcGVyIGNvbXBvbmVudCBpbnN0YW5jZSwgZXZlbiBpZiB0aGUgb2JqZWN0IGNoYW5nZXMgdmlhIHJvdXRlIG5hdmlnYXRpb24uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRGb3JtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc1VwZGF0ZVBhZ2UgPSAhIXRoaXMuZGF0YS5tb2RlbC5pZDtcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5zZXJ2aWNlLmdldEZvcm1Hcm91cCh0aGlzLmRhdGEubW9kZWwpO1xuICAgICAgICB0aGlzLmNoYW5nZXMuaW5pdGlhbGl6ZSh0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gICAgfVxufVxuIl19
@@ -1,99 +0,0 @@
1
- import { UntypedFormArray, UntypedFormGroup } from '@angular/forms';
2
- import { MatTableDataSource } from '@angular/material/table';
3
- import { merge } from 'lodash-es';
4
- import { NaturalQueryVariablesManager } from './query-variable-manager';
5
- import { validateAllFormControls } from './validators';
6
- import { Directive } from '@angular/core';
7
- import * as i0 from "@angular/core";
8
- /**
9
- * This class helps managing non-paginated rows of items that can be edited in-place, typically in a <mat-table>.
10
- * But it does **not** mutate anything to persist the edits on the server. It is up to the consuming component to implement
11
- * custom mutation mechanism.
12
- *
13
- * To access data of this component from a parent component, use:
14
- *
15
- * ```
16
- * @ViewChildren(ComponentType) cmp: ComponentType;
17
- * this.cmp.getItems();
18
- * ```
19
- *
20
- * To add empty line, call:
21
- *
22
- * ```
23
- * this.cmp.addEmpty();
24
- * ```
25
- *
26
- * @dynamic
27
- */
28
- export class NaturalAbstractEditableList {
29
- service;
30
- form;
31
- formArray = new UntypedFormArray([]);
32
- variablesManager = new NaturalQueryVariablesManager();
33
- dataSource = new MatTableDataSource();
34
- constructor(service) {
35
- this.service = service;
36
- // Create a form group with a line attributes that contain an array of formGroups (one by line = one by model)
37
- this.form = new UntypedFormGroup({ rows: this.formArray });
38
- this.dataSource.data = this.formArray.controls;
39
- this.variablesManager.set('pagination', { pagination: { pageSize: 999, pageIndex: 0 } });
40
- }
41
- /**
42
- * Set the list of items (overwriting what may have existed)
43
- */
44
- setItems(items) {
45
- this.formArray.clear(); // reset list
46
- this.addItems(items);
47
- }
48
- /**
49
- * Add given items to the list
50
- * Reproduces the model data loading the same way as it would be on a detail page (via AbstractDetail controller) but without resolving
51
- */
52
- addItems(items) {
53
- items.forEach(item => {
54
- const completedItem = merge(this.service.getDefaultForServer(), item);
55
- const lineFormGroup = this.service.getFormGroup(completedItem);
56
- this.formArray.push(lineFormGroup);
57
- });
58
- this.dataSource.data = this.formArray.controls;
59
- }
60
- removeAt(index) {
61
- this.formArray.removeAt(index);
62
- this.dataSource.data = this.formArray.controls;
63
- }
64
- /**
65
- * Add empty item at the end of the list
66
- */
67
- addEmpty() {
68
- this.addItems([{}]);
69
- }
70
- /**
71
- * Return a list of models without any treatment.
72
- *
73
- * To mutate models, it would be required to map them using :
74
- * - AbstractModelService.getInput()
75
- * - AbstractModelService.getPartialVariablesForCreation()
76
- * - AbstractModelService.getPartialVariablesForUpdate()
77
- * - some other required treatment.
78
- *
79
- * TODO return type is incorrect and should be closer to `Partial<T>[]` or an even looser type, because we don't really know what fields exists in the form. When we fix this, we should also remove type coercing in unit tests.
80
- */
81
- getItems() {
82
- return this.formArray.getRawValue();
83
- }
84
- /**
85
- * Force the form validation.
86
- *
87
- * The valid state can then be read via `this.form.valid`
88
- */
89
- validateForm() {
90
- validateAllFormControls(this.form);
91
- }
92
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalAbstractEditableList, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
93
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.3", type: NaturalAbstractEditableList, isStandalone: true, ngImport: i0 });
94
- }
95
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalAbstractEditableList, decorators: [{
96
- type: Directive,
97
- args: [{ standalone: true }]
98
- }], ctorParameters: () => [{ type: undefined }] });
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZWRpdGFibGUtbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9jbGFzc2VzL2Fic3RyYWN0LWVkaXRhYmxlLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25GLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFaEMsT0FBTyxFQUFDLDRCQUE0QixFQUFpQixNQUFNLDBCQUEwQixDQUFDO0FBRXRGLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQUd4Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE1BQU0sT0FBTywyQkFBMkI7SUFzQkU7SUFMdEIsSUFBSSxDQUFtQjtJQUN2QixTQUFTLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxnQkFBZ0IsR0FBRyxJQUFJLDRCQUE0QixFQUF5QixDQUFDO0lBQzdFLFVBQVUsR0FBRyxJQUFJLGtCQUFrQixFQUFtQixDQUFDO0lBRXZFLFlBQXNDLE9BQWlCO1FBQWpCLFlBQU8sR0FBUCxPQUFPLENBQVU7UUFDbkQsOEdBQThHO1FBQzlHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUMvQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFDLFVBQVUsRUFBRSxFQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBQyxFQUEwQixDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUSxDQUFDLEtBQW1CO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxhQUFhO1FBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFFBQVEsQ0FBQyxLQUFtQjtRQUMvQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUNuRCxDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQWE7UUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUTtRQUNYLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksUUFBUTtRQUNYLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFlBQVk7UUFDZix1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQzt1R0FyRlEsMkJBQTJCOzJGQUEzQiwyQkFBMkI7OzJGQUEzQiwyQkFBMkI7a0JBRHZDLFNBQVM7bUJBQUMsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQge21lcmdlfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL2Fic3RyYWN0LW1vZGVsLnNlcnZpY2UnO1xuaW1wb3J0IHtOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyLCBRdWVyeVZhcmlhYmxlc30gZnJvbSAnLi9xdWVyeS12YXJpYWJsZS1tYW5hZ2VyJztcbmltcG9ydCB7RXh0cmFjdFRhbGxPbmUsIEV4dHJhY3RWYWxsLCBMaXRlcmFsfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQge3ZhbGlkYXRlQWxsRm9ybUNvbnRyb2xzfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtEaXJlY3RpdmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtQYWdpbmF0ZWREYXRhfSBmcm9tICcuL2RhdGEtc291cmNlJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGhlbHBzIG1hbmFnaW5nIG5vbi1wYWdpbmF0ZWQgcm93cyBvZiBpdGVtcyB0aGF0IGNhbiBiZSBlZGl0ZWQgaW4tcGxhY2UsIHR5cGljYWxseSBpbiBhIDxtYXQtdGFibGU+LlxuICogQnV0IGl0IGRvZXMgKipub3QqKiBtdXRhdGUgYW55dGhpbmcgdG8gcGVyc2lzdCB0aGUgZWRpdHMgb24gdGhlIHNlcnZlci4gSXQgaXMgdXAgdG8gdGhlIGNvbnN1bWluZyBjb21wb25lbnQgdG8gaW1wbGVtZW50XG4gKiBjdXN0b20gbXV0YXRpb24gbWVjaGFuaXNtLlxuICpcbiAqIFRvIGFjY2VzcyBkYXRhIG9mIHRoaXMgY29tcG9uZW50IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCB1c2U6XG4gKlxuICogYGBgXG4gKiBAVmlld0NoaWxkcmVuKENvbXBvbmVudFR5cGUpIGNtcDogQ29tcG9uZW50VHlwZTtcbiAqIHRoaXMuY21wLmdldEl0ZW1zKCk7XG4gKiBgYGBcbiAqXG4gKiBUbyBhZGQgZW1wdHkgbGluZSwgY2FsbDpcbiAqXG4gKiBgYGBcbiAqIHRoaXMuY21wLmFkZEVtcHR5KCk7XG4gKiBgYGBcbiAqXG4gKiBAZHluYW1pY1xuICovXG5ARGlyZWN0aXZlKHtzdGFuZGFsb25lOiB0cnVlfSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsQWJzdHJhY3RFZGl0YWJsZUxpc3Q8XG4gICAgVFNlcnZpY2UgZXh0ZW5kcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgICAgIGFueSxcbiAgICAgICAgYW55LFxuICAgICAgICBQYWdpbmF0ZWREYXRhPExpdGVyYWw+LFxuICAgICAgICBRdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgYW55LFxuICAgICAgICBhbnksXG4gICAgICAgIGFueSxcbiAgICAgICAgYW55LFxuICAgICAgICBhbnksXG4gICAgICAgIGFueVxuICAgID4sXG4gICAgLy8gVGhlIExpdGVyYWwgaGVyZSBpcyBhIGJpdCB0b28gbG9vc2UuIElkZWFsbHkgd2Ugd291bGQgbGlrZSB0byBleHByZXNzXG4gICAgLy8gXCJpdCBtdXN0IGJlIGEgdW5pb24gYW5kIG9uZSBvZiB0aGUgdHlwZSBpbiB0aGUgdW5pb24gbXVzdCBiZSBFeHRyYWN0VGFsbE9uZTxUU2VydmljZT5cIlxuICAgIFQgZXh0ZW5kcyBMaXRlcmFsID0gRXh0cmFjdFRhbGxPbmU8VFNlcnZpY2U+LFxuPiB7XG4gICAgcHVibGljIHJlYWRvbmx5IGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gICAgcHVibGljIHJlYWRvbmx5IGZvcm1BcnJheSA9IG5ldyBVbnR5cGVkRm9ybUFycmF5KFtdKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFyaWFibGVzTWFuYWdlciA9IG5ldyBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPEV4dHJhY3RWYWxsPFRTZXJ2aWNlPj4oKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8QWJzdHJhY3RDb250cm9sPigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBzZXJ2aWNlOiBUU2VydmljZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBmb3JtIGdyb3VwIHdpdGggYSBsaW5lIGF0dHJpYnV0ZXMgdGhhdCBjb250YWluIGFuIGFycmF5IG9mIGZvcm1Hcm91cHMgKG9uZSBieSBsaW5lID0gb25lIGJ5IG1vZGVsKVxuICAgICAgICB0aGlzLmZvcm0gPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7cm93czogdGhpcy5mb3JtQXJyYXl9KTtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmZvcm1BcnJheS5jb250cm9scztcbiAgICAgICAgdGhpcy52YXJpYWJsZXNNYW5hZ2VyLnNldCgncGFnaW5hdGlvbicsIHtwYWdpbmF0aW9uOiB7cGFnZVNpemU6IDk5OSwgcGFnZUluZGV4OiAwfX0gYXMgRXh0cmFjdFZhbGw8VFNlcnZpY2U+KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxpc3Qgb2YgaXRlbXMgKG92ZXJ3cml0aW5nIHdoYXQgbWF5IGhhdmUgZXhpc3RlZClcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0SXRlbXMoaXRlbXM6IHJlYWRvbmx5IFRbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1BcnJheS5jbGVhcigpOyAvLyByZXNldCBsaXN0XG4gICAgICAgIHRoaXMuYWRkSXRlbXMoaXRlbXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBnaXZlbiBpdGVtcyB0byB0aGUgbGlzdFxuICAgICAqIFJlcHJvZHVjZXMgdGhlIG1vZGVsIGRhdGEgbG9hZGluZyB0aGUgc2FtZSB3YXkgYXMgaXQgd291bGQgYmUgb24gYSBkZXRhaWwgcGFnZSAodmlhIEFic3RyYWN0RGV0YWlsIGNvbnRyb2xsZXIpIGJ1dCB3aXRob3V0IHJlc29sdmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBhZGRJdGVtcyhpdGVtczogcmVhZG9ubHkgVFtdKTogdm9pZCB7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRJdGVtID0gbWVyZ2UodGhpcy5zZXJ2aWNlLmdldERlZmF1bHRGb3JTZXJ2ZXIoKSwgaXRlbSk7XG4gICAgICAgICAgICBjb25zdCBsaW5lRm9ybUdyb3VwID0gdGhpcy5zZXJ2aWNlLmdldEZvcm1Hcm91cChjb21wbGV0ZWRJdGVtKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUFycmF5LnB1c2gobGluZUZvcm1Hcm91cCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5mb3JtQXJyYXkuY29udHJvbHM7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZm9ybUFycmF5LmNvbnRyb2xzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBlbXB0eSBpdGVtIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRW1wdHkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRkSXRlbXMoW3t9IGFzIFRdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIG1vZGVscyB3aXRob3V0IGFueSB0cmVhdG1lbnQuXG4gICAgICpcbiAgICAgKiBUbyBtdXRhdGUgbW9kZWxzLCBpdCB3b3VsZCBiZSByZXF1aXJlZCB0byBtYXAgdGhlbSB1c2luZyA6XG4gICAgICogIC0gQWJzdHJhY3RNb2RlbFNlcnZpY2UuZ2V0SW5wdXQoKVxuICAgICAqICAtIEFic3RyYWN0TW9kZWxTZXJ2aWNlLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JDcmVhdGlvbigpXG4gICAgICogIC0gQWJzdHJhY3RNb2RlbFNlcnZpY2UuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvclVwZGF0ZSgpXG4gICAgICogIC0gc29tZSBvdGhlciByZXF1aXJlZCB0cmVhdG1lbnQuXG4gICAgICpcbiAgICAgKiBUT0RPIHJldHVybiB0eXBlIGlzIGluY29ycmVjdCBhbmQgc2hvdWxkIGJlIGNsb3NlciB0byBgUGFydGlhbDxUPltdYCBvciBhbiBldmVuIGxvb3NlciB0eXBlLCBiZWNhdXNlIHdlIGRvbid0IHJlYWxseSBrbm93IHdoYXQgZmllbGRzIGV4aXN0cyBpbiB0aGUgZm9ybS4gV2hlbiB3ZSBmaXggdGhpcywgd2Ugc2hvdWxkIGFsc28gcmVtb3ZlIHR5cGUgY29lcmNpbmcgaW4gdW5pdCB0ZXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SXRlbXMoKTogVFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUFycmF5LmdldFJhd1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgdGhlIGZvcm0gdmFsaWRhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSB2YWxpZCBzdGF0ZSBjYW4gdGhlbiBiZSByZWFkIHZpYSBgdGhpcy5mb3JtLnZhbGlkYFxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0ZUZvcm0oKTogdm9pZCB7XG4gICAgICAgIHZhbGlkYXRlQWxsRm9ybUNvbnRyb2xzKHRoaXMuZm9ybSk7XG4gICAgfVxufVxuIl19