@mediusinc/mng-commons-audit 5.5.0-rc.0 → 5.5.0-rc.2

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 (35) hide show
  1. package/esm2022/lib/api/models/entityChange.mjs +1 -1
  2. package/esm2022/lib/api/models/guiEntityModel.mjs +1 -1
  3. package/esm2022/lib/api/models/guiPropertyModel.mjs +1 -1
  4. package/esm2022/lib/api/models/guiPropertyType.mjs +1 -14
  5. package/esm2022/lib/api/models/guiRelationModel.mjs +1 -12
  6. package/esm2022/lib/api/models/revEntityWithChangesDto.mjs +1 -1
  7. package/esm2022/lib/api/models/revEntityWithStateDto.mjs +1 -1
  8. package/esm2022/lib/api/models/revisionType.mjs +1 -14
  9. package/esm2022/lib/api/services/audit-revisions-api.service.mjs +7 -8
  10. package/esm2022/lib/api/services/audit.service.mjs +4 -4
  11. package/esm2022/lib/components/entity-changes-field/entity-changes-field.component.mjs +33 -22
  12. package/esm2022/lib/components/pages/audit/audit.page.component.mjs +4 -4
  13. package/esm2022/lib/components/pages/entity-revisions/audit-entity-revisions.page.component.mjs +43 -34
  14. package/esm2022/lib/components/pages/revisions/audit-revisions.page.component.mjs +20 -18
  15. package/esm2022/lib/helpers/descriptor.mjs +136 -0
  16. package/esm2022/lib/helpers/entity-changes.mjs +42 -0
  17. package/esm2022/lib/helpers/i18n.mjs +14 -0
  18. package/fesm2022/mediusinc-mng-commons-audit.mjs +300 -341
  19. package/fesm2022/mediusinc-mng-commons-audit.mjs.map +1 -1
  20. package/lib/api/models/entityChange.d.ts +0 -11
  21. package/lib/api/models/guiEntityModel.d.ts +0 -11
  22. package/lib/api/models/guiPropertyModel.d.ts +0 -11
  23. package/lib/api/models/guiRelationModel.d.ts +0 -11
  24. package/lib/api/models/revEntityWithChangesDto.d.ts +0 -11
  25. package/lib/api/models/revEntityWithStateDto.d.ts +0 -11
  26. package/lib/components/entity-changes-field/entity-changes-field.component.d.ts +5 -8
  27. package/lib/components/pages/entity-revisions/audit-entity-revisions.page.component.d.ts +8 -15
  28. package/lib/components/pages/revisions/audit-revisions.page.component.d.ts +5 -7
  29. package/lib/helpers/descriptor.d.ts +10 -0
  30. package/lib/helpers/entity-changes.d.ts +5 -0
  31. package/lib/helpers/i18n.d.ts +3 -0
  32. package/package.json +4 -4
  33. package/version-info.json +5 -5
  34. package/esm2022/lib/utils/audit.util.mjs +0 -227
  35. package/lib/utils/audit.util.d.ts +0 -22
@@ -1,12 +1,11 @@
1
- import { CommonsConfigurationService, TypeRegistry, dataListParamsToUrlQuery, CommonsInternalError, itemIdToDefined, createRoute, createRouteRedirect, createRoutes } from '@mediusinc/mng-commons/core';
1
+ import { CommonsConfigurationService, dataListParamsToUrlQuery, CommonsInternalError, getI18n, getI18nTypePropertyKey, effectWithDeps, itemIdToDefined, createRoute, createRouteRedirect, createRoutes } from '@mediusinc/mng-commons/core';
2
2
  import { TableviewComponent, createTableviewRoute } from '@mediusinc/mng-commons/tableview';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, inject, Injectable, Component, ChangeDetectionStrategy, computed, signal, effect, DestroyRef, Input, Injector } from '@angular/core';
4
+ import { InjectionToken, inject, Injectable, Component, ChangeDetectionStrategy, computed, signal, DestroyRef, input, Injector } from '@angular/core';
5
5
  import { shareReplay, throwError } from 'rxjs';
6
6
  import { map } from 'rxjs/operators';
7
- import { HttpHeaders, HttpClient, HttpParams } from '@angular/common/http';
7
+ import { HttpHeaders, HttpClient } from '@angular/common/http';
8
8
  import { RouterOutlet, Router, ActivatedRoute } from '@angular/router';
9
- import { AsyncPipe, JsonPipe } from '@angular/common';
10
9
  import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
11
10
  import * as i1 from '@angular/forms';
12
11
  import { FormsModule } from '@angular/forms';
@@ -102,286 +101,22 @@ class AuditService extends AuditApiService {
102
101
  }
103
102
  }));
104
103
  }
105
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
106
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditService }); }
104
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
105
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditService }); }
107
106
  }
108
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditService, decorators: [{
107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditService, decorators: [{
109
108
  type: Injectable
110
109
  }], ctorParameters: () => [] });
111
110
 
112
111
  class AuditPageComponent {
113
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
114
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.5", type: AuditPageComponent, isStandalone: true, selector: "mng-audit-page", ngImport: i0, template: "<router-outlet></router-outlet>\n", dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
113
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: AuditPageComponent, isStandalone: true, selector: "mng-audit-page", ngImport: i0, template: "<router-outlet></router-outlet>\n", dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
115
114
  }
