@dangl/angular-ava 0.1.1-fe--1-add-tree-p0053

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 (62) hide show
  1. package/README.md +1 -0
  2. package/esm2022/dangl-angular-ava.mjs +5 -0
  3. package/esm2022/lib/angular-ava.module.mjs +88 -0
  4. package/esm2022/lib/ava-tree/tree/components/ava-tree/ava-tree.component.mjs +356 -0
  5. package/esm2022/lib/ava-tree/tree/components/list-structure/list-structure.component.mjs +38 -0
  6. package/esm2022/lib/ava-tree/tree/components/table-structure/table-structure.component.mjs +99 -0
  7. package/esm2022/lib/ava-tree/tree/components/tree-item/tree-item.component.mjs +89 -0
  8. package/esm2022/lib/ava-tree/tree/components/tree-node/tree-node.component.mjs +52 -0
  9. package/esm2022/lib/ava-tree/tree/components/tree-structure/tree-structure.component.mjs +30 -0
  10. package/esm2022/lib/ava-tree/tree/constants/defaultFilters.mjs +6 -0
  11. package/esm2022/lib/ava-tree/tree/constants/defaultTextWords.mjs +11 -0
  12. package/esm2022/lib/ava-tree/tree/constants/index.mjs +4 -0
  13. package/esm2022/lib/ava-tree/tree/directives/save-changing-view.directive.mjs +43 -0
  14. package/esm2022/lib/ava-tree/tree/model/ava-models.mjs +199 -0
  15. package/esm2022/lib/ava-tree/tree/model/context-menu-data.model.mjs +2 -0
  16. package/esm2022/lib/ava-tree/tree/model/function-view-line.model.mjs +2 -0
  17. package/esm2022/lib/ava-tree/tree/model/index.mjs +4 -0
  18. package/esm2022/lib/ava-tree/tree/model/selecting.model.mjs +2 -0
  19. package/esm2022/lib/ava-tree/tree/model/tableColumnType.mjs +2 -0
  20. package/esm2022/lib/ava-tree/tree/model/tree-mode.model.mjs +7 -0
  21. package/esm2022/lib/ava-tree/tree/pipes/element-icon-name.pipe.mjs +27 -0
  22. package/esm2022/lib/ava-tree/tree/pipes/element-item-number.pipe.mjs +23 -0
  23. package/esm2022/lib/ava-tree/tree/pipes/element-text.pipe.mjs +27 -0
  24. package/esm2022/lib/ava-tree/tree/services/expand-parent-group.service.mjs +32 -0
  25. package/esm2022/lib/ava-tree/tree/services/flat-elements.service.mjs +99 -0
  26. package/esm2022/lib/ava-tree/tree/services/keyboard-operation.service.mjs +114 -0
  27. package/esm2022/lib/ava-tree/tree/services/select-element.service.mjs +37 -0
  28. package/esm2022/lib/ava-tree/tree/services/tree-node-selection.service.mjs +133 -0
  29. package/esm2022/lib/version.mjs +10 -0
  30. package/esm2022/public-api.mjs +8 -0
  31. package/fesm2022/dangl-angular-ava.mjs +1174 -0
  32. package/fesm2022/dangl-angular-ava.mjs.map +1 -0
  33. package/index.d.ts +5 -0
  34. package/lib/angular-ava.module.d.ts +26 -0
  35. package/lib/ava-tree/tree/components/ava-tree/ava-tree.component.d.ts +77 -0
  36. package/lib/ava-tree/tree/components/list-structure/list-structure.component.d.ts +16 -0
  37. package/lib/ava-tree/tree/components/table-structure/table-structure.component.d.ts +34 -0
  38. package/lib/ava-tree/tree/components/tree-item/tree-item.component.d.ts +34 -0
  39. package/lib/ava-tree/tree/components/tree-node/tree-node.component.d.ts +22 -0
  40. package/lib/ava-tree/tree/components/tree-structure/tree-structure.component.d.ts +13 -0
  41. package/lib/ava-tree/tree/constants/defaultFilters.d.ts +1 -0
  42. package/lib/ava-tree/tree/constants/defaultTextWords.d.ts +11 -0
  43. package/lib/ava-tree/tree/constants/index.d.ts +3 -0
  44. package/lib/ava-tree/tree/directives/save-changing-view.directive.d.ts +12 -0
  45. package/lib/ava-tree/tree/model/ava-models.d.ts +1041 -0
  46. package/lib/ava-tree/tree/model/context-menu-data.model.d.ts +8 -0
  47. package/lib/ava-tree/tree/model/function-view-line.model.d.ts +11 -0
  48. package/lib/ava-tree/tree/model/index.d.ts +7 -0
  49. package/lib/ava-tree/tree/model/selecting.model.d.ts +14 -0
  50. package/lib/ava-tree/tree/model/tableColumnType.d.ts +6 -0
  51. package/lib/ava-tree/tree/model/tree-mode.model.d.ts +5 -0
  52. package/lib/ava-tree/tree/pipes/element-icon-name.pipe.d.ts +8 -0
  53. package/lib/ava-tree/tree/pipes/element-item-number.pipe.d.ts +8 -0
  54. package/lib/ava-tree/tree/pipes/element-text.pipe.d.ts +8 -0
  55. package/lib/ava-tree/tree/services/expand-parent-group.service.d.ts +7 -0
  56. package/lib/ava-tree/tree/services/flat-elements.service.d.ts +28 -0
  57. package/lib/ava-tree/tree/services/keyboard-operation.service.d.ts +32 -0
  58. package/lib/ava-tree/tree/services/select-element.service.d.ts +30 -0
  59. package/lib/ava-tree/tree/services/tree-node-selection.service.d.ts +23 -0
  60. package/lib/version.d.ts +8 -0
  61. package/package.json +31 -0
  62. package/public-api.d.ts +4 -0