116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditPageComponent, decorators: [{
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditPageComponent, decorators: [{
117
116
  type: Component,
118
117
  args: [{ standalone: true, selector: 'mng-audit-page', imports: [RouterOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<router-outlet></router-outlet>\n" }]
119
118
  }] });
120
119
 
121
- /**
122
- * Medius quarkus sampler
123
- * Sampler OPENAPI definition
124
- *
125
- * The version of the OpenAPI document: 1.0.0
126
- * Contact: info@medius.si
127
- *
128
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
129
- * https://openapi-generator.tech
130
- * Do not edit the class manually.
131
- */
132
- var GuiPropertyTypeDto;
133
- (function (GuiPropertyTypeDto) {
134
- GuiPropertyTypeDto["LocalDate"] = "LOCAL_DATE";
135
- GuiPropertyTypeDto["OffsetDateTime"] = "OFFSET_DATE_TIME";
136
- GuiPropertyTypeDto["String"] = "STRING";
137
- GuiPropertyTypeDto["Number"] = "NUMBER";
138
- GuiPropertyTypeDto["Boolean"] = "BOOLEAN";
139
- GuiPropertyTypeDto["Enum"] = "ENUM";
140
- GuiPropertyTypeDto["Wildcard"] = "WILDCARD";
141
- })(GuiPropertyTypeDto || (GuiPropertyTypeDto = {}));
142
- TypeRegistry.get().registerEnum(GuiPropertyTypeDto, 'MngGuiPropertyTypeDto');
143
-
144
- /**
145
- * Medius quarkus sampler
146
- * Sampler OPENAPI definition
147
- *
148
- * The version of the OpenAPI document: 1.0.0
149
- * Contact: info@medius.si
150
- *
151
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
152
- * https://openapi-generator.tech
153
- * Do not edit the class manually.
154
- */
155
- var RevisionTypeDto;
156
- (function (RevisionTypeDto) {
157
- RevisionTypeDto["Add"] = "ADD";
158
- RevisionTypeDto["Mod"] = "MOD";
159
- RevisionTypeDto["Del"] = "DEL";
160
- })(RevisionTypeDto || (RevisionTypeDto = {}));
161
- TypeRegistry.get().registerEnum(RevisionTypeDto, 'MngRevisionTypeDto');
162
- const revisionTypeEnum = enumModel(RevisionTypeDto.Add, RevisionTypeDto, 'MngRevisionTypeDto');
163
-
164
- class AuditUtil {
165
- static { this._dateRegex = /\d{4}-[01]\d-[0-3]\d/; }
166
- static addColumnsFromModel(descriptor, properties, modelType = undefined, addFilters = true, addSorts = true) {
167
- for (const property of properties) {
168
- if (!property.resolvedPropertyName) {
169
- continue;
170
- }
171
- const isEnum = property.propertyType === GuiPropertyTypeDto.Enum;
172
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
173
- let column = null;
174
- if (isEnum) {
175
- if (!property.possibleEnumValues) {
176
- continue;
177
- }
178
- const enumModel = AuditUtil.findEnum(property);
179
- if (enumModel) {
180
- column = descriptor.addColumnEnum(property.resolvedPropertyName, enumModel);
181
- if (addFilters) {
182
- descriptor.addFilterLookupEnum(column.property, enumModel, property.possibleEnumValues);
183
- }
184
- }
185
- else {
186
- column = descriptor.addColumnUnsafe(property.resolvedPropertyName);
187
- if (addFilters) {
188
- descriptor.addFilterLookupUnsafe(column.property, lookupDataProvider().withLookup(() => property.possibleEnumValues ?? []));
189
- }
190
- }
191
- }
192
- else if (property.propertyType === GuiPropertyTypeDto.Number) {
193
- column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asNumber();
194
- }
195
- else if (property.propertyType === GuiPropertyTypeDto.Boolean) {
196
- column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asBoolean();
197
- }
198
- else if (property.propertyType === GuiPropertyTypeDto.LocalDate) {
199
- column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asDate('dd. MM yyyy');
200
- }
201
- else if (property.propertyType === GuiPropertyTypeDto.OffsetDateTime) {
202
- column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asDate('dd. MM yyyy HH:mm');
203
- }
204
- else {
205
- // string / wildcard
206
- column = descriptor.addColumnUnsafe(property.resolvedPropertyName).withTitle(AuditUtil.getPropertyTitleKey(property, modelType));
207
- }
208
- if (modelType) {
209
- column.withGetter((value, item) => item?.[modelType]?.[property.resolvedPropertyName]);
210
- }
211
- column.withTitle(AuditUtil.getPropertyTitleKey(property, modelType));
212
- if (!isEnum && addFilters) {
213
- descriptor.addFilterFromColumnDescriptorUnsafe(column);
214
- }
215
- if (addSorts) {
216
- descriptor.withSortUnsafe(column.property);
217
- }
218
- }
219
- return descriptor;
220
- }
221
- static getPropertyTitleKey(property, modelType = undefined) {
222
- if (modelType === 'revEntity') {
223
- return 'MngRevEntity.properties.' + property.resolvedPropertyName;
224
- }
225
- return property.resolvedPropertyName ?? '';
226
- }
227
- static addFieldsFromModel(descriptor, properties, modelType = 'revEntity') {
228
- for (const property of properties) {
229
- if (!property.resolvedPropertyName) {
230
- continue;
231
- }
232
- const fieldPrepend = `${modelType}.`;
233
- if (property.propertyType === GuiPropertyTypeDto.Enum) {
234
- const enumModel = AuditUtil.findEnum(property);
235
- if (enumModel) {
236
- if (!property.possibleEnumValues) {
237
- continue;
238
- }
239
- descriptor.addFieldLookupEnum((fieldPrepend + property.resolvedPropertyName), enumModel, property.possibleEnumValues).withDisabled();
240
- }
241
- else {
242
- descriptor.addFieldUnsafe(fieldPrepend + property.resolvedPropertyName).withLabel(AuditUtil.getPropertyTitleKey(property, modelType));
243
- }
244
- }
245
- else if (property.propertyType === GuiPropertyTypeDto.Number) {
246
- descriptor
247
- .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
248
- .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
249
- .asNumber()
250
- .withDisabled();
251
- }
252
- else if (property.propertyType === GuiPropertyTypeDto.Boolean) {
253
- descriptor
254
- .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
255
- .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
256
- .withDisabled();
257
- }
258
- else if (property.propertyType === GuiPropertyTypeDto.LocalDate) {
259
- descriptor
260
- .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
261
- .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
262
- .asDatePicker({ format: 'dd. MMM yyyy' })
263
- .withDisabled();
264
- }
265
- else if (property.propertyType === GuiPropertyTypeDto.OffsetDateTime) {
266
- descriptor
267
- .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
268
- .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
269
- .asDatePicker({
270
- format: 'dd. MM yy',
271
- showTime: true,
272
- showSeconds: false
273
- })
274
- .withDisabled();
275
- }
276
- else {
277
- // string / wildcard
278
- descriptor
279
- .addFieldUnsafe(fieldPrepend + property.resolvedPropertyName)
280
- .withLabel(AuditUtil.getPropertyTitleKey(property, modelType))
281
- .withDisabled();
282
- }
283
- }
284
- return descriptor;
285
- }
286
- static buildDescriptorForEntityRevision(descriptor, revModel, entityModel) {
287
- const revType = descriptor.addColumnEnum('revType', revisionTypeEnum).withTitle('MngEntityRevisionChangeState.properties.revType');
288
- descriptor.addFieldLookupEnum('revType', revisionTypeEnum).withLabel('MngEntityRevisionChangeState.properties.revType');
289
- descriptor.table.addFilterFromColumnDescriptorUnsafe(revType);
290
- if (revModel.properties) {
291
- AuditUtil.addColumnsFromModel(descriptor.table, revModel.properties, 'revEntity');
292
- AuditUtil.addFieldsFromModel(descriptor.detailsEditor, revModel.properties, 'revEntity');
293
- }
294
- if (entityModel.properties) {
295
- AuditUtil.addColumnsFromModel(descriptor.table, entityModel.properties, 'entityState');
296
- AuditUtil.addFieldsFromModel(descriptor.detailsEditor, entityModel.properties, 'entityState');
297
- }
298
- return descriptor;
299
- }
300
- static findEnum(property) {
301
- if (!property.enumClassSimpleName) {
302
- return undefined;
303
- }
304
- let i18n = property.enumClassSimpleName;
305
- let enumType = TypeRegistry.get().findEnum(i18n);
306
- if (!enumType) {
307
- i18n = property.enumClassSimpleName + 'Dto';
308
- enumType = TypeRegistry.get().findEnum(i18n);
309
- }
310
- if (!enumType && Array.isArray(property.possibleEnumValues)) {
311
- i18n = null;
312
- enumType = property.possibleEnumValues?.reduce((acc, v) => {
313
- const constName = v
314
- .split('_')
315
- .map(s => (s.length > 1 ? s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase() : s))
316
- .join('');
317
- if (constName !== v) {
318
- acc[constName] = v;
319
- }
320
- acc[v] = constName;
321
- return acc;
322
- }, {});
323
- }
324
- return enumModelGeneric(enumType, i18n);
325
- }
326
- static extractPropertyName(fullPropertyName) {
327
- if (fullPropertyName?.includes('entityState.')) {
328
- return fullPropertyName.replace('entityState.', '');
329
- }
330
- else if (fullPropertyName?.includes('revEntity.')) {
331
- return fullPropertyName?.replace('revEntity.', '');
332
- }
333
- return fullPropertyName;
334
- }
335
- static paramsToHttpParams(params) {
336
- const routeParams = dataListParamsToUrlQuery(params, null);
337
- let httpParams = new HttpParams();
338
- Object.entries(routeParams).forEach(([key, value]) => {
339
- httpParams = httpParams.append(key, value);
340
- });
341
- return httpParams;
342
- }
343
- static mapItemsToEntityChangesArray(fieldValue) {
344
- const entityChanges = [];
345
- for (const key of Object.keys(fieldValue)) {
346
- const ec = { entityType: key, items: [] };
347
- for (const change of fieldValue[key]) {
348
- if (change.revType === RevisionTypeDto.Add && change.entityNewState) {
349
- const item = {
350
- revType: change.revType,
351
- color: 'green'
352
- };
353
- Object.entries(change.entityNewState).forEach(([key, value]) => (item[key] = value));
354
- ec.items?.push(item);
355
- }
356
- else if (change.revType === RevisionTypeDto.Del && change.entityOldState) {
357
- const item = {
358
- revType: change.revType,
359
- color: 'red'
360
- };
361
- Object.entries(change.entityOldState).forEach(([key, value]) => (item[key] = value));
362
- ec.items?.push(item);
363
- }
364
- else if (change.revType === RevisionTypeDto.Mod && change.entityOldState && change.entityNewState) {
365
- const itemOld = {
366
- revType: change.revType,
367
- color: 'red'
368
- };
369
- Object.entries(change.entityOldState).forEach(([key, value]) => (itemOld[key] = value));
370
- const itemNew = {
371
- revType: change.revType,
372
- color: 'green'
373
- };
374
- Object.entries(change.entityNewState).forEach(([key, value]) => (itemNew[key] = value));
375
- ec.items?.push(itemOld);
376
- ec.items?.push(itemNew);
377
- }
378
- }
379
- entityChanges.push(ec);
380
- }
381
- return entityChanges;
382
- }
383
- }
384
-
385
120
  /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types */
386
121
  class AuditRevisionsApiService extends AuditApiService {
387
122
  constructor() {
@@ -389,7 +124,7 @@ class AuditRevisionsApiService extends AuditApiService {
389
124
  }
390
125
  getRevisionList(params) {
391
126
  return this.http.get(this.getUrl(''), {
392
- params: AuditUtil.paramsToHttpParams(params)
127
+ params: dataListParamsToUrlQuery(params)
393
128
  });
394
129
  }
395
130
  getAllChangesForRevision(revId) {
@@ -400,7 +135,7 @@ class AuditRevisionsApiService extends AuditApiService {
400
135
  localVarHeaders = localVarHeaders.set('Accept', 'application/json');
401
136
  return this.http
402
137
  .get(this.getUrl(`/states/${entityType}`), {
403
- params: AuditUtil.paramsToHttpParams(params),
138
+ params: dataListParamsToUrlQuery(params),
404
139
  headers: localVarHeaders
405
140
  })
406
141
  .pipe(map(res => {
@@ -434,25 +169,188 @@ class AuditRevisionsApiService extends AuditApiService {
434
169
  throw new CommonsInternalError(`Entity revision ${revId} for ${entityType} with id ${itemId} was not found`);
435
170
  }));
436
171
  }
437
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditRevisionsApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
438
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditRevisionsApiService }); }
172
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditRevisionsApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
173
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditRevisionsApiService }); }
439
174
  }