@@ -0,0 +1,1174 @@
1
+ import * as i3 from '@angular/common';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { Injectable, Directive, Pipe, Component, Input, EventEmitter, Self, Output, ViewChild, NgModule } from '@angular/core';
5
+ import * as i5 from '@angular/forms';
6
+ import { ReactiveFormsModule, FormsModule } from '@angular/forms';
7
+ import * as i11 from '@angular/material/button';
8
+ import { MatButtonModule } from '@angular/material/button';
9
+ import * as i6 from '@angular/material/checkbox';
10
+ import { MatCheckboxModule } from '@angular/material/checkbox';
11
+ import * as i4$1 from '@angular/material/core';
12
+ import { MatRippleModule } from '@angular/material/core';
13
+ import * as i9 from '@angular/material/form-field';
14
+ import { MatFormFieldModule } from '@angular/material/form-field';
15
+ import * as i4 from '@angular/material/icon';
16
+ import { MatIconModule } from '@angular/material/icon';
17
+ import * as i8 from '@angular/material/input';
18
+ import { MatInputModule } from '@angular/material/input';
19
+ import * as i7 from '@angular/material/table';
20
+ import { MatTableModule } from '@angular/material/table';
21
+ import * as i12 from '@angular/material/tooltip';
22
+ import { MatTooltipModule } from '@angular/material/tooltip';
23
+ import { ReplaySubject, of, Subject, takeUntil, debounceTime, fromEvent, filter } from 'rxjs';
24
+ import * as i4$2 from 'projects/angular-ava/src/lib/ava-tree/tree/services/expand-parent-group.service';
25
+ import { ExpandParentGroupService } from 'projects/angular-ava/src/lib/ava-tree/tree/services/expand-parent-group.service';
26
+ import * as i5$1 from 'projects/angular-ava/src/lib/ava-tree/tree/services/keyboard-operation.service';
27
+ import { KeyboardOperationType, KeyboardOperationService } from 'projects/angular-ava/src/lib/ava-tree/tree/services/keyboard-operation.service';
28
+ import * as i2 from 'projects/angular-ava/src/lib/ava-tree/tree/services/tree-node-selection.service';
29
+ import { TreeNodeSelectionService } from 'projects/angular-ava/src/lib/ava-tree/tree/services/tree-node-selection.service';
30
+
31
+ //----------------------
32
+ // <auto-generated>
33
+ // Generated using the NSwag toolchain v14.0.0.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)
34
+ // </auto-generated>
35
+ //----------------------
36
+ /* tslint:disable */
37
+ /* eslint-disable */
38
+ // ReSharper disable InconsistentNaming
39
+ /** This enum configures rounding modes for price calculations in projects */
40
+ var PriceRoundingModeDto;
41
+ (function (PriceRoundingModeDto) {
42
+ PriceRoundingModeDto["Normal"] = "Normal";
43
+ PriceRoundingModeDto["Floor"] = "Floor";
44
+ PriceRoundingModeDto["Ceiling"] = "Ceiling";
45
+ })(PriceRoundingModeDto || (PriceRoundingModeDto = {}));
46
+ /** Determines the type of an ItemNumberSchema */
47
+ var ItemNumberTypeDto;
48
+ (function (ItemNumberTypeDto) {
49
+ ItemNumberTypeDto["Numeric"] = "Numeric";
50
+ ItemNumberTypeDto["Alphanumeric"] = "Alphanumeric";
51
+ })(ItemNumberTypeDto || (ItemNumberTypeDto = {}));
52
+ /** Specifies the type an ItemNumberSchemaTier represents. For example, a tier may indicate to be used for positions or for groups. */
53
+ var ItemNumberSchemaTierTypeDto;
54
+ (function (ItemNumberSchemaTierTypeDto) {
55
+ ItemNumberSchemaTierTypeDto["Undefined"] = "Undefined";
56
+ ItemNumberSchemaTierTypeDto["Index"] = "Index";
57
+ ItemNumberSchemaTierTypeDto["Position"] = "Position";
58
+ ItemNumberSchemaTierTypeDto["Group"] = "Group";
59
+ ItemNumberSchemaTierTypeDto["Lot"] = "Lot";
60
+ })(ItemNumberSchemaTierTypeDto || (ItemNumberSchemaTierTypeDto = {}));
61
+ /** This enumeration models types of price components for better classification. */
62
+ var PriceComponentTypeDto;
63
+ (function (PriceComponentTypeDto) {
64
+ PriceComponentTypeDto["Unknown"] = "Unknown";
65
+ PriceComponentTypeDto["Wages"] = "Wages";
66
+ PriceComponentTypeDto["Materials"] = "Materials";
67
+ PriceComponentTypeDto["Plant"] = "Plant";
68
+ PriceComponentTypeDto["Miscellaneous"] = "Miscellaneous";
69
+ })(PriceComponentTypeDto || (PriceComponentTypeDto = {}));
70
+ /** This enumeration describes the type of the award / procurement process. If this is used in a GAEB context, more information about award types can be found in the German VOB/A rules and the GAEB standard */
71
+ var AwardTypeDto;
72
+ (function (AwardTypeDto) {
73
+ AwardTypeDto["Unspecified"] = "Unspecified";
74
+ AwardTypeDto["OpenProcurement"] = "OpenProcurement";
75
+ AwardTypeDto["ClosedProducrement"] = "ClosedProducrement";
76
+ AwardTypeDto["NegotiationProcurementWithoutPublicAnnouncement"] = "NegotiationProcurementWithoutPublicAnnouncement";
77
+ AwardTypeDto["NegotiationProcurement"] = "NegotiationProcurement";
78
+ AwardTypeDto["OpenCall"] = "OpenCall";
79
+ AwardTypeDto["SelectedCallWithoutPublicCompetition"] = "SelectedCallWithoutPublicCompetition";
80
+ AwardTypeDto["SelectedCall"] = "SelectedCall";
81
+ AwardTypeDto["DirectAward"] = "DirectAward";
82
+ AwardTypeDto["InternationalNATOProcurement"] = "InternationalNATOProcurement";
83
+ AwardTypeDto["CompetitiveDialog"] = "CompetitiveDialog";
84
+ })(AwardTypeDto || (AwardTypeDto = {}));
85
+ /** This enumeration describes awards for project that are not just a regular procurement. For example, it can be used to describe recurring maintenance or an outline contract (German: Rahmenvertrag) which just specifies services and prices but may be requested on demand when necessary */
86
+ var SpecialAwardKindDto;
87
+ (function (SpecialAwardKindDto) {
88
+ SpecialAwardKindDto["Unspecified"] = "Unspecified";
89
+ SpecialAwardKindDto["MaintenanceContract"] = "MaintenanceContract";
90
+ SpecialAwardKindDto["OutlineContract"] = "OutlineContract";
91
+ SpecialAwardKindDto["OutlineForMaintenanceContract"] = "OutlineForMaintenanceContract";
92
+ })(SpecialAwardKindDto || (SpecialAwardKindDto = {}));
93
+ /** This enumeration describes the type of a catalogue. Catalogues, or collections, hold information to categorize and describe items. For example, the German DIN 276 cost group standards describe different types of costs for building projects. When referencing the DIN 276 catalogue and providing an item key or identifier, it is possible to reference data in this catalogue. */
94
+ var CatalogueTypeDto;
95
+ (function (CatalogueTypeDto) {
96
+ CatalogueTypeDto["Unknown"] = "Unknown";
97
+ CatalogueTypeDto["Location"] = "Location";
98
+ CatalogueTypeDto["DIN276"] = "DIN276";
99
+ CatalogueTypeDto["CostUnit"] = "CostUnit";
100
+ CatalogueTypeDto["WorkCategory"] = "WorkCategory";
101
+ CatalogueTypeDto["OenormB1801CostGroup"] = "OenormB1801CostGroup";
102
+ CatalogueTypeDto["BIM"] = "BIM";
103
+ CatalogueTypeDto["Attachment"] = "Attachment";
104
+ })(CatalogueTypeDto || (CatalogueTypeDto = {}));
105
+ /** Indicates the origin of an element. */
106
+ var AdditionTypeDto;
107
+ (function (AdditionTypeDto) {
108
+ AdditionTypeDto["None"] = "None";
109
+ AdditionTypeDto["ByBuyer"] = "ByBuyer";
110
+ AdditionTypeDto["ByBidder"] = "ByBidder";
111
+ })(AdditionTypeDto || (AdditionTypeDto = {}));
112
+ /** This enumeration identifies a pre-known standard used for referencing standardized descriptions. */
113
+ var StandardReferenceTypeDto;
114
+ (function (StandardReferenceTypeDto) {
115
+ StandardReferenceTypeDto["Unknown"] = "Unknown";
116
+ StandardReferenceTypeDto["StLB"] = "StLB";
117
+ StandardReferenceTypeDto["StLK"] = "StLK";
118
+ StandardReferenceTypeDto["STLBBauZ"] = "STLBBauZ";
119
+ })(StandardReferenceTypeDto || (StandardReferenceTypeDto = {}));
120
+ /** Indicates if this service specification item is commissioned (and therefore should be executed), postponed for later or undefined. */
121
+ var ComissionStatusDto;
122
+ (function (ComissionStatusDto) {
123
+ ComissionStatusDto["Undefined"] = "Undefined";
124
+ ComissionStatusDto["Commissioned"] = "Commissioned";
125
+ ComissionStatusDto["Postponed"] = "Postponed";
126
+ ComissionStatusDto["Removed"] = "Removed";
127
+ })(ComissionStatusDto || (ComissionStatusDto = {}));
128
+ /** This is a classification for Position elements. */
129
+ var PositionTypeDto;
130
+ (function (PositionTypeDto) {
131
+ PositionTypeDto["Regular"] = "Regular";
132
+ PositionTypeDto["Optional"] = "Optional";
133
+ PositionTypeDto["Alternative"] = "Alternative";
134
+ })(PositionTypeDto || (PositionTypeDto = {}));
135
+ /** This indicates the price type of a IPricedElement. */
136
+ var PriceTypeDto;
137
+ (function (PriceTypeDto) {
138
+ PriceTypeDto["WithTotal"] = "WithTotal";
139
+ PriceTypeDto["WithoutTotal"] = "WithoutTotal";
140
+ })(PriceTypeDto || (PriceTypeDto = {}));
141
+ /** The service type describes the type of service a Position represents. */
142
+ var ServiceTypeDto;
143
+ (function (ServiceTypeDto) {
144
+ ServiceTypeDto["Regular"] = "Regular";
145
+ ServiceTypeDto["HourlyPaidWork"] = "HourlyPaidWork";
146
+ })(ServiceTypeDto || (ServiceTypeDto = {}));
147
+ /** This indicates where the content of this element originates, if set. It corresponds to 'herkunftskennzeichen' in ÖNorm */
148
+ var OenormOriginCodeDto;
149
+ (function (OenormOriginCodeDto) {
150
+ OenormOriginCodeDto["Unknown"] = "Unknown";
151
+ OenormOriginCodeDto["FreeText"] = "FreeText";
152
+ OenormOriginCodeDto["AdditionDescription"] = "AdditionDescription";
153
+ })(OenormOriginCodeDto || (OenormOriginCodeDto = {}));
154
+ /** This enumeration represents the status of an addendum, 'Nachtrag' in German */
155
+ var AddendumStatusDto;
156
+ (function (AddendumStatusDto) {
157
+ AddendumStatusDto["Unknown"] = "Unknown";
158
+ AddendumStatusDto["Recognized"] = "Recognized";
159
+ AddendumStatusDto["Filed"] = "Filed";
160
+ AddendumStatusDto["Offered"] = "Offered";
161
+ AddendumStatusDto["Withdrawn"] = "Withdrawn";
162
+ AddendumStatusDto["Rejected"] = "Rejected";
163
+ AddendumStatusDto["RejectionObjected"] = "RejectionObjected";
164
+ AddendumStatusDto["FormallyAcknowledged"] = "FormallyAcknowledged";
165
+ AddendumStatusDto["Approved"] = "Approved";
166
+ })(AddendumStatusDto || (AddendumStatusDto = {}));
167
+ /** This enum represents the different ways in which a complementing position type can be specified. It is typically only used in GAEB exports, since in Dangl.AVA, complementing positions are always explicitly referenced. */
168
+ var PositionComplementingTypeDto;
169
+ (function (PositionComplementingTypeDto) {
170
+ PositionComplementingTypeDto["Undefined"] = "Undefined";
171
+ PositionComplementingTypeDto["AllPreviousMarkedPositions"] = "AllPreviousMarkedPositions";
172
+ PositionComplementingTypeDto["AllPreviousPositions"] = "AllPreviousPositions";
173
+ PositionComplementingTypeDto["ReferencedPositions"] = "ReferencedPositions";
174
+ })(PositionComplementingTypeDto || (PositionComplementingTypeDto = {}));
175
+ /** Types of retentions to be used in positions */
176
+ var HoldOutTypeDto;
177
+ (function (HoldOutTypeDto) {
178
+ HoldOutTypeDto["Unknown"] = "Unknown";
179
+ HoldOutTypeDto["Base"] = "Base";
180
+ HoldOutTypeDto["Extension"] = "Extension";
181
+ HoldOutTypeDto["Rent"] = "Rent";
182
+ })(HoldOutTypeDto || (HoldOutTypeDto = {}));
183
+ /** Duration used in retention positions */
184
+ var HoldOutDurationUnitDto;
185
+ (function (HoldOutDurationUnitDto) {
186
+ HoldOutDurationUnitDto["Unknown"] = "Unknown";
187
+ HoldOutDurationUnitDto["Minutes"] = "Minutes";
188
+ HoldOutDurationUnitDto["Hours"] = "Hours";
189
+ HoldOutDurationUnitDto["Days"] = "Days";
190
+ HoldOutDurationUnitDto["Weeks"] = "Weeks";
191
+ HoldOutDurationUnitDto["Months"] = "Months";
192
+ })(HoldOutDurationUnitDto || (HoldOutDurationUnitDto = {}));
193
+ /** Indicates a ServiceSpecification's exchange phase, based on the GAEB exchange phases. */
194
+ var ExchangePhaseDto;
195
+ (function (ExchangePhaseDto) {
196
+ ExchangePhaseDto["Undefined"] = "Undefined";
197
+ ExchangePhaseDto["Base"] = "Base";
198
+ ExchangePhaseDto["CostEstimate"] = "CostEstimate";
199
+ ExchangePhaseDto["OfferRequest"] = "OfferRequest";
200
+ ExchangePhaseDto["Offer"] = "Offer";
201
+ ExchangePhaseDto["SideOffer"] = "SideOffer";
202
+ ExchangePhaseDto["Grant"] = "Grant";
203
+ })(ExchangePhaseDto || (ExchangePhaseDto = {}));
204
+ /** Indicates where a service specification was originally created. */
205
+ var OriginDto;
206
+ (function (OriginDto) {
207
+ OriginDto["Self"] = "Self";
208
+ OriginDto["Gaeb90"] = "Gaeb90";
209
+ OriginDto["Gaeb2000"] = "Gaeb2000";
210
+ OriginDto["GaebXml"] = "GaebXml";
211
+ OriginDto["Oenorm"] = "Oenorm";
212
+ OriginDto["Reb"] = "Reb";
213
+ OriginDto["Sia"] = "Sia";
214
+ })(OriginDto || (OriginDto = {}));
215
+ /** This enumeration represents the unit of a duration */
216
+ var DurationUnitDto;
217
+ (function (DurationUnitDto) {
218
+ DurationUnitDto["Months"] = "Months";
219
+ DurationUnitDto["Years"] = "Years";
220
+ })(DurationUnitDto || (DurationUnitDto = {}));
221
+ /** This enum represents types of price inquiries */
222
+ var CommerceInquiryTypeDto;
223
+ (function (CommerceInquiryTypeDto) {
224
+ CommerceInquiryTypeDto["Unknown"] = "Unknown";
225
+ CommerceInquiryTypeDto["Project"] = "Project";
226
+ CommerceInquiryTypeDto["Immediate"] = "Immediate";
227
+ CommerceInquiryTypeDto["Exhibition"] = "Exhibition";
228
+ })(CommerceInquiryTypeDto || (CommerceInquiryTypeDto = {}));
229
+
230
+ var ModeViewType;
231
+ (function (ModeViewType) {
232
+ ModeViewType["Tree"] = "Tree";
233
+ ModeViewType["List"] = "List";
234
+ ModeViewType["Table"] = "Table";
235
+ })(ModeViewType || (ModeViewType = {}));
236
+
237
+ const DEFAULT_FILTERS = [
238
+ (element, filter) => element['shortText']?.trim().toLocaleLowerCase().includes(filter),
239
+ (element, filter) => element['label']?.trim().toLocaleLowerCase().includes(filter),
240
+ (element, filter) => element['itemNumber']?.['stringRepresentation']?.includes(filter)
241
+ ];
242
+
243
+ const DEFAULT_TEXT_WORDS = {
244
+ textSearch: 'Suche',
245
+ textNothing: 'Nothing',
246
+ textNothingFiltered: 'Nothing Filtered',
247
+ textAll: 'Alle',
248
+ tooltipAllOpen: 'Alle aufklappen',
249
+ tooltipAllClose: 'Alle zuklappen',
250
+ tooltipAllAdd: 'Alle hinzufügen',
251
+ tooltipAllRemove: 'Alle entfernen'
252
+ };
253
+
254
+ class FlatElementsService {
255
+ constructor() {
256
+ this._flatElementsDto = [];
257
+ this.flatElementsDtoSource = new ReplaySubject(1);
258
+ this.flatElementsDto = this.flatElementsDtoSource.asObservable();
259
+ this.functionView = null;
260
+ this.listFilterFunc = [
261
+ (element, filter) => element['shortText']?.trim().toLocaleLowerCase().includes(filter),
262
+ (element, filter) => element['label']?.trim().toLocaleLowerCase().includes(filter),
263
+ (element, filter) => element['itemNumber']?.['stringRepresentation']?.includes(filter)
264
+ ];
265
+ }
266
+ setElementsDto(elementsDto) {
267
+ this._flatElementsDto = FlatElementsService.getFlatElements(elementsDto);
268
+ this.objectElementsDto = FlatElementsService.getObjectElements(this._flatElementsDto);
269
+ this.flatElementsDtoSource.next(this._flatElementsDto);
270
+ }
271
+ static getFlatElements(container) {
272
+ const flatElements = [];
273
+ if (container.elements) {
274
+ container.elements.forEach((e) => {
275
+ flatElements.push(e);
276
+ if (e.elementTypeDiscriminator === 'ServiceSpecificationGroupDto') {
277
+ const group = e;
278
+ flatElements.push(...this.getFlatElements(group));
279
+ }
280
+ });
281
+ }
282
+ return flatElements;
283
+ }
284
+ static getObjectElements(elements) {
285
+ const objectElements = {};
286
+ if (elements?.length) {
287
+ elements.forEach((e) => {
288
+ if (e?.id) {
289
+ objectElements[e.id] = e;
290
+ }
291
+ });
292
+ }
293
+ return objectElements;
294
+ }
295
+ getOneElementById(id) {
296
+ return of(id ? this.objectElementsDto?.[id] || null : null);
297
+ }
298
+ checkFilterValue(element, filterValue) {
299
+ const cleanFilter = filterValue.trim().toLocaleLowerCase();
300
+ for (const func of this.listFilterFunc) {
301
+ if (func(element, cleanFilter)) {
302
+ return true;
303
+ }
304
+ }
305
+ return false;
306
+ }
307
+ jumpNextNode(delta, currentElement, conditionFunc) {
308
+ if (!this._flatElementsDto.length || (conditionFunc && !this._flatElementsDto.find((item) => conditionFunc(item)))) {
309
+ return null;
310
+ }
311
+ const startElement = currentElement || this._flatElementsDto[0];
312
+ let nextIndex = this._flatElementsDto.findIndex((item) => startElement.id === item.id);
313
+ if (currentElement) {
314
+ nextIndex = this.getNextIndex(this._flatElementsDto.length, nextIndex, delta);
315
+ }
316
+ while (conditionFunc && !conditionFunc(this._flatElementsDto[nextIndex])) {
317
+ nextIndex = this.getNextIndex(this._flatElementsDto.length, nextIndex, delta);
318
+ }
319
+ return this._flatElementsDto[nextIndex];
320
+ }
321
+ getNextIndex(length, index, delta) {
322
+ let nextIndex = index + delta;
323
+ nextIndex = nextIndex < 0 ? length - 1 : nextIndex;
324
+ nextIndex = nextIndex > length - 1 ? 0 : nextIndex;
325
+ return nextIndex;
326
+ }
327
+ getChangedView(id) {
328
+ if (this.objectElementsDto) {
329
+ const element = this.objectElementsDto[id];
330
+ if (element && this.functionView?.length) {
331
+ for (const objectView of this.functionView) {
332
+ if (objectView.func(element)) {
333
+ return objectView.view;
334
+ }
335
+ }
336
+ }
337
+ }
338
+ return null;
339
+ }
340
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: FlatElementsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
341
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: FlatElementsService, providedIn: 'root' }); }
342
+ }
343
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: FlatElementsService, decorators: [{
344
+ type: Injectable,
345
+ args: [{
346
+ providedIn: 'root'
347
+ }]
348
+ }], ctorParameters: function () { return []; } });
349
+
350
+ class SelectElementService {
351
+ constructor() {
352
+ this.preselectedElementSource = new ReplaySubject(1);
353
+ this.preselectedElement = this.preselectedElementSource.asObservable();
354
+ this.selectClickElementSource = new ReplaySubject(1);
355
+ this.selectClickElement = this.selectClickElementSource.asObservable();
356
+ this.selectDblClickElementSource = new ReplaySubject(1);
357
+ this.selectDblClickElement = this.selectDblClickElementSource.asObservable();
358
+ this.selectContextMenuElementSource = new ReplaySubject(1);
359
+ this.selectContextMenuElement = this.selectContextMenuElementSource.asObservable();
360
+ }
361
+ setPreselectedElement(element) {
362
+ this.preselectedElementSource.next(element);
363
+ }
364
+ setClickElement(element) {
365
+ this.selectClickElementSource.next(element);
366
+ this.preselectedElementSource.next(null);
367
+ }
368
+ setDblClickElement(element) {
369
+ this.selectDblClickElementSource.next(element);
370
+ }
371
+ setContextMenuElement(data) {
372
+ this.selectContextMenuElementSource.next(data);
373
+ }
374
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: SelectElementService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
375
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: SelectElementService, providedIn: 'root' }); }
376
+ }
377
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: SelectElementService, decorators: [{
378
+ type: Injectable,
379
+ args: [{
380
+ providedIn: 'root'
381
+ }]
382
+ }] });
383
+
384
+ class SaveChangingViewDirective {
385
+ constructor(el, renderer, flatElementsService) {
386
+ this.el = el;
387
+ this.renderer = renderer;
388
+ this.flatElementsService = flatElementsService;
389
+ }
390
+ ngOnInit() {
391
+ setTimeout(() => {
392
+ const id = this.el?.nativeElement.id;
393
+ if (id) {
394
+ const view = this.flatElementsService?.getChangedView(id);
395
+ const icon = this.el.nativeElement.querySelector('[tdChangingIconView]');
396
+ if (view?.iconName && icon) {
397
+ icon.textContent = view.iconName;
398
+ }
399
+ if (view?.iconColor && icon) {
400
+ this.renderer?.setStyle(icon, 'color', view.iconColor);
401
+ }
402
+ const textList = this.el.nativeElement.querySelectorAll('[tdChangingTextView]');
403
+ textList?.forEach((text) => {
404
+ if (view?.textBold) {
405
+ this.renderer?.setStyle(text, 'font-weight', view.textBold);
406
+ }
407
+ if (view?.textColor) {
408
+ this.renderer?.setStyle(text, 'color', view.textColor);
409
+ }
410
+ });
411
+ }
412
+ }, 0);
413
+ }
414
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: SaveChangingViewDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: FlatElementsService }], target: i0.ɵɵFactoryTarget.Directive }); }
415
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.6", type: SaveChangingViewDirective, selector: "[trSaveChangingView]", ngImport: i0 }); }
416
+ }
417
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: SaveChangingViewDirective, decorators: [{
418
+ type: Directive,
419
+ args: [{
420
+ selector: '[trSaveChangingView]'
421
+ }]
422
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: FlatElementsService }]; } });
423
+
424
+ class ElementIconNamePipe {
425
+ transform(element, arg) {
426
+ switch (element.elementTypeDiscriminator) {
427
+ case 'NoteTextDto':
428
+ return 'subject';
429
+ case 'ExecutionDescriptionDto':
430
+ return 'event';
431
+ case 'ServiceSpecificationGroupDto':
432
+ return 'folder_open';
433
+ case 'PositionDto':
434
+ return 'add';
435
+ default:
436
+ return '';
437
+ }
438
+ }
439
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ElementIconNamePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
440
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.6", ngImport: i0, type: ElementIconNamePipe, name: "elementIconName" }); }
441
+ }
442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ElementIconNamePipe, decorators: [{
443
+ type: Pipe,
444
+ args: [{
445
+ name: 'elementIconName'
446
+ }]
447
+ }] });
448
+
449
+ class ElementTextPipe {
450
+ transform(element, arg) {
451
+ switch (element.elementTypeDiscriminator) {
452
+ case 'NoteTextDto':
453
+ return element.shortText || 'Hinweis';
454
+ case 'ExecutionDescriptionDto':
455
+ return `${element.identifier ? element.identifier + ' - ' : ''}${element.label || 'Description'}`;
456
+ case 'ServiceSpecificationGroupDto':
457
+ return element.shortText || 'Group';
458
+ case 'PositionDto':
459
+ return element.shortText || 'Position';
460
+ default:
461
+ return '';
462
+ }
463
+ }
464
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ElementTextPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
465
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.6", ngImport: i0, type: ElementTextPipe, name: "elementText" }); }
466
+ }
467
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ElementTextPipe, decorators: [{
468
+ type: Pipe,
469
+ args: [{
470
+ name: 'elementText'
471
+ }]
472
+ }] });
473
+
474
+ class ElementItemNumberPipe {
475
+ transform(element, arg) {
476
+ switch (element.elementTypeDiscriminator) {
477
+ case 'ServiceSpecificationGroupDto':
478
+ return element.itemNumber?.stringRepresentation || '';
479
+ case 'PositionDto':
480
+ return element.itemNumber?.stringRepresentation || '';
481
+ default:
482
+ return '';
483
+ }
484
+ }
485
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ElementItemNumberPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
486
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.2.6", ngImport: i0, type: ElementItemNumberPipe, name: "elementItemNumber" }); }
487
+ }
488
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ElementItemNumberPipe, decorators: [{
489
+ type: Pipe,
490
+ args: [{
491
+ name: 'elementItemNumber'
492
+ }]
493
+ }] });
494
+
495
+ class TreeItemComponent {
496
+ constructor(selectElementService, treeNodeSelectionService, cdr) {
497
+ this.selectElementService = selectElementService;
498
+ this.treeNodeSelectionService = treeNodeSelectionService;
499
+ this.cdr = cdr;
500
+ this.element = {};
501
+ this.expansionState = {};
502
+ this.isSelectionMode = false;
503
+ this.selectedElement = null;
504
+ this.preselectedElement = null;
505
+ this.isAllowOneClick = true;
506
+ this.timerStop = null;
507
+ this.$destroy = new Subject();
508
+ this.checkedElements = {};
509
+ }
510
+ ngOnInit() {
511
+ this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((element) => (this.selectedElement = element));
512
+ this.selectElementService.preselectedElement.pipe(takeUntil(this.$destroy)).subscribe((element) => (this.preselectedElement = element));
513
+ if (this.isSelectionMode) {
514
+ this.treeNodeSelectionService.treeNodeSelecting.pipe(takeUntil(this.$destroy)).subscribe((treeNodeSelecting) => {
515
+ this.checkedElements = treeNodeSelecting;
516
+ this.cdr.detectChanges();
517
+ });
518
+ }
519
+ }
520
+ ngOnDestroy() {
521
+ this.timerStop && clearTimeout(this.timerStop);
522
+ this.$destroy.next(true);
523
+ this.$destroy.complete();
524
+ }
525
+ expand() {
526
+ if (this.element) {
527
+ this.expansionState[this.element.id] = true;
528
+ }
529
+ }
530
+ select() {
531
+ if (this.isAllowOneClick) {
532
+ this.isAllowOneClick = false;
533
+ this.timerStop = setTimeout(() => {
534
+ this.selectElementService.setClickElement(this.selectedElement?.id === this.element.id ? null : this.element);
535
+ if (this.element.elementTypeDiscriminator === 'ServiceSpecificationGroupDto') {
536
+ this.expand();
537
+ }
538
+ this.isAllowOneClick = true;
539
+ }, 300);
540
+ }
541
+ }
542
+ dblSelect() {
543
+ this.timerStop && clearTimeout(this.timerStop);
544
+ this.selectElementService.setDblClickElement(this.element);
545
+ if (this.element.elementTypeDiscriminator === 'ServiceSpecificationGroupDto') {
546
+ this.expand();
547
+ }
548
+ this.isAllowOneClick = true;
549
+ }
550
+ openContextMenu(event) {
551
+ event.preventDefault();
552
+ this.selectElementService.setContextMenuElement({ position: { x: `${event.x}px`, y: `${event.y}px` }, node: this.element });
553
+ }
554
+ changeSelecting(element, event) {
555
+ this.treeNodeSelectionService.changeSelecting(event, element.id);
556
+ }
557
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: TreeItemComponent, deps: [{ token: SelectElementService }, { token: i2.TreeNodeSelectionService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
558
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: TreeItemComponent, selector: "ava-tree-item", inputs: { element: "element", expansionState: "expansionState", isSelectionMode: "isSelectionMode" }, ngImport: i0, template: "<div\r\n *ngIf=\"element\"\r\n (click)=\"select()\"\r\n (dblclick)=\"dblSelect()\"\r\n (contextmenu)=\"openContextMenu($event)\"\r\n class=\"ava-tree-item\"\r\n [id]=\"element.id\"\r\n trSaveChangingView\r\n>\r\n <mat-icon\r\n class=\"ava-tree-item__icon\"\r\n tdChangingIconView\r\n >{{ element | elementIconName }}</mat-icon\r\n >\r\n <div\r\n *ngIf=\"!isSelectionMode\"\r\n class=\"ava-tree-item__text\"\r\n [class.choose]=\"!isSelectionMode && element.id === preselectedElement?.id\"\r\n tdChangingTextView\r\n >\r\n <ng-container [ngTemplateOutlet]=\"text\"></ng-container>\r\n </div>\r\n <mat-checkbox\r\n *ngIf=\"isSelectionMode\"\r\n class=\"ava-tree-item__checkbox\"\r\n color=\"primary\"\r\n [indeterminate]=\"checkedElements[element.id].indeterminate\"\r\n [(ngModel)]=\"checkedElements[element.id].checked\"\r\n (ngModelChange)=\"changeSelecting(element, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div\r\n class=\"ava-tree-item__text\"\r\n tdChangingTextView\r\n >\r\n <ng-container [ngTemplateOutlet]=\"text\"></ng-container>\r\n </div>\r\n </mat-checkbox>\r\n</div>\r\n\r\n<ng-template #text>\r\n <ng-container\r\n *ngIf=\"\r\n element?.elementTypeDiscriminator === 'ServiceSpecificationGroupDto' || element?.elementTypeDiscriminator === 'PositionDto';\r\n else simpleText\r\n \"\r\n >\r\n {{ element | elementItemNumber }} - {{ element | elementText }}\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #simpleText>\r\n {{ element | elementText }}\r\n</ng-template>\r\n", styles: ["::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox{padding:0;flex:0 0 16px;width:16px;height:16px}::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__native-control{width:100%;height:100%}::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__ripple{opacity:0!important}::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__background{top:0;left:0;width:100%;height:100%}::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:#fff!important}::ng-deep .ava-tree-item__checkbox .mdc-form-field>label{line-height:24px;padding-left:8px;-webkit-user-select:none;user-select:none}::ng-deep .ava-tree-item__checkbox .mat-mdc-checkbox-touch-target{width:16px!important;height:16px!important}.ava-tree-item{display:flex;align-items:center}.ava-tree-item__icon,.ava-tree-item__checkbox{flex-shrink:0}.ava-tree-item__text{flex-grow:1;-webkit-user-select:none;user-select:none;white-space:nowrap}.ava-tree-item__text.choose{color:red!important}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: SaveChangingViewDirective, selector: "[trSaveChangingView]" }, { kind: "pipe", type: ElementIconNamePipe, name: "elementIconName" }, { kind: "pipe", type: ElementTextPipe, name: "elementText" }, { kind: "pipe", type: ElementItemNumberPipe, name: "elementItemNumber" }] }); }
559
+ }
560
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: TreeItemComponent, decorators: [{
561
+ type: Component,
562
+ args: [{ selector: 'ava-tree-item', template: "<div\r\n *ngIf=\"element\"\r\n (click)=\"select()\"\r\n (dblclick)=\"dblSelect()\"\r\n (contextmenu)=\"openContextMenu($event)\"\r\n class=\"ava-tree-item\"\r\n [id]=\"element.id\"\r\n trSaveChangingView\r\n>\r\n <mat-icon\r\n class=\"ava-tree-item__icon\"\r\n tdChangingIconView\r\n >{{ element | elementIconName }}</mat-icon\r\n >\r\n <div\r\n *ngIf=\"!isSelectionMode\"\r\n class=\"ava-tree-item__text\"\r\n [class.choose]=\"!isSelectionMode && element.id === preselectedElement?.id\"\r\n tdChangingTextView\r\n >\r\n <ng-container [ngTemplateOutlet]=\"text\"></ng-container>\r\n </div>\r\n <mat-checkbox\r\n *ngIf=\"isSelectionMode\"\r\n class=\"ava-tree-item__checkbox\"\r\n color=\"primary\"\r\n [indeterminate]=\"checkedElements[element.id].indeterminate\"\r\n [(ngModel)]=\"checkedElements[element.id].checked\"\r\n (ngModelChange)=\"changeSelecting(element, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div\r\n class=\"ava-tree-item__text\"\r\n tdChangingTextView\r\n >\r\n <ng-container [ngTemplateOutlet]=\"text\"></ng-container>\r\n </div>\r\n </mat-checkbox>\r\n</div>\r\n\r\n<ng-template #text>\r\n <ng-container\r\n *ngIf=\"\r\n element?.elementTypeDiscriminator === 'ServiceSpecificationGroupDto' || element?.elementTypeDiscriminator === 'PositionDto';\r\n else simpleText\r\n \"\r\n >\r\n {{ element | elementItemNumber }} - {{ element | elementText }}\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #simpleText>\r\n {{ element | elementText }}\r\n</ng-template>\r\n", styles: ["::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox{padding:0;flex:0 0 16px;width:16px;height:16px}::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__native-control{width:100%;height:100%}::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__ripple{opacity:0!important}::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__background{top:0;left:0;width:100%;height:100%}::ng-deep .ava-tree-item__checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:#fff!important}::ng-deep .ava-tree-item__checkbox .mdc-form-field>label{line-height:24px;padding-left:8px;-webkit-user-select:none;user-select:none}::ng-deep .ava-tree-item__checkbox .mat-mdc-checkbox-touch-target{width:16px!important;height:16px!important}.ava-tree-item{display:flex;align-items:center}.ava-tree-item__icon,.ava-tree-item__checkbox{flex-shrink:0}.ava-tree-item__text{flex-grow:1;-webkit-user-select:none;user-select:none;white-space:nowrap}.ava-tree-item__text.choose{color:red!important}\n"] }]
563
+ }], ctorParameters: function () { return [{ type: SelectElementService }, { type: i2.TreeNodeSelectionService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { element: [{
564
+ type: Input
565
+ }], expansionState: [{
566
+ type: Input
567
+ }], isSelectionMode: [{
568
+ type: Input
569
+ }] } });
570
+
571
+ class TreeNodeComponent {
572
+ constructor(selectElementService) {
573
+ this.selectElementService = selectElementService;
574
+ this.elementList = [];
575
+ this.indent = '';
576
+ this.expansionState = {};
577
+ this.isSelectionMode = false;
578
+ this.selectedColor = null;
579
+ this.selectedElement = null;
580
+ this.$destroy = new Subject();
581
+ }
582
+ ngOnInit() {
583
+ this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((element) => {
584
+ this.selectedElement = element;
585
+ });
586
+ }
587
+ ngOnDestroy() {
588
+ this.$destroy.next(true);
589
+ this.$destroy.complete();
590
+ }
591
+ getElements(element) {
592
+ return element.elements;
593
+ }
594
+ expand(element) {
595
+ this.expansionState[element.id] = !this.expansionState[element.id];
596
+ }
597
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: TreeNodeComponent, deps: [{ token: SelectElementService }], target: i0.ɵɵFactoryTarget.Component }); }
598
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: TreeNodeComponent, selector: "ava-tree-node", inputs: { elementList: "elementList", indent: "indent", expansionState: "expansionState", isSelectionMode: "isSelectionMode", selectedColor: "selectedColor" }, ngImport: i0, template: "<ng-container *ngFor=\"let element of elementList\">\r\n <div\r\n class=\"tree-node-wrapper\"\r\n [class.select]=\"!isSelectionMode && element.id === selectedElement?.id\"\r\n [style.background]=\"!isSelectionMode && element.id === selectedElement?.id ? selectedColor || '' : ''\"\r\n >\r\n <div class=\"tree-node-wrapper__content\">\r\n <mat-icon\r\n *ngIf=\"element.elementTypeDiscriminator === 'ServiceSpecificationGroupDto'; else nullIcon\"\r\n matRipple\r\n (click)=\"expand(element)\"\r\n class=\"tree-node__icon\"\r\n >\r\n {{ expansionState[element.id] ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n <ava-tree-item\r\n [element]=\"element\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n ></ava-tree-item>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"element.elementTypeDiscriminator === 'ServiceSpecificationGroupDto' && expansionState?.[element.id]\"\r\n [style.paddingLeft]=\"indent\"\r\n >\r\n <ava-tree-node\r\n [elementList]=\"getElements(element)\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n [indent]=\"indent\"\r\n ></ava-tree-node>\r\n </div>\r\n</ng-container>\r\n<ng-template #nullIcon>\r\n <mat-icon></mat-icon>\r\n</ng-template>\r\n", styles: [".tree-node-wrapper{display:flex;align-items:center}.tree-node-wrapper__content{flex:1 0 100%;display:flex}.tree-node__icon{flex-shrink:0}.select{background-color:var(--mdc-filled-text-field-caret-color);color:#fff}.select *{color:#fff}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4$1.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: TreeNodeComponent, selector: "ava-tree-node", inputs: ["elementList", "indent", "expansionState", "isSelectionMode", "selectedColor"] }, { kind: "component", type: TreeItemComponent, selector: "ava-tree-item", inputs: ["element", "expansionState", "isSelectionMode"] }] }); }
599
+ }
600
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: TreeNodeComponent, decorators: [{
601
+ type: Component,
602
+ args: [{ selector: 'ava-tree-node', template: "<ng-container *ngFor=\"let element of elementList\">\r\n <div\r\n class=\"tree-node-wrapper\"\r\n [class.select]=\"!isSelectionMode && element.id === selectedElement?.id\"\r\n [style.background]=\"!isSelectionMode && element.id === selectedElement?.id ? selectedColor || '' : ''\"\r\n >\r\n <div class=\"tree-node-wrapper__content\">\r\n <mat-icon\r\n *ngIf=\"element.elementTypeDiscriminator === 'ServiceSpecificationGroupDto'; else nullIcon\"\r\n matRipple\r\n (click)=\"expand(element)\"\r\n class=\"tree-node__icon\"\r\n >\r\n {{ expansionState[element.id] ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n <ava-tree-item\r\n [element]=\"element\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n ></ava-tree-item>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"element.elementTypeDiscriminator === 'ServiceSpecificationGroupDto' && expansionState?.[element.id]\"\r\n [style.paddingLeft]=\"indent\"\r\n >\r\n <ava-tree-node\r\n [elementList]=\"getElements(element)\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n [indent]=\"indent\"\r\n ></ava-tree-node>\r\n </div>\r\n</ng-container>\r\n<ng-template #nullIcon>\r\n <mat-icon></mat-icon>\r\n</ng-template>\r\n", styles: [".tree-node-wrapper{display:flex;align-items:center}.tree-node-wrapper__content{flex:1 0 100%;display:flex}.tree-node__icon{flex-shrink:0}.select{background-color:var(--mdc-filled-text-field-caret-color);color:#fff}.select *{color:#fff}\n"] }]
603
+ }], ctorParameters: function () { return [{ type: SelectElementService }]; }, propDecorators: { elementList: [{
604
+ type: Input
605
+ }], indent: [{
606
+ type: Input
607
+ }], expansionState: [{
608
+ type: Input
609
+ }], isSelectionMode: [{
610
+ type: Input
611
+ }], selectedColor: [{
612
+ type: Input
613
+ }] } });
614
+
615
+ class TreeStructureComponent {
616
+ constructor() {
617
+ this.serviceSpecification = null;
618
+ this.indent = '';
619
+ this.expansionState = {};
620
+ this.isSelectionMode = false;
621
+ this.selectedColor = null;
622
+ }
623
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: TreeStructureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
624
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: TreeStructureComponent, selector: "ava-tree-structure", inputs: { serviceSpecification: "serviceSpecification", indent: "indent", expansionState: "expansionState", isSelectionMode: "isSelectionMode", selectedColor: "selectedColor" }, ngImport: i0, template: "<ava-tree-node\r\n *ngIf=\"serviceSpecification?.elements\"\r\n [elementList]=\"serviceSpecification?.elements\"\r\n [indent]=\"indent\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n>\r\n</ava-tree-node>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TreeNodeComponent, selector: "ava-tree-node", inputs: ["elementList", "indent", "expansionState", "isSelectionMode", "selectedColor"] }] }); }
625
+ }
626
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: TreeStructureComponent, decorators: [{
627
+ type: Component,
628
+ args: [{ selector: 'ava-tree-structure', template: "<ava-tree-node\r\n *ngIf=\"serviceSpecification?.elements\"\r\n [elementList]=\"serviceSpecification?.elements\"\r\n [indent]=\"indent\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n>\r\n</ava-tree-node>\r\n" }]
629
+ }], propDecorators: { serviceSpecification: [{
630
+ type: Input
631
+ }], indent: [{
632
+ type: Input
633
+ }], expansionState: [{
634
+ type: Input
635
+ }], isSelectionMode: [{
636
+ type: Input
637
+ }], selectedColor: [{
638
+ type: Input
639
+ }] } });
640
+
641
+ class ListStructureComponent {
642
+ constructor(selectElementService) {
643
+ this.selectElementService = selectElementService;
644
+ this.filteredElementList = [];
645
+ this.isSelectionMode = false;
646
+ this.selectedColor = null;
647
+ this.selectedElement = null;
648
+ this.$destroy = new Subject();
649
+ }
650
+ ngOnInit() {
651
+ this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((element) => {
652
+ this.selectedElement = element;
653
+ });
654
+ }
655
+ ngOnDestroy() {
656
+ this.$destroy.next(true);
657
+ this.$destroy.complete();
658
+ }
659
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ListStructureComponent, deps: [{ token: SelectElementService }], target: i0.ɵɵFactoryTarget.Component }); }
660
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: ListStructureComponent, selector: "ava-list-structure", inputs: { filteredElementList: "filteredElementList", isSelectionMode: "isSelectionMode", selectedColor: "selectedColor" }, ngImport: i0, template: "<ng-container *ngFor=\"let element of filteredElementList\">\r\n <div\r\n [class.select]=\"!isSelectionMode && element.id === selectedElement?.id\"\r\n [style.background]=\"!isSelectionMode && element.id === selectedElement?.id ? selectedColor || '' : ''\"\r\n >\r\n <ava-tree-item\r\n [element]=\"element\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n ></ava-tree-item>\r\n </div>\r\n</ng-container>\r\n", styles: [".select{background:var(--mdc-filled-text-field-caret-color);color:#fff}.select *{color:#fff}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: TreeItemComponent, selector: "ava-tree-item", inputs: ["element", "expansionState", "isSelectionMode"] }] }); }
661
+ }
662
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: ListStructureComponent, decorators: [{
663
+ type: Component,
664
+ args: [{ selector: 'ava-list-structure', template: "<ng-container *ngFor=\"let element of filteredElementList\">\r\n <div\r\n [class.select]=\"!isSelectionMode && element.id === selectedElement?.id\"\r\n [style.background]=\"!isSelectionMode && element.id === selectedElement?.id ? selectedColor || '' : ''\"\r\n >\r\n <ava-tree-item\r\n [element]=\"element\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n ></ava-tree-item>\r\n </div>\r\n</ng-container>\r\n", styles: [".select{background:var(--mdc-filled-text-field-caret-color);color:#fff}.select *{color:#fff}\n"] }]
665
+ }], ctorParameters: function () { return [{ type: SelectElementService }]; }, propDecorators: { filteredElementList: [{
666
+ type: Input
667
+ }], isSelectionMode: [{
668
+ type: Input
669
+ }], selectedColor: [{
670
+ type: Input
671
+ }] } });
672
+
673
+ class TableStructureComponent {
674
+ constructor(selectElementService, treeNodeSelectionService, cdr) {
675
+ this.selectElementService = selectElementService;
676
+ this.treeNodeSelectionService = treeNodeSelectionService;
677
+ this.cdr = cdr;
678
+ this.filteredElementList = [];
679
+ this.isSelectionMode = false;
680
+ this.addTableColumns = [];
681
+ this.selectedColor = null;
682
+ this.displayedColumns = [];
683
+ this.isAllowOneClick = true;
684
+ this.selectedElement = null;
685
+ this.preselectedElement = null;
686
+ this.timerStop = null;
687
+ this.checkedElements = {};
688
+ this.$destroy = new Subject();
689
+ }
690
+ ngOnInit() {
691
+ this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((element) => {
692
+ this.selectedElement = element;
693
+ });
694
+ this.selectElementService.preselectedElement.pipe(takeUntil(this.$destroy)).subscribe((element) => {
695
+ this.preselectedElement = element;
696
+ });
697
+ if (this.isSelectionMode) {
698
+ this.displayedColumns = ['icon', 'checkbox', 'itemNumber', 'text', ...this.addTableColumns.map((item) => item.name)];
699
+ this.treeNodeSelectionService.treeNodeSelecting.pipe(takeUntil(this.$destroy)).subscribe((treeNodeSelecting) => {
700
+ this.checkedElements = treeNodeSelecting;
701
+ this.cdr.detectChanges();
702
+ });
703
+ }
704
+ else {
705
+ this.displayedColumns = ['icon', 'itemNumber', 'text', ...this.addTableColumns.map((item) => item.name)];
706
+ }
707
+ }
708
+ ngOnDestroy() {
709
+ this.timerStop && clearTimeout(this.timerStop);
710
+ this.$destroy.next(true);
711
+ this.$destroy.complete();
712
+ }
713
+ select(row) {
714
+ if (this.isSelectionMode) {
715
+ return;
716
+ }
717
+ if (this.isAllowOneClick) {
718
+ this.isAllowOneClick = false;
719
+ this.timerStop = setTimeout(() => {
720
+ this.selectElementService.setClickElement(this.selectedElement?.id === row.id ? null : row);
721
+ this.isAllowOneClick = true;
722
+ }, 300);
723
+ }
724
+ }
725
+ dblSelect(row) {
726
+ if (this.isSelectionMode) {
727
+ return;
728
+ }
729
+ this.timerStop && clearTimeout(this.timerStop);
730
+ this.selectElementService.setDblClickElement(row);
731
+ this.isAllowOneClick = true;
732
+ }
733
+ openContextMenu(event, row) {
734
+ event.preventDefault();
735
+ this.selectElementService.setContextMenuElement({ position: { x: `${event.x}px`, y: `${event.y}px` }, node: row });
736
+ }
737
+ changeSelecting(element, event) {
738
+ this.treeNodeSelectionService.changeSelecting(event, element.id);
739
+ }
740
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: TableStructureComponent, deps: [{ token: SelectElementService }, { token: i2.TreeNodeSelectionService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
741
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: TableStructureComponent, selector: "ava-table-structure", inputs: { functionView: "functionView", filteredElementList: "filteredElementList", isSelectionMode: "isSelectionMode", addTableColumns: "addTableColumns", selectedColor: "selectedColor" }, ngImport: i0, template: "<table\r\n mat-table\r\n [dataSource]=\"filteredElementList\"\r\n>\r\n <ng-container matColumnDef=\"icon\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n ></th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n class=\"table-cell-small-width\"\r\n >\r\n <mat-icon\r\n class=\"icon-element\"\r\n tdChangingIconView\r\n >\r\n {{ row | elementIconName }}\r\n </mat-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"checkbox\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n ></th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let element\"\r\n class=\"table-cell-small-width\"\r\n >\r\n <mat-checkbox\r\n class=\"checkbox\"\r\n color=\"primary\"\r\n [indeterminate]=\"checkedElements[element.id].indeterminate\"\r\n [(ngModel)]=\"checkedElements[element.id].checked\"\r\n (ngModelChange)=\"changeSelecting(element, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"itemNumber\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n >\r\n OZ\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n [style.width.ch]=\"row?.itemNumber?.stringRepresentation.length\"\r\n >\r\n <div\r\n class=\"text-element\"\r\n tdChangingTextView\r\n >\r\n {{ row | elementItemNumber }}\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"text\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n >\r\n Text\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n class=\"table-text\"\r\n >\r\n <div\r\n class=\"text-element\"\r\n tdChangingTextView\r\n >\r\n {{ row | elementText }}\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let oneColumn of addTableColumns\">\r\n <ng-container matColumnDef=\"{{ oneColumn.name }}\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n >\r\n {{ oneColumn.title }}\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n >\r\n <div\r\n [style.textAlign]=\"oneColumn.align\"\r\n tdChangingTextView\r\n >\r\n {{ !oneColumn.numberFormat ? row[oneColumn.name] : (row[oneColumn.name] | number: oneColumn.numberFormat) }}\r\n </div>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <tr\r\n mat-header-row\r\n *matHeaderRowDef=\"displayedColumns; sticky: true\"\r\n class=\"mat-header-row\"\r\n ></tr>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: displayedColumns\"\r\n (click)=\"select(row)\"\r\n (dblclick)=\"dblSelect(row)\"\r\n (contextmenu)=\"openContextMenu($event, row)\"\r\n [ngClass]=\"{\r\n choose: !isSelectionMode && row.id === preselectedElement?.id,\r\n select: !isSelectionMode && row.id === selectedElement?.id\r\n }\"\r\n [style.background]=\"!isSelectionMode && row.id === selectedElement?.id ? selectedColor || '' : ''\"\r\n [id]=\"row.id\"\r\n trSaveChangingView\r\n ></tr>\r\n</table>\r\n", styles: ["table{width:100%}table tr.mat-mdc-row,table tr.mat-mdc-header-row{height:24px}table tr input{box-sizing:border-box;padding:0 3px;outline:none;border:none;height:20px;width:calc(100% - 2px)}table tr input:focus{background:#fff!important}table tr .right{text-align:right}table tr td,table tr th{border-right:1px solid #777;border-bottom:1px solid #777;padding:0}table tr td:first-child,table tr th:first-child{border-left:1px solid #777}table tr td.min-width,table tr th.min-width{width:12ch;min-width:12ch}table tr td div,table tr th div{padding:0 3px}table tr th{border-top:1px solid #777;padding:0 3px}.table-text{overflow-x:hidden;position:relative}.table-text div{position:absolute;top:50%;left:0;white-space:nowrap;transform:translateY(-50%)}.select{background:var(--mdc-filled-text-field-caret-color);color:#fff}.select *{color:#fff}.choose div{color:red!important}::ng-deep .checkbox .mdc-form-field .mdc-checkbox{padding:0;flex:0 0 16px;width:16px;height:16px}::ng-deep .checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__native-control{width:100%;height:100%}::ng-deep .checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__ripple{opacity:0!important}::ng-deep .checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__background{top:0;left:0;width:100%;height:100%}::ng-deep .checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:#fff!important}::ng-deep .checkbox .mdc-form-field>label{line-height:24px;padding-left:8px;-webkit-user-select:none;user-select:none}.text-element{-webkit-user-select:none;user-select:none}.table-cell-small-width{width:24px;min-width:24px;position:relative;text-align:center}.table-cell-small-width .icon-element{position:absolute;top:0;left:0}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: SaveChangingViewDirective, selector: "[trSaveChangingView]" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: ElementIconNamePipe, name: "elementIconName" }, { kind: "pipe", type: ElementTextPipe, name: "elementText" }, { kind: "pipe", type: ElementItemNumberPipe, name: "elementItemNumber" }] }); }
742
+ }
743
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: TableStructureComponent, decorators: [{
744
+ type: Component,
745
+ args: [{ selector: 'ava-table-structure', template: "<table\r\n mat-table\r\n [dataSource]=\"filteredElementList\"\r\n>\r\n <ng-container matColumnDef=\"icon\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n ></th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n class=\"table-cell-small-width\"\r\n >\r\n <mat-icon\r\n class=\"icon-element\"\r\n tdChangingIconView\r\n >\r\n {{ row | elementIconName }}\r\n </mat-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"checkbox\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n ></th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let element\"\r\n class=\"table-cell-small-width\"\r\n >\r\n <mat-checkbox\r\n class=\"checkbox\"\r\n color=\"primary\"\r\n [indeterminate]=\"checkedElements[element.id].indeterminate\"\r\n [(ngModel)]=\"checkedElements[element.id].checked\"\r\n (ngModelChange)=\"changeSelecting(element, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"itemNumber\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n >\r\n OZ\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n [style.width.ch]=\"row?.itemNumber?.stringRepresentation.length\"\r\n >\r\n <div\r\n class=\"text-element\"\r\n tdChangingTextView\r\n >\r\n {{ row | elementItemNumber }}\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"text\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n >\r\n Text\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n class=\"table-text\"\r\n >\r\n <div\r\n class=\"text-element\"\r\n tdChangingTextView\r\n >\r\n {{ row | elementText }}\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let oneColumn of addTableColumns\">\r\n <ng-container matColumnDef=\"{{ oneColumn.name }}\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n >\r\n {{ oneColumn.title }}\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n >\r\n <div\r\n [style.textAlign]=\"oneColumn.align\"\r\n tdChangingTextView\r\n >\r\n {{ !oneColumn.numberFormat ? row[oneColumn.name] : (row[oneColumn.name] | number: oneColumn.numberFormat) }}\r\n </div>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <tr\r\n mat-header-row\r\n *matHeaderRowDef=\"displayedColumns; sticky: true\"\r\n class=\"mat-header-row\"\r\n ></tr>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: displayedColumns\"\r\n (click)=\"select(row)\"\r\n (dblclick)=\"dblSelect(row)\"\r\n (contextmenu)=\"openContextMenu($event, row)\"\r\n [ngClass]=\"{\r\n choose: !isSelectionMode && row.id === preselectedElement?.id,\r\n select: !isSelectionMode && row.id === selectedElement?.id\r\n }\"\r\n [style.background]=\"!isSelectionMode && row.id === selectedElement?.id ? selectedColor || '' : ''\"\r\n [id]=\"row.id\"\r\n trSaveChangingView\r\n ></tr>\r\n</table>\r\n", styles: ["table{width:100%}table tr.mat-mdc-row,table tr.mat-mdc-header-row{height:24px}table tr input{box-sizing:border-box;padding:0 3px;outline:none;border:none;height:20px;width:calc(100% - 2px)}table tr input:focus{background:#fff!important}table tr .right{text-align:right}table tr td,table tr th{border-right:1px solid #777;border-bottom:1px solid #777;padding:0}table tr td:first-child,table tr th:first-child{border-left:1px solid #777}table tr td.min-width,table tr th.min-width{width:12ch;min-width:12ch}table tr td div,table tr th div{padding:0 3px}table tr th{border-top:1px solid #777;padding:0 3px}.table-text{overflow-x:hidden;position:relative}.table-text div{position:absolute;top:50%;left:0;white-space:nowrap;transform:translateY(-50%)}.select{background:var(--mdc-filled-text-field-caret-color);color:#fff}.select *{color:#fff}.choose div{color:red!important}::ng-deep .checkbox .mdc-form-field .mdc-checkbox{padding:0;flex:0 0 16px;width:16px;height:16px}::ng-deep .checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__native-control{width:100%;height:100%}::ng-deep .checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__ripple{opacity:0!important}::ng-deep .checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__background{top:0;left:0;width:100%;height:100%}::ng-deep .checkbox .mdc-form-field .mdc-checkbox .mdc-checkbox__background .mdc-checkbox__mixedmark{border-color:#fff!important}::ng-deep .checkbox .mdc-form-field>label{line-height:24px;padding-left:8px;-webkit-user-select:none;user-select:none}.text-element{-webkit-user-select:none;user-select:none}.table-cell-small-width{width:24px;min-width:24px;position:relative;text-align:center}.table-cell-small-width .icon-element{position:absolute;top:0;left:0}\n"] }]
746
+ }], ctorParameters: function () { return [{ type: SelectElementService }, { type: i2.TreeNodeSelectionService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { functionView: [{
747
+ type: Input
748
+ }], filteredElementList: [{
749
+ type: Input
750
+ }], isSelectionMode: [{
751
+ type: Input
752
+ }], addTableColumns: [{
753
+ type: Input
754
+ }], selectedColor: [{
755
+ type: Input
756
+ }] } });
757
+
758
+ class AvaTreeComponent {
759
+ /**With this parameter, we can configure which keys will be listen to switch the tree elements,
760
+ * and also to disable the functionality of the keys */
761
+ set customKeyboardOperationConfig(config) {
762
+ this.keyboardOperationService.mergeConfigOperation(config);
763
+ }
764
+ // ***************************************************
765
+ // functionView: Array of objects
766
+ // {
767
+ // name: string, // name of view part: you can add/remove it when it need
768
+ // func: (element: any, result?: any) => boolean, // this filter function calculate condition to change view
769
+ // view: {
770
+ // iconName?: string, // changed name of icon
771
+ // iconColor?: string, // changed color of icon
772
+ // textBold?: string, // changed weight of text
773
+ // textColor?: string // changed color of text
774
+ // }
775
+ // }
776
+ // ****************************************************
777
+ set textWords(words) {
778
+ this._textWords = { ...this.textWords, ...words };
779
+ } // allow to translate all texts to other language
780
+ get textWords() {
781
+ return this._textWords;
782
+ }
783
+ constructor(flatElementsService, selectElementService, treeNodeSelectionService, expandParentGroupService, keyboardOperationService, ngZone) {
784
+ this.flatElementsService = flatElementsService;
785
+ this.selectElementService = selectElementService;
786
+ this.treeNodeSelectionService = treeNodeSelectionService;
787
+ this.expandParentGroupService = expandParentGroupService;
788
+ this.keyboardOperationService = keyboardOperationService;
789
+ this.ngZone = ngZone;
790
+ this.project = null; // main data
791
+ this.expansionState = {}; // object with expanded groups at the begin
792
+ this.selectedNodeId = null; // id if selected element at the begin
793
+ this.indent = '20px'; // optional - for changing indents each group
794
+ this.selectedColor = null; // optional - for changing background of selected line (default: primary form MaterialUI)
795
+ this.modeView = ModeViewType.Tree; // structure view: Tree(default) / List / Table
796
+ this.limitedControl = true; // use keyboard only if cursor is over of tree
797
+ this.isSelectionMode = false; // mode for selecting by checkbox
798
+ this.selectingElements = null; // optional - selected elements at the begin
799
+ this.listFilterFunc = DEFAULT_FILTERS; // allow to program filtering by filter function: (element: any, filter: string) => boolean
800
+ this.addTableColumns = []; // optional - allow to add displayed columns for table
801
+ // ***************************************************
802
+ // addTableColumns: Array of objects
803
+ // {
804
+ // name: string, // name of column
805
+ // title: string, // showed title of column
806
+ // align?: string, // optional alight: left(default) / center / right
807
+ // numberFormat?: string // optional format of number value, example: '1.2-2'
808
+ // }
809
+ // ***************************************************
810
+ this.functionView = null; // allow to program view for each element by filter
811
+ this._textWords = null;
812
+ // *******************************************************
813
+ // {
814
+ // textSearch: string,
815
+ // textNothing: string,
816
+ // textNothingFiltered: string,
817
+ // textAll: string,
818
+ // tooltipAllOpen: string,
819
+ // tooltipAllClose: string,
820
+ // tooltipAllAdd:string,
821
+ // tooltipAllRemove: string,
822
+ // }
823
+ // ********************************************************
824
+ this.selectClick = new EventEmitter(); // event after element selected by click
825
+ this.selectDblClick = new EventEmitter(); // event after element selected by double click
826
+ this.contextMenuEvent = new EventEmitter(); // event after element call context menu by right button click
827
+ this.selectedElementsChanged = new EventEmitter(); // event after changed selecting in selecting mode
828
+ this.selectedElement = null;
829
+ this.isListenKeyboard = false;
830
+ this.isEmiteSelectedElements = false;
831
+ this.selectingElementsTreeData = [];
832
+ this.flatElements = null;
833
+ this.preselectedElement = null;
834
+ this.filterInput = '';
835
+ this.listModeViewType = ModeViewType;
836
+ this.filter = '';
837
+ this.$filter = new ReplaySubject(1);
838
+ this.filteredElementList = [];
839
+ this.$destroy = new Subject();
840
+ this._textWords = { ...DEFAULT_TEXT_WORDS };
841
+ }
842
+ ngOnInit() {
843
+ this.selectElementService.preselectedElement.pipe(takeUntil(this.$destroy)).subscribe((e) => (this.preselectedElement = e));
844
+ this.selectElementService.selectClickElement.pipe(takeUntil(this.$destroy)).subscribe((e) => {
845
+ this.selectedElement = e;
846
+ this.selectClick.emit(e);
847
+ });
848
+ this.selectElementService.selectDblClickElement.pipe(takeUntil(this.$destroy)).subscribe((e) => this.selectDblClick.emit(e));
849
+ this.selectElementService.selectContextMenuElement.pipe(takeUntil(this.$destroy)).subscribe((e) => this.contextMenuEvent.emit(e));
850
+ this.flatElementsService.flatElementsDto.pipe(takeUntil(this.$destroy)).subscribe((e) => {
851
+ this.flatElements = e;
852
+ this.getFilteredList();
853
+ });
854
+ this.$filter.pipe(takeUntil(this.$destroy), debounceTime(250)).subscribe((filter) => {
855
+ this.filter = filter;
856
+ this.getFilteredList();
857
+ });
858
+ }
859
+ ngAfterViewInit() {
860
+ this.initializeEventListeners();
861
+ }
862
+ ngOnChanges(changes) {
863
+ this.flatElementsService.listFilterFunc = this.listFilterFunc;
864
+ this.flatElementsService.functionView = this.functionView;
865
+ if (changes['project'] && this.project?.serviceSpecifications?.[0]) {
866
+ this.serviceSpecification = this.project.serviceSpecifications[0];
867
+ this.flatElementsService.setElementsDto(this.serviceSpecification);
868
+ if (this.isSelectionMode) {
869
+ this.selectingElementsTreeData = this.treeNodeSelectionService.loadSelectingElements(this.serviceSpecification.elements);
870
+ this.treeNodeSelectionService.treeNodeSelecting.pipe(takeUntil(this.$destroy)).subscribe(() => {
871
+ if (this.isEmiteSelectedElements) {
872
+ setTimeout(() => {
873
+ const selectingTree = this.treeNodeSelectionService.getTreeRoot(this.selectingElementsTreeData);
874
+ this.selectedElementsChanged.emit(selectingTree);
875
+ }, 0);
876
+ }
877
+ });
878
+ }
879
+ }
880
+ if ((changes['selectedNodeId'] && this.project) || changes['project']) {
881
+ this.flatElementsService.getOneElementById(this.selectedNodeId).subscribe((e) => {
882
+ if (e) {
883
+ this.selectElementService.setClickElement(e);
884
+ }
885
+ });
886
+ }
887
+ if (this.isSelectionMode && (changes['selectingElements'] || changes['project'])) {
888
+ this.formSelectingList();
889
+ }
890
+ }
891
+ ngOnDestroy() {
892
+ this.$destroy.next(true);
893
+ this.$destroy.complete();
894
+ }
895
+ mouseOver() {
896
+ if (!this.isListenKeyboard) {
897
+ this.isListenKeyboard = true;
898
+ this.avaTreeFilterInput?.nativeElement.focus();
899
+ }
900
+ }
901
+ mouseOut() {
902
+ this.isListenKeyboard = false;
903
+ }
904
+ handleGlobalKeyboardEvent(event) {
905
+ this.ngZone.run(() => {
906
+ const keyEvent = event;
907
+ if (!this.limitedControl || this.isListenKeyboard) {
908
+ const element = this.preselectedElement || this.selectedElement;
909
+ const { operation, nextElement } = this.keyboardOperationService.handleKeyboardEvent(keyEvent, element) || {};
910
+ switch (operation) {
911
+ case KeyboardOperationType.MoveSelectedPositionUp:
912
+ this.showElement(nextElement, '.select');
913
+ break;
914
+ case KeyboardOperationType.MoveSelectedPositionDown:
915
+ this.showElement(nextElement, '.select');
916
+ break;
917
+ case KeyboardOperationType.MoveChosenPositionDown:
918
+ this.showElement(nextElement, nextElement?.id === this.selectedElement?.id ? '.select' : '.choose');
919
+ break;
920
+ case KeyboardOperationType.MoveChosenPositionUp:
921
+ this.showElement(nextElement, nextElement?.id === this.selectedElement?.id ? '.select' : '.choose');
922
+ break;
923
+ default:
924
+ break;
925
+ }
926
+ }
927
+ });
928
+ }
929
+ showElement(element, nameQuery) {
930
+ if (element) {
931
+ if (this.modeView === ModeViewType.Tree) {
932
+ this.expandParentGroups(element);
933
+ }
934
+ setTimeout(() => this.scrollLine(nameQuery), 0);
935
+ }
936
+ }
937
+ scrollLine(nameQuery) {
938
+ const parentRect = this.avaTreeWrapper?.nativeElement.getBoundingClientRect();
939
+ const showedElement = this.avaTreeWrapper?.nativeElement.querySelector(nameQuery);
940
+ if (!showedElement) {
941
+ return;
942
+ }
943
+ const childRect = showedElement.getBoundingClientRect();
944
+ if (childRect.bottom > parentRect.bottom ||
945
+ childRect.top < parentRect.top ||
946
+ (this.modeView === ModeViewType.Table && childRect.top < parentRect.top + 24)) {
947
+ showedElement?.scrollIntoView();
948
+ this.avaTreeWrapper?.nativeElement.scrollTo({ left: 0 });
949
+ if (this.modeView === ModeViewType.Table) {
950
+ setTimeout(() => this.correctScrollTableLine(showedElement, parentRect), 0);
951
+ }
952
+ }
953
+ }
954
+ correctScrollTableLine(showedElement, parentRect) {
955
+ const childRect = showedElement.getBoundingClientRect();
956
+ if (childRect.top < parentRect.top + 24) {
957
+ this.avaTreeWrapper.nativeElement.scrollTop -= 24;
958
+ }
959
+ }
960
+ expandParentGroups(element) {
961
+ this.expandParentGroupService.expandParentGroups(element, this.flatElements, this.expansionState);
962
+ }
963
+ onFilter(value) {
964
+ this.$filter.next(value);
965
+ }
966
+ expandedAllElements(isExpand) {
967
+ if (!isExpand) {
968
+ Object.keys(this.expansionState).forEach((id) => delete this.expansionState[id]);
969
+ }
970
+ else {
971
+ this.flatElements?.forEach((item) => {
972
+ if (item.elementTypeDiscriminator === 'ServiceSpecificationGroupDto') {
973
+ this.expansionState[item.id] = true;
974
+ }
975
+ });
976
+ }
977
+ }
978
+ formSelectingList() {
979
+ this.isEmiteSelectedElements = false;
980
+ if (!this.selectingElements) {
981
+ this.isEmiteSelectedElements = true;
982
+ return;
983
+ }
984
+ this.treeNodeSelectionService.getFlatSelectedListId(this.selectingElements);
985
+ this.treeNodeSelectionService.flatSelectedListId.forEach((id, index) => {
986
+ this.treeNodeSelectionService.changeSelecting(true, id);
987
+ if (index === this.treeNodeSelectionService.flatSelectedListId.length - 1) {
988
+ this.isEmiteSelectedElements = true;
989
+ }
990
+ });
991
+ }
992
+ selectOrDeselectAll(value) {
993
+ this.treeNodeSelectionService.changeAll(value);
994
+ }
995
+ getFilteredList() {
996
+ if (this.flatElements?.length) {
997
+ if (!this.filter) {
998
+ this.filteredElementList = this.flatElements;
999
+ }
1000
+ else {
1001
+ this.filteredElementList = this.flatElements.filter((item) => this.flatElementsService.checkFilterValue(item, this.filter));
1002
+ }
1003
+ }
1004
+ }
1005
+ initializeEventListeners() {
1006
+ this.ngZone.runOutsideAngular(() => {
1007
+ fromEvent(this.avaMainWrapper.nativeElement, 'mouseleave')
1008
+ .pipe(takeUntil(this.$destroy))
1009
+ .subscribe(() => {
1010
+ this.mouseOut();
1011
+ });
1012
+ fromEvent(this.avaMainWrapper.nativeElement, 'mouseenter')
1013
+ .pipe(takeUntil(this.$destroy))
1014
+ .subscribe(() => {
1015
+ this.mouseOver();
1016
+ });
1017
+ if (!this.isSelectionMode) {
1018
+ fromEvent(document, 'keydown')
1019
+ .pipe(takeUntil(this.$destroy), filter(() => !this.limitedControl || this.isListenKeyboard))
1020
+ .subscribe((event) => {
1021
+ this.handleGlobalKeyboardEvent(event);
1022
+ });
1023
+ }
1024
+ });
1025
+ }
1026
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AvaTreeComponent, deps: [{ token: FlatElementsService, self: true }, { token: SelectElementService, self: true }, { token: i2.TreeNodeSelectionService, self: true }, { token: i4$2.ExpandParentGroupService, self: true }, { token: i5$1.KeyboardOperationService, self: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
1027
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.6", type: AvaTreeComponent, selector: "ava-ava-tree", inputs: { project: "project", expansionState: "expansionState", selectedNodeId: "selectedNodeId", indent: "indent", selectedColor: "selectedColor", modeView: "modeView", customKeyboardOperationConfig: "customKeyboardOperationConfig", limitedControl: "limitedControl", isSelectionMode: "isSelectionMode", selectingElements: "selectingElements", listFilterFunc: "listFilterFunc", addTableColumns: "addTableColumns", functionView: "functionView", textWords: "textWords" }, outputs: { selectClick: "selectClick", selectDblClick: "selectDblClick", contextMenuEvent: "contextMenuEvent", selectedElementsChanged: "selectedElementsChanged" }, providers: [FlatElementsService, SelectElementService, TreeNodeSelectionService, ExpandParentGroupService, KeyboardOperationService], viewQueries: [{ propertyName: "avaTreeWrapper", first: true, predicate: ["avaTreeWrapper"], descendants: true }, { propertyName: "avaMainWrapper", first: true, predicate: ["avaMainWrapper"], descendants: true }, { propertyName: "avaTreeFilterInput", first: true, predicate: ["avaTreeFilterInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"main-wrapper\"\r\n #avaMainWrapper\r\n>\r\n <div\r\n class=\"control\"\r\n #control\r\n >\r\n <mat-form-field class=\"control-filter\">\r\n <mat-label>{{ textWords?.textSearch }}</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"filterInput\"\r\n (ngModelChange)=\"onFilter($event)\"\r\n #avaTreeFilterInput\r\n />\r\n </mat-form-field>\r\n <ng-container *ngIf=\"modeView === listModeViewType.Tree\">\r\n <button\r\n class=\"control-icon\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"expandedAllElements(true)\"\r\n [matTooltip]=\"textWords?.tooltipAllOpen || ''\"\r\n >\r\n <mat-icon class=\"layer-background\">layers</mat-icon>\r\n <mat-icon class=\"layer-icon\">add</mat-icon>\r\n </button>\r\n <button\r\n class=\"control-icon\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"expandedAllElements(false)\"\r\n [matTooltip]=\"textWords?.tooltipAllClose || ''\"\r\n >\r\n <mat-icon class=\"layer-background\">layers</mat-icon>\r\n <mat-icon class=\"layer-icon\">remove</mat-icon>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"isSelectionMode\">\r\n <button\r\n mat-raised-button\r\n (click)=\"selectOrDeselectAll(true)\"\r\n [matTooltip]=\"textWords?.tooltipAllAdd || ''\"\r\n class=\"control-button\"\r\n >\r\n <mat-icon>add</mat-icon>\r\n <span>{{ textWords?.textAll }}</span>\r\n </button>\r\n <button\r\n mat-raised-button\r\n (click)=\"selectOrDeselectAll(false)\"\r\n [matTooltip]=\"textWords?.tooltipAllRemove || ''\"\r\n class=\"control-button\"\r\n >\r\n <mat-icon>remove</mat-icon>\r\n <span>{{ textWords?.textAll }}</span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n <div\r\n [style.height]=\"'calc(100% - ' + control.offsetHeight + 'px)'\"\r\n class=\"ava-tree-wrapper\"\r\n #avaTreeWrapper\r\n >\r\n <ng-container *ngIf=\"flatElements?.length; else nothing\">\r\n <ng-container *ngIf=\"filteredElementList?.length; else nothingFiltered\">\r\n <ava-tree-structure\r\n *ngIf=\"modeView === listModeViewType.Tree && !avaTreeFilterInput.value\"\r\n [serviceSpecification]=\"serviceSpecification\"\r\n [indent]=\"indent\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-tree-structure>\r\n <ava-list-structure\r\n *ngIf=\"modeView === listModeViewType.List || (modeView === listModeViewType.Tree && avaTreeFilterInput.value)\"\r\n [filteredElementList]=\"filteredElementList\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-list-structure>\r\n <ava-table-structure\r\n *ngIf=\"modeView === listModeViewType.Table\"\r\n [filteredElementList]=\"filteredElementList\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [addTableColumns]=\"addTableColumns\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-table-structure>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n<ng-template #nothing>\r\n {{ textWords?.textNothing }}\r\n</ng-template>\r\n<ng-template #nothingFiltered>\r\n {{ textWords?.textNothingFiltered }}\r\n</ng-template>\r\n", styles: [".main-wrapper{max-height:100%;height:100%;overflow-y:auto;overflow-x:hidden}.control{display:flex;align-items:center;gap:5px;padding:4px}.control-filter{flex-grow:1}.control-icon{width:36px;height:36px;padding:0}.control-button{padding:0 5px}.ava-tree-wrapper{overflow-y:auto;overflow-x:hidden}::ng-deep .control .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .control .control-filter .mat-mdc-form-field-infix{min-height:auto;padding-top:10px;padding-bottom:2px}::ng-deep .control .control-filter .mat-mdc-floating-label{top:18px}::ng-deep .control .control-filter .mdc-text-field{padding:0 6px}.layer-background{font-size:36px;width:36px;height:36px}.layer-icon{width:36px;height:36px;position:absolute;inset:1px 0 0;color:#fff}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.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: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.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: i11.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: TreeStructureComponent, selector: "ava-tree-structure", inputs: ["serviceSpecification", "indent", "expansionState", "isSelectionMode", "selectedColor"] }, { kind: "component", type: ListStructureComponent, selector: "ava-list-structure", inputs: ["filteredElementList", "isSelectionMode", "selectedColor"] }, { kind: "component", type: TableStructureComponent, selector: "ava-table-structure", inputs: ["functionView", "filteredElementList", "isSelectionMode", "addTableColumns", "selectedColor"] }] }); }
1028
+ }
1029
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AvaTreeComponent, decorators: [{
1030
+ type: Component,
1031
+ args: [{ selector: 'ava-ava-tree', providers: [FlatElementsService, SelectElementService, TreeNodeSelectionService, ExpandParentGroupService, KeyboardOperationService], template: "<div\r\n class=\"main-wrapper\"\r\n #avaMainWrapper\r\n>\r\n <div\r\n class=\"control\"\r\n #control\r\n >\r\n <mat-form-field class=\"control-filter\">\r\n <mat-label>{{ textWords?.textSearch }}</mat-label>\r\n <input\r\n matInput\r\n [ngModel]=\"filterInput\"\r\n (ngModelChange)=\"onFilter($event)\"\r\n #avaTreeFilterInput\r\n />\r\n </mat-form-field>\r\n <ng-container *ngIf=\"modeView === listModeViewType.Tree\">\r\n <button\r\n class=\"control-icon\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"expandedAllElements(true)\"\r\n [matTooltip]=\"textWords?.tooltipAllOpen || ''\"\r\n >\r\n <mat-icon class=\"layer-background\">layers</mat-icon>\r\n <mat-icon class=\"layer-icon\">add</mat-icon>\r\n </button>\r\n <button\r\n class=\"control-icon\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"expandedAllElements(false)\"\r\n [matTooltip]=\"textWords?.tooltipAllClose || ''\"\r\n >\r\n <mat-icon class=\"layer-background\">layers</mat-icon>\r\n <mat-icon class=\"layer-icon\">remove</mat-icon>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"isSelectionMode\">\r\n <button\r\n mat-raised-button\r\n (click)=\"selectOrDeselectAll(true)\"\r\n [matTooltip]=\"textWords?.tooltipAllAdd || ''\"\r\n class=\"control-button\"\r\n >\r\n <mat-icon>add</mat-icon>\r\n <span>{{ textWords?.textAll }}</span>\r\n </button>\r\n <button\r\n mat-raised-button\r\n (click)=\"selectOrDeselectAll(false)\"\r\n [matTooltip]=\"textWords?.tooltipAllRemove || ''\"\r\n class=\"control-button\"\r\n >\r\n <mat-icon>remove</mat-icon>\r\n <span>{{ textWords?.textAll }}</span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n <div\r\n [style.height]=\"'calc(100% - ' + control.offsetHeight + 'px)'\"\r\n class=\"ava-tree-wrapper\"\r\n #avaTreeWrapper\r\n >\r\n <ng-container *ngIf=\"flatElements?.length; else nothing\">\r\n <ng-container *ngIf=\"filteredElementList?.length; else nothingFiltered\">\r\n <ava-tree-structure\r\n *ngIf=\"modeView === listModeViewType.Tree && !avaTreeFilterInput.value\"\r\n [serviceSpecification]=\"serviceSpecification\"\r\n [indent]=\"indent\"\r\n [expansionState]=\"expansionState\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-tree-structure>\r\n <ava-list-structure\r\n *ngIf=\"modeView === listModeViewType.List || (modeView === listModeViewType.Tree && avaTreeFilterInput.value)\"\r\n [filteredElementList]=\"filteredElementList\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-list-structure>\r\n <ava-table-structure\r\n *ngIf=\"modeView === listModeViewType.Table\"\r\n [filteredElementList]=\"filteredElementList\"\r\n [isSelectionMode]=\"isSelectionMode\"\r\n [addTableColumns]=\"addTableColumns\"\r\n [selectedColor]=\"selectedColor\"\r\n >\r\n </ava-table-structure>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n<ng-template #nothing>\r\n {{ textWords?.textNothing }}\r\n</ng-template>\r\n<ng-template #nothingFiltered>\r\n {{ textWords?.textNothingFiltered }}\r\n</ng-template>\r\n", styles: [".main-wrapper{max-height:100%;height:100%;overflow-y:auto;overflow-x:hidden}.control{display:flex;align-items:center;gap:5px;padding:4px}.control-filter{flex-grow:1}.control-icon{width:36px;height:36px;padding:0}.control-button{padding:0 5px}.ava-tree-wrapper{overflow-y:auto;overflow-x:hidden}::ng-deep .control .mat-mdc-form-field-subscript-wrapper{display:none}::ng-deep .control .control-filter .mat-mdc-form-field-infix{min-height:auto;padding-top:10px;padding-bottom:2px}::ng-deep .control .control-filter .mat-mdc-floating-label{top:18px}::ng-deep .control .control-filter .mdc-text-field{padding:0 6px}.layer-background{font-size:36px;width:36px;height:36px}.layer-icon{width:36px;height:36px;position:absolute;inset:1px 0 0;color:#fff}\n"] }]
1032
+ }], ctorParameters: function () { return [{ type: FlatElementsService, decorators: [{
1033
+ type: Self
1034
+ }] }, { type: SelectElementService, decorators: [{
1035
+ type: Self
1036
+ }] }, { type: i2.TreeNodeSelectionService, decorators: [{
1037
+ type: Self
1038
+ }] }, { type: i4$2.ExpandParentGroupService, decorators: [{
1039
+ type: Self
1040
+ }] }, { type: i5$1.KeyboardOperationService, decorators: [{
1041
+ type: Self
1042
+ }] }, { type: i0.NgZone }]; }, propDecorators: { project: [{
1043
+ type: Input
1044
+ }], expansionState: [{
1045
+ type: Input
1046
+ }], selectedNodeId: [{
1047
+ type: Input
1048
+ }], indent: [{
1049
+ type: Input
1050
+ }], selectedColor: [{
1051
+ type: Input
1052
+ }], modeView: [{
1053
+ type: Input
1054
+ }], customKeyboardOperationConfig: [{
1055
+ type: Input
1056
+ }], limitedControl: [{
1057
+ type: Input
1058
+ }], isSelectionMode: [{
1059
+ type: Input
1060
+ }], selectingElements: [{
1061
+ type: Input
1062
+ }], listFilterFunc: [{
1063
+ type: Input
1064
+ }], addTableColumns: [{
1065
+ type: Input
1066
+ }], functionView: [{
1067
+ type: Input
1068
+ }], textWords: [{
1069
+ type: Input
1070
+ }], selectClick: [{
1071
+ type: Output
1072
+ }], selectDblClick: [{
1073
+ type: Output
1074
+ }], contextMenuEvent: [{
1075
+ type: Output
1076
+ }], selectedElementsChanged: [{
1077
+ type: Output
1078
+ }], avaTreeWrapper: [{
1079
+ type: ViewChild,
1080
+ args: ['avaTreeWrapper']
1081
+ }], avaMainWrapper: [{
1082
+ type: ViewChild,
1083
+ args: ['avaMainWrapper']
1084
+ }], avaTreeFilterInput: [{
1085
+ type: ViewChild,
1086
+ args: ['avaTreeFilterInput']
1087
+ }] } });
1088
+
1089
+ class AngularAvaModule {
1090
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AngularAvaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1091
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.6", ngImport: i0, type: AngularAvaModule, declarations: [TreeStructureComponent,
1092
+ TreeNodeComponent,
1093
+ AvaTreeComponent,
1094
+ TreeItemComponent,
1095
+ ListStructureComponent,
1096
+ TableStructureComponent,
1097
+ ElementIconNamePipe,
1098
+ ElementTextPipe,
1099
+ ElementItemNumberPipe,
1100
+ SaveChangingViewDirective], imports: [CommonModule,
1101
+ MatIconModule,
1102
+ MatRippleModule,
1103
+ MatInputModule,
1104
+ MatFormFieldModule,
1105
+ ReactiveFormsModule,
1106
+ FormsModule,
1107
+ MatButtonModule,
1108
+ MatCheckboxModule,
1109
+ MatTableModule,
1110
+ MatTooltipModule], exports: [AvaTreeComponent] }); }
1111
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AngularAvaModule, imports: [CommonModule,
1112
+ MatIconModule,
1113
+ MatRippleModule,
1114
+ MatInputModule,
1115
+ MatFormFieldModule,
1116
+ ReactiveFormsModule,
1117
+ FormsModule,
1118
+ MatButtonModule,
1119
+ MatCheckboxModule,
1120
+ MatTableModule,
1121
+ MatTooltipModule] }); }
1122
+ }
1123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.6", ngImport: i0, type: AngularAvaModule, decorators: [{
1124
+ type: NgModule,
1125
+ args: [{
1126
+ declarations: [
1127
+ TreeStructureComponent,
1128
+ TreeNodeComponent,
1129
+ AvaTreeComponent,
1130
+ TreeItemComponent,
1131
+ ListStructureComponent,
1132
+ TableStructureComponent,
1133
+ ElementIconNamePipe,
1134
+ ElementTextPipe,
1135
+ ElementItemNumberPipe,
1136
+ SaveChangingViewDirective
1137
+ ],
1138
+ imports: [
1139
+ CommonModule,
1140
+ MatIconModule,
1141
+ MatRippleModule,
1142
+ MatInputModule,
1143
+ MatFormFieldModule,
1144
+ ReactiveFormsModule,
1145
+ FormsModule,
1146
+ MatButtonModule,
1147
+ MatCheckboxModule,
1148
+ MatTableModule,
1149
+ MatTooltipModule
1150
+ ],
1151
+ exports: [AvaTreeComponent]
1152
+ }]
1153
+ }] });
1154
+
1155
+ // This file is automatically generated as part of the build process
1156
+ const version = {
1157
+ version: "0.1.1-fe--1-add-tree-p0053",
1158
+ commitInfo: "Branch.feature-FE--1-add-tree-package.Sha.877916ac6a2269877d35203e4a52dd5588fdc0ad",
1159
+ commitDate: "2024-01-15",
1160
+ commitHash: "877916ac6a2269877d35203e4a52dd5588fdc0ad",
1161
+ informationalVersion: "0.1.1-FE--1-add-tree-package.53+Branch.feature-FE--1-add-tree-package.Sha.877916ac6a2269877d35203e4a52dd5588fdc0ad",
1162
+ buildDateUtc: new Date(Date.UTC(2024, 0, 15, 21, 12, 40))
1163
+ };
1164
+
1165
+ /*
1166
+ * Public API Surface of angular-ava
1167
+ */
1168
+
1169
+ /**
1170
+ * Generated bundle index. Do not edit.
1171
+ */
1172
+
1173
+ export { AngularAvaModule, AvaTreeComponent, ExchangePhaseDto, ItemNumberSchemaTierTypeDto, ItemNumberTypeDto, ModeViewType, OriginDto, PriceRoundingModeDto, PriceTypeDto, version };
1174
+ //# sourceMappingURL=dangl-angular-ava.mjs.map