440
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditRevisionsApiService, decorators: [{
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditRevisionsApiService, decorators: [{
441
176
  type: Injectable
442
177
  }], ctorParameters: () => [] });
443
178
 
179
+ var GuiPropertyTypeDto;
180
+ (function (GuiPropertyTypeDto) {
181
+ GuiPropertyTypeDto["LocalDate"] = "LOCAL_DATE";
182
+ GuiPropertyTypeDto["OffsetDateTime"] = "OFFSET_DATE_TIME";
183
+ GuiPropertyTypeDto["String"] = "STRING";
184
+ GuiPropertyTypeDto["Number"] = "NUMBER";
185
+ GuiPropertyTypeDto["Boolean"] = "BOOLEAN";
186
+ GuiPropertyTypeDto["Enum"] = "ENUM";
187
+ GuiPropertyTypeDto["Wildcard"] = "WILDCARD";
188
+ })(GuiPropertyTypeDto || (GuiPropertyTypeDto = {}));
189
+
190
+ var RevisionTypeDto;
191
+ (function (RevisionTypeDto) {
192
+ RevisionTypeDto["Add"] = "ADD";
193
+ RevisionTypeDto["Mod"] = "MOD";
194
+ RevisionTypeDto["Del"] = "DEL";
195
+ })(RevisionTypeDto || (RevisionTypeDto = {}));
196
+ const revisionTypeEnum = enumModel(RevisionTypeDto.Add, RevisionTypeDto, 'MngRevisionTypeDto');
197
+
198
+ const i18nBaseEntityKey = 'AuditEntities';
199
+ function getI18nAuditEntityName(translate, entityName) {
200
+ return getI18n(translate, {}, `${i18nBaseEntityKey}.${entityName}.name`, `${i18nBaseEntityKey}.${entityName}`, `${entityName}.name`) ?? entityName;
201
+ }
202
+ function getI18nAuditEntityProperty(translate, entityName, propertyName, modelType = 'entityState') {
203
+ if (modelType === 'revEntity') {
204
+ return 'MngRevEntity.properties.' + propertyName;
205
+ }
206
+ else {
207
+ return getI18n(translate, {}, getI18nTypePropertyKey(`${i18nBaseEntityKey}.${entityName}`, propertyName), getI18nTypePropertyKey(entityName, propertyName)) ?? propertyName;
208
+ }
209
+ }
210
+
211
+ function auditAddColumnsFromModel(translate, descriptor, entityName, properties, modelType = undefined, addFilters = true, addSorts = true) {
212
+ for (const property of properties) {
213
+ if (!property.resolvedPropertyName) {
214
+ continue;
215
+ }
216
+ const isEnum = property.propertyType === GuiPropertyTypeDto.Enum;
217
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
218
+ let column = null;
219
+ if (isEnum) {
220
+ if (!property.possibleEnumValues) {
221
+ continue;
222
+ }
223
+ const enumModel = getEnumModel(property);
224
+ if (enumModel) {
225
+ column = descriptor.addColumnEnum(property.resolvedPropertyName, enumModel);
226
+ if (addFilters) {
227
+ descriptor.addFilterLookupEnum(column.property, enumModel, property.possibleEnumValues);
228
+ }
229
+ }
230
+ else {
231
+ column = descriptor.addColumnUnsafe(property.resolvedPropertyName);
232
+ if (addFilters) {
233
+ descriptor.addFilterLookupUnsafe(column.property, lookupDataProvider().withLookup(() => property.possibleEnumValues ?? []));
234
+ }
235
+ }
236
+ }
237
+ else if (property.propertyType === GuiPropertyTypeDto.Number) {
238
+ column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asNumber();
239
+ }
240
+ else if (property.propertyType === GuiPropertyTypeDto.Boolean) {
241
+ column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asBoolean();
242
+ }
243
+ else if (property.propertyType === GuiPropertyTypeDto.LocalDate) {
244
+ column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asDate('dd. MM yyyy');
245
+ }
246
+ else if (property.propertyType === GuiPropertyTypeDto.OffsetDateTime) {
247
+ column = descriptor.addColumnUnsafe(property.resolvedPropertyName).asDate('dd. MM yyyy HH:mm');
248
+ }
249
+ else {
250
+ // string / wildcard
251
+ column = descriptor.addColumnUnsafe(property.resolvedPropertyName).withTitle(getI18nAuditEntityProperty(translate, entityName, property.propertyName ?? '', modelType));
252
+ }
253
+ if (modelType) {
254
+ column.withGetter((value, item) => item?.[modelType]?.[property.resolvedPropertyName]);
255
+ }
256
+ column.withTitle(getI18nAuditEntityProperty(translate, entityName, property.propertyName ?? '', modelType));
257
+ if (!isEnum && addFilters) {
258
+ descriptor.addFilterFromColumnDescriptorUnsafe(column).withTitle(column.title ?? '');
259
+ }
260
+ if (addSorts) {
261
+ descriptor.withSortUnsafe(column.property);
262
+ }
263
+ }
264
+ return descriptor;
265
+ }
266
+ function auditAddFieldsFromModel(translate, descriptor, entityName, properties, modelType = 'revEntity') {
267
+ for (const property of properties) {
268
+ if (!property.resolvedPropertyName) {
269
+ continue;
270
+ }
271
+ const fieldPrepend = `${modelType}.`;
272
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
273
+ let field;
274
+ if (property.propertyType === GuiPropertyTypeDto.Enum) {
275
+ const enumModel = getEnumModel(property);
276
+ if (enumModel) {
277
+ if (!property.possibleEnumValues) {
278
+ continue;
279
+ }
280
+ field = descriptor.addFieldLookupEnum((fieldPrepend + property.resolvedPropertyName), enumModel, property.possibleEnumValues);
281
+ }
282
+ else {
283
+ field = descriptor.addFieldUnsafe(fieldPrepend + property.resolvedPropertyName);
284
+ }
285
+ }
286
+ else if (property.propertyType === GuiPropertyTypeDto.Number) {
287
+ field = descriptor.addFieldUnsafe(fieldPrepend + property.resolvedPropertyName).asNumber();
288
+ }
289
+ else if (property.propertyType === GuiPropertyTypeDto.Boolean) {
290
+ field = descriptor.addFieldUnsafe(fieldPrepend + property.resolvedPropertyName);
291
+ }
292
+ else if (property.propertyType === GuiPropertyTypeDto.LocalDate) {
293
+ field = descriptor.addFieldUnsafe(fieldPrepend + property.resolvedPropertyName).asDatePicker({ format: 'dd. MMM yyyy' });
294
+ }
295
+ else if (property.propertyType === GuiPropertyTypeDto.OffsetDateTime) {
296
+ field = descriptor.addFieldUnsafe(fieldPrepend + property.resolvedPropertyName).asDatePicker({
297
+ format: 'dd. MM yy',
298
+ showTime: true,
299
+ showSeconds: false
300
+ });
301
+ }
302
+ else {
303
+ // string / wildcard
304
+ field = descriptor.addFieldUnsafe(fieldPrepend + property.resolvedPropertyName);
305
+ }
306
+ field.withLabel(getI18nAuditEntityProperty(translate, entityName, property.propertyName ?? '', modelType)).withDisabled();
307
+ }
308
+ return descriptor;
309
+ }
310
+ function auditBuildTableviewEntityRevision(translate, descriptor, revModel, entityModel) {
311
+ const revType = descriptor.addColumnEnum('revType', revisionTypeEnum).withTitle('MngEntityRevisionChangeState.properties.revType');
312
+ descriptor.addFieldLookupEnum('revType', revisionTypeEnum).withLabel('MngEntityRevisionChangeState.properties.revType');
313
+ descriptor.table.addFilterFromColumnDescriptorUnsafe(revType);
314
+ if (revModel.properties) {
315
+ auditAddColumnsFromModel(translate, descriptor.table, revModel.entityName ?? '', revModel.properties, 'revEntity');
316
+ auditAddFieldsFromModel(translate, descriptor.detailsEditor, revModel.entityName ?? '', revModel.properties, 'revEntity');
317
+ }
318
+ if (entityModel.properties) {
319
+ auditAddColumnsFromModel(translate, descriptor.table, entityModel.entityName ?? '', entityModel.properties, 'entityState');
320
+ auditAddFieldsFromModel(translate, descriptor.detailsEditor, entityModel.entityName ?? '', entityModel.properties, 'entityState');
321
+ }
322
+ return descriptor;
323
+ }
324
+ function getEnumModel(property) {
325
+ if (Array.isArray(property.possibleEnumValues)) {
326
+ const enumType = property.possibleEnumValues?.reduce((acc, v) => {
327
+ const constName = v
328
+ .split('_')
329
+ .map(s => (s.length > 1 ? s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase() : s))
330
+ .join('');
331
+ if (constName !== v) {
332
+ acc[constName] = v;
333
+ }
334
+ acc[v] = constName;
335
+ return acc;
336
+ }, {});
337
+ return enumModelGeneric(enumType, property.enumClassSimpleName);
338
+ }
339
+ return null;
340
+ }
341
+
444
342
  class AuditEntityRevisionsPageComponent {
445
343
  constructor() {
446
- this.router = inject(Router);
447
- this.route = inject(ActivatedRoute);
448
- this.translate = inject(TranslateService);
449
- this.auditService = inject(AuditService);
450
- this.revModel = toSignal(this.auditService.revModel$);
451
- this.auditModel = toSignal(this.auditService.auditModel$);
452
- this.entityClass = toSignal(this.route.paramMap.pipe(map(pm => pm.get('entityClass') ?? undefined)));
344
+ this.#router = inject(Router);
345
+ this.#route = inject(ActivatedRoute);
346
+ this.#translate = inject(TranslateService);
347
+ this.#auditService = inject(AuditService);
348
+ this.#revModel = toSignal(this.#auditService.revModel$);
349
+ this.#auditModel = toSignal(this.#auditService.auditModel$);
350
+ this.#entityClass = toSignal(this.#route.paramMap.pipe(map(pm => pm.get('entityClass') ?? undefined)));
453
351
  this.selectedRevisionEntity = computed(() => {
454
- const entities = this.auditModel();
455
- const entityClass = this.entityClass();
352
+ const entities = this.#auditModel();
353
+ const entityClass = this.#entityClass();
456
354
  if (entityClass && entities) {
457
355
  for (const e of entities) {
458
356
  if (e.entityName === entityClass) {
@@ -463,20 +361,21 @@ class AuditEntityRevisionsPageComponent {
463
361
  return undefined;
464
362
  });
465
363
  this.descriptor = computed(() => {
466
- const revModel = this.revModel();
364
+ const revModel = this.#revModel();
467
365
  const selectedRevisionEntity = this.selectedRevisionEntity();
468
366
  if (!revModel || !selectedRevisionEntity?.entityName) {
469
367
  return undefined;
470
368
  }
471
- const desc = tableviewDescriptor({ id: 'mergedId', i18nBase: selectedRevisionEntity.entityName });
472
- AuditUtil.buildDescriptorForEntityRevision(desc, revModel, selectedRevisionEntity);
369
+ const desc = tableviewDescriptor({ id: 'mergedId' });
370
+ auditBuildTableviewEntityRevision(this.#translate, desc, revModel, selectedRevisionEntity);
371
+ desc.table.withTitle(getI18nAuditEntityName(this.#translate, selectedRevisionEntity.entityName));
473
372
  desc.table.withColumnsResizable();
474
373
  desc.table.withCurrentColumnsReorderable();
475
374
  desc.table.withCurrentColumnsToggleable();
476
375
  return desc;
477
376
  });
478
377
  this.dataProvider = computed(() => {
479
- const revModel = this.revModel();
378
+ const revModel = this.#revModel();
480
379
  const selectedRevisionEntity = this.selectedRevisionEntity();
481
380
  if (!revModel || !selectedRevisionEntity?.entityName) {
482
381
  return undefined;
@@ -522,7 +421,7 @@ class AuditEntityRevisionsPageComponent {
522
421
  .withEditorTitle('pages.entityRevisions.actions.details.editor.title');
523
422
  return [detailsAction];
524
423
  });
525
- this.revisionEntitiesLookupProvider = lookupDataProviderWithService(AuditService).withLookup(() => this.auditService.auditModel$.pipe(map(model => {
424
+ this.revisionEntitiesLookupProvider = lookupDataProviderWithService(AuditService).withLookup(() => this.#auditService.auditModel$.pipe(map(model => {
526
425
  const modelI18n = model;
527
426
  modelI18n.sort((m1, m2) => {
528
427
  if (m1.entityName && m2.entityName) {
@@ -536,58 +435,114 @@ class AuditEntityRevisionsPageComponent {
536
435
  }
537
436
  });
538
437
  modelI18n.forEach(item => {
539
- const translatedEntityName = this.translate.instant('AuditEntities.' + item.entityName);
540
- item.entityNameI18n = translatedEntityName.includes('AuditEntities.') ? item.entityName : translatedEntityName;
438
+ item.entityNameI18n = item.entityName ? getI18nAuditEntityName(this.#translate, item.entityName) : undefined;
541
439
  });
542
440
  return modelI18n;
543
441
  })));
544
442
  this.showTableview = signal(false);
545
- effect(() => {
546
- const descriptor = this.descriptor();
443
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
444
+ this.#showTableviewEffectRef = effectWithDeps([this.descriptor], descriptor => {
547
445
  if (descriptor) {
548
- setTimeout(() => {
549
- this.showTableview.set(true);
550
- });
446
+ this.showTableview.set(true);
551
447
  }
552
- }, { allowSignalWrites: true });
448
+ });
553
449
  }
450
+ #router;
451
+ #route;
452
+ #translate;
453
+ #auditService;
454
+ #revModel;
455
+ #auditModel;
456
+ #entityClass;
457
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
458
+ #showTableviewEffectRef;
554
459
  onRevisionEntityChange(value) {
555
460
  this.showTableview.set(false);
461
+ const currentUrl = this.#router.url;
462
+ const routePrefix = currentUrl.substring(0, currentUrl.lastIndexOf('/audit/entity-revisions') + '/audit/entity-revisions'.length);
556
463
  if (value) {
557
- this.router.navigate(['/audit/entity-revisions/' + value.entityName]);
464
+ this.#router.navigate([routePrefix, value.entityName]);
558
465
  }
559
466
  else {
560
- this.router.navigate(['/audit/entity-revisions/']);
467
+ this.#router.navigate([routePrefix]);
561
468
  }
562
469
  }
563
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditEntityRevisionsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
564
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: AuditEntityRevisionsPageComponent, isStandalone: true, selector: "mng-audit-entity-revisions-page", providers: [AuditRevisionsApiService], ngImport: i0, template: "<div class=\"card\">\n <div class=\"field mb-0\">\n <mng-dropdown\n id=\"revisionEntityDropdown\"\n [placeholder]=\"'pages.entityRevisions.dropdown.placeholder' | translate\"\n optionsLabelProperty=\"entityNameI18n\"\n [ngModel]=\"selectedRevisionEntity()\"\n (valueChange)=\"onRevisionEntityChange($event)\"\n [dataProvider]=\"revisionEntitiesLookupProvider\"\n [showClear]=\"true\"></mng-dropdown>\n @if (!selectedRevisionEntity()) {\n <small class=\"block\">\n {{ 'pages.entityRevisions.dropdown.helpText' | translate }}\n </small>\n }\n </div>\n</div>\n@if (showTableview() && descriptor()) {\n <mng-tableview [descriptor]=\"descriptor()!\" [dataProvider]=\"dataProvider()\" [actions]=\"actions()\"></mng-tableview>\n}\n", dependencies: [{ kind: "component", type: DropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "options", "optionsTrackProperty", "optionsLabelProperty", "optionsLabelTranslate", "optionsValueProperty", "optionsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur", "loading", "disabled", "allowInput", "appendTo", "inlineSearch", "searchTrim"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: TableviewComponent, selector: "mng-tableview", inputs: ["descriptor", "dataProvider", "actions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
470
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditEntityRevisionsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
471
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: AuditEntityRevisionsPageComponent, isStandalone: true, selector: "mng-audit-entity-revisions-page", providers: [AuditRevisionsApiService], ngImport: i0, template: "<div class=\"card\">\n <div class=\"field mb-0\">\n <mng-dropdown\n id=\"revisionEntityDropdown\"\n [placeholder]=\"'pages.entityRevisions.dropdown.placeholder' | translate\"\n optionsLabelProperty=\"entityNameI18n\"\n [ngModel]=\"selectedRevisionEntity()\"\n (valueChange)=\"onRevisionEntityChange($event)\"\n [dataProvider]=\"revisionEntitiesLookupProvider\"\n [showClear]=\"true\"></mng-dropdown>\n @if (!selectedRevisionEntity()) {\n <small class=\"block\">\n {{ 'pages.entityRevisions.dropdown.helpText' | translate }}\n </small>\n }\n </div>\n</div>\n@if (showTableview() && descriptor()) {\n <mng-tableview [descriptor]=\"descriptor()!\" [dataProvider]=\"dataProvider()\" [actions]=\"actions()\"></mng-tableview>\n}\n", dependencies: [{ kind: "component", type: DropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "options", "optionsTrackProperty", "optionsLabelProperty", "optionsLabelTranslate", "optionsValueProperty", "optionsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur", "loading", "disabled", "allowInput", "appendTo", "inlineSearch", "searchTrim"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: TableviewComponent, selector: "mng-tableview", inputs: ["descriptor", "dataProvider", "actions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
565
472
  }
566
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditEntityRevisionsPageComponent, decorators: [{
473
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditEntityRevisionsPageComponent, decorators: [{
567
474
  type: Component,
568
- args: [{ standalone: true, selector: 'mng-audit-entity-revisions-page', imports: [DropdownComponent, FormsModule, AsyncPipe, TranslateModule, FormlyModule, TableviewComponent], providers: [AuditRevisionsApiService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"card\">\n <div class=\"field mb-0\">\n <mng-dropdown\n id=\"revisionEntityDropdown\"\n [placeholder]=\"'pages.entityRevisions.dropdown.placeholder' | translate\"\n optionsLabelProperty=\"entityNameI18n\"\n [ngModel]=\"selectedRevisionEntity()\"\n (valueChange)=\"onRevisionEntityChange($event)\"\n [dataProvider]=\"revisionEntitiesLookupProvider\"\n [showClear]=\"true\"></mng-dropdown>\n @if (!selectedRevisionEntity()) {\n <small class=\"block\">\n {{ 'pages.entityRevisions.dropdown.helpText' | translate }}\n </small>\n }\n </div>\n</div>\n@if (showTableview() && descriptor()) {\n <mng-tableview [descriptor]=\"descriptor()!\" [dataProvider]=\"dataProvider()\" [actions]=\"actions()\"></mng-tableview>\n}\n" }]
569
- }], ctorParameters: () => [] });
475
+ args: [{ standalone: true, selector: 'mng-audit-entity-revisions-page', imports: [DropdownComponent, FormsModule, TranslateModule, FormlyModule, TableviewComponent], providers: [AuditRevisionsApiService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"card\">\n <div class=\"field mb-0\">\n <mng-dropdown\n id=\"revisionEntityDropdown\"\n [placeholder]=\"'pages.entityRevisions.dropdown.placeholder' | translate\"\n optionsLabelProperty=\"entityNameI18n\"\n [ngModel]=\"selectedRevisionEntity()\"\n (valueChange)=\"onRevisionEntityChange($event)\"\n [dataProvider]=\"revisionEntitiesLookupProvider\"\n [showClear]=\"true\"></mng-dropdown>\n @if (!selectedRevisionEntity()) {\n <small class=\"block\">\n {{ 'pages.entityRevisions.dropdown.helpText' | translate }}\n </small>\n }\n </div>\n</div>\n@if (showTableview() && descriptor()) {\n <mng-tableview [descriptor]=\"descriptor()!\" [dataProvider]=\"dataProvider()\" [actions]=\"actions()\"></mng-tableview>\n}\n" }]
476
+ }] });
477
+
478
+ function auditMapToEntityChangesArray(fieldValue) {
479
+ const entityChanges = [];
480
+ for (const key of Object.keys(fieldValue)) {
481
+ const ec = { entityType: key, items: [] };
482
+ for (const change of fieldValue[key]) {
483
+ if (change.revType === RevisionTypeDto.Add && change.entityNewState) {
484
+ const item = {
485
+ revType: change.revType,
486
+ color: 'green'
487
+ };
488
+ Object.entries(change.entityNewState).forEach(([key, value]) => (item[key] = value));
489
+ ec.items?.push(item);
490
+ }
491
+ else if (change.revType === RevisionTypeDto.Del && change.entityOldState) {
492
+ const item = {
493
+ revType: change.revType,
494
+ color: 'red'
495
+ };
496
+ Object.entries(change.entityOldState).forEach(([key, value]) => (item[key] = value));
497
+ ec.items?.push(item);
498
+ }
499
+ else if (change.revType === RevisionTypeDto.Mod && change.entityOldState && change.entityNewState) {
500
+ const itemOld = {
501
+ revType: change.revType,
502
+ color: 'red'
503
+ };
504
+ Object.entries(change.entityOldState).forEach(([key, value]) => (itemOld[key] = value));
505
+ const itemNew = {
506
+ revType: change.revType,
507
+ color: 'green'
508
+ };
509
+ Object.entries(change.entityNewState).forEach(([key, value]) => (itemNew[key] = value));
510
+ ec.items?.push(itemOld);
511
+ ec.items?.push(itemNew);
512
+ }
513
+ }
514
+ entityChanges.push(ec);
515
+ }
516
+ return entityChanges;
517
+ }
570
518
 
571
519
  class EntityChangesFieldComponent extends AFormlyCustomFieldComponent {
572
520
  constructor() {
573
521
  super(...arguments);
574
- this.destroyRef = inject(DestroyRef);
522
+ this.#destroyRef = inject(DestroyRef);
523
+ this.#translate = inject(TranslateService);
524
+ this.injector = input();
575
525
  this.entityChanges = signal([]);
576
526
  this.modelFetched = signal(false);
577
- this.auditModel = [];
527
+ this.#auditModel = [];
578
528
  }
529
+ #destroyRef;
530
+ #translate;
531
+ #auditModel;
532
+ #fieldValue;
579
533
  ngOnInit() {
580
- this.fieldValue = this.formControl.value;
581
- this.injector
534
+ this.#fieldValue = this.formControl.value;
535
+ const injector = this.injector();
536
+ injector
582
537
  ?.get(AuditService, undefined, { optional: true })
583
- ?.auditModel$.pipe(takeUntilDestroyed(this.destroyRef))
538
+ ?.auditModel$.pipe(takeUntilDestroyed(this.#destroyRef))
584
539
  .subscribe({
585
540
  next: model => {
586
- this.auditModel = model;
587
- if (this.fieldValue) {
588
- this.entityChanges.set(AuditUtil.mapItemsToEntityChangesArray(this.fieldValue).map(fv => ({
541
+ this.#auditModel = model;
542
+ if (this.#fieldValue) {
543
+ this.entityChanges.set(auditMapToEntityChangesArray(this.#fieldValue).map(fv => ({
589
544
  data: fv,
590
- descriptor: this.createDescriptor(fv)
545
+ descriptor: this.#createDescriptor(fv)
591
546
  })));
592
547
  this.modelFetched.set(true);
593
548
  }
@@ -596,8 +551,11 @@ class EntityChangesFieldComponent extends AFormlyCustomFieldComponent {
596
551
  throw new CommonsInternalError('Error while trying to fetch audit model from audit service', { name: 'EntityChangesFieldComponentError', cause: err });
597
552
  }
598
553
  });
554
+ if (injector) {
555
+ this.#translate = injector.get(TranslateService);
556
+ }
599
557
  }
600
- createDescriptor(entityChanges) {
558
+ #createDescriptor(entityChanges) {
601
559
  const changedFields = [];
602
560
  if (entityChanges.items && entityChanges.items[0].revType === RevisionTypeDto.Mod) {
603
561
  for (const key in entityChanges.items[0]) {
@@ -606,14 +564,14 @@ class EntityChangesFieldComponent extends AFormlyCustomFieldComponent {
606
564
  }
607
565
  }
608
566
  }
609
- const guiEntityModel = this.auditModel.filter(m => m.entityName === entityChanges.entityType)[0];
567
+ const guiEntityModel = this.#auditModel.filter(m => m.entityName === entityChanges.entityType)[0];
610
568
  const desc = tableDescriptor({ i18nBase: guiEntityModel.entityName }).withClassName('py-2');
611
569
  if (guiEntityModel.entityName) {
612
- desc.withTitle(guiEntityModel.entityName);
570
+ desc.withTitle(getI18nAuditEntityName(this.#translate, guiEntityModel.entityName));
613
571
  }
614
572
  desc.addColumnEnum('revType', revisionTypeEnum).withTitle('MngEntityRevisionChangeState.properties.revType');
615
573
  if (guiEntityModel.properties) {
616
- AuditUtil.addColumnsFromModel(desc, guiEntityModel.properties, undefined, false, false);
574
+ auditAddColumnsFromModel(this.#translate, desc, guiEntityModel.entityName ?? '', guiEntityModel.properties, undefined, false, false);
617
575
  }
618
576
  desc.withRowClassName(undefined, (_, item) => (item ? (item.color === 'green' ? 'audit-row-added' : 'audit-row-deleted') : ''));
619
577
  desc.columns.forEach(col => {
@@ -627,43 +585,40 @@ class EntityChangesFieldComponent extends AFormlyCustomFieldComponent {
627
585
  desc.withTrackProperty(`EntityChangeField_${entityChanges.entityType ?? 'default'}`);
628
586
  return desc;
629
587
  }
630
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: EntityChangesFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
631
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: EntityChangesFieldComponent, isStandalone: true, selector: "mng-entity-changes-field", inputs: { injector: "injector" }, usesInheritance: true, ngImport: i0, template: "@if (modelFetched()) {\n <div>\n @for (ec of entityChanges(); track ec) {\n <mng-table [items]=\"ec.data.items\" [descriptor]=\"ec.descriptor\"></mng-table>\n }\n </div>\n} @else {\n <div class=\"text-center\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem\"></i>\n </div>\n}\n", styles: ["::ng-deep tr.audit-row-deleted{background:#ff3d331a!important}::ng-deep tr.audit-row-deleted .audit-cell{background:#f6544c4d!important}::ng-deep tr.audit-row-added{background-color:#1bc5621a!important}::ng-deep tr.audit-row-added .audit-cell{background:#1bc5624d!important}\n"], dependencies: [{ kind: "component", type: TableComponent, selector: "mng-table", inputs: ["descriptor", "items", "result", "loading", "dataProvider", "useQueryParams", "cellClickEnabled", "selectionMode", "selectionEnabled", "rowReorderEnabled", "columnLastMinWidth", "captionComponent", "columnCustomLastComponent", "globalFilterFields"], outputs: ["tableLoad", "cellClick", "selectionChange", "captionComponentInstance", "columnCustomLastComponentInstance", "rowReorder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
588
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: EntityChangesFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
589
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: EntityChangesFieldComponent, isStandalone: true, selector: "mng-entity-changes-field", inputs: { injector: { classPropertyName: "injector", publicName: "injector", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "@if (modelFetched()) {\n <div>\n @for (ec of entityChanges(); track ec) {\n <mng-table [items]=\"ec.data.items\" [descriptor]=\"ec.descriptor\"></mng-table>\n }\n </div>\n} @else {\n <div class=\"text-center\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem\"></i>\n </div>\n}\n", styles: ["::ng-deep tr.audit-row-deleted{background:#ff3d331a!important}::ng-deep tr.audit-row-deleted .audit-cell{background:#f6544c4d!important}::ng-deep tr.audit-row-added{background-color:#1bc5621a!important}::ng-deep tr.audit-row-added .audit-cell{background:#1bc5624d!important}\n"], dependencies: [{ kind: "component", type: TableComponent, selector: "mng-table", inputs: ["descriptor", "items", "result", "loading", "dataProvider", "useQueryParams", "cellClickEnabled", "selectionMode", "selectionEnabled", "rowReorderEnabled", "columnLastMinWidth", "captionComponent", "columnCustomLastComponent", "globalFilterFields"], outputs: ["tableLoad", "cellClick", "selectionChange", "captionComponentInstance", "columnCustomLastComponentInstance", "rowReorder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
632
590
  }
633
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: EntityChangesFieldComponent, decorators: [{
591
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: EntityChangesFieldComponent, decorators: [{
634
592
  type: Component,
635
593
  args: [{ standalone: true, selector: 'mng-entity-changes-field', imports: [TableComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (modelFetched()) {\n <div>\n @for (ec of entityChanges(); track ec) {\n <mng-table [items]=\"ec.data.items\" [descriptor]=\"ec.descriptor\"></mng-table>\n }\n </div>\n} @else {\n <div class=\"text-center\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem\"></i>\n </div>\n}\n", styles: ["::ng-deep tr.audit-row-deleted{background:#ff3d331a!important}::ng-deep tr.audit-row-deleted .audit-cell{background:#f6544c4d!important}::ng-deep tr.audit-row-added{background-color:#1bc5621a!important}::ng-deep tr.audit-row-added .audit-cell{background:#1bc5624d!important}\n"] }]
636
- }], propDecorators: { injector: [{
637
- type: Input
638
- }] } });
594
+ }] });
639
595
 
640
596
  class AuditRevisionsPageComponent {
641
597
  constructor() {
642
- this.injector = inject(Injector);
643
- this.auditService = inject(AuditService);
644
- this.revModel = toSignal(this.auditService.revModel$);
645
- this.showTableview = computed(() => this.revModel() != null);
598
+ this.#injector = inject(Injector);
599
+ this.#translate = inject(TranslateService);
600
+ this.#auditService = inject(AuditService);
601
+ this.#revModel = toSignal(this.#auditService.revModel$);
602
+ this.showTableview = computed(() => this.#revModel() != null);
646
603
  this.descriptor = computed(() => {
647
- const revModel = this.revModel();
604
+ const revModel = this.#revModel();
648
605
  if (revModel) {
649
606
  const idProperty = revModel.properties?.filter(prop => prop.isId).map(prop => prop.resolvedPropertyName)[0];
650
607
  const revEntModel = model({ id: 'rev', title: 'rev', i18nBase: 'MngRevEntity' });
651
- if (revModel.entityName)
652
- revEntModel.withI18nBase(revModel.entityName);
653
608
  if (idProperty)
654
609
  revEntModel.withIdPropertyUnsafe(idProperty);
655
610
  const desc = tableviewDescriptor(revEntModel);
656
611
  const detailsDescriptor = editorDescriptor({ i18nBase: 'MngRevEntity', tableviewEditorType: TableviewEditorTypeEnum.Details });
657
612
  detailsDescriptor.model.withIdPropertyUnsafe('revEntity.' + idProperty);
658
613
  if (revModel.properties) {
659
- AuditUtil.addColumnsFromModel(desc.table, revModel.properties);
660
- AuditUtil.addFieldsFromModel(detailsDescriptor, revModel.properties);
614
+ auditAddColumnsFromModel(this.#translate, desc.table, revModel.entityName ?? '', revModel.properties);
615
+ auditAddFieldsFromModel(this.#translate, detailsDescriptor, revModel.entityName ?? '', revModel.properties);
661
616
  }
662
617
  detailsDescriptor
663
618
  .addField('entityNameChangesMap')
664
619
  .asCustomComponent(EntityChangesFieldComponent, {
665
620
  fieldWrappers: ['field-no-label'],
666
- inputs: { injector: this.injector }
621
+ inputs: { injector: this.#injector }
667
622
  })
668
623
  .withDisabled();
669
624
  desc.withDetailsDescriptor(detailsDescriptor); // MngRevEntity is extended by MngRevEntityWithChangesDto, so no real harm here
@@ -686,12 +641,16 @@ class AuditRevisionsPageComponent {
686
641
  return [detailsAction];
687
642
  });
688
643
  }
689
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditRevisionsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
690
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: AuditRevisionsPageComponent, isStandalone: true, selector: "mng-audit-revisions-page", providers: [AuditRevisionsApiService], ngImport: i0, template: "@if (showTableview()) {\n <mng-tableview [descriptor]=\"descriptor()\" [dataProvider]=\"dataProvider()\" [actions]=\"actions()\"></mng-tableview>\n}\n", dependencies: [{ kind: "component", type: TableviewComponent, selector: "mng-tableview", inputs: ["descriptor", "dataProvider", "actions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
644
+ #injector;
645
+ #translate;
646
+ #auditService;
647
+ #revModel;
648
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditRevisionsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
649
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: AuditRevisionsPageComponent, isStandalone: true, selector: "mng-audit-revisions-page", providers: [AuditRevisionsApiService], ngImport: i0, template: "@if (showTableview()) {\n <mng-tableview [descriptor]=\"descriptor()\" [dataProvider]=\"dataProvider()\" [actions]=\"actions()\"></mng-tableview>\n}\n", dependencies: [{ kind: "component", type: TableviewComponent, selector: "mng-tableview", inputs: ["descriptor", "dataProvider", "actions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
691
650
  }
692
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: AuditRevisionsPageComponent, decorators: [{
651
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditRevisionsPageComponent, decorators: [{
693
652
  type: Component,
694
- args: [{ standalone: true, selector: 'mng-audit-revisions-page', imports: [TableviewComponent, AsyncPipe, RouterOutlet, JsonPipe], providers: [AuditRevisionsApiService], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showTableview()) {\n <mng-tableview [descriptor]=\"descriptor()\" [dataProvider]=\"dataProvider()\" [actions]=\"actions()\"></mng-tableview>\n}\n" }]
653
+ args: [{ standalone: true, selector: 'mng-audit-revisions-page', imports: [TableviewComponent], providers: [AuditRevisionsApiService], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (showTableview()) {\n <mng-tableview [descriptor]=\"descriptor()\" [dataProvider]=\"dataProvider()\" [actions]=\"actions()\"></mng-tableview>\n}\n" }]
695
654
  }] });
696
655
 
697
656
  /**