@mediusinc/mng-commons-audit 5.5.0-rc.1 → 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.
- package/esm2022/lib/api/models/entityChange.mjs +1 -1
- package/esm2022/lib/api/models/guiEntityModel.mjs +1 -1
- package/esm2022/lib/api/models/guiPropertyModel.mjs +1 -1
- package/esm2022/lib/api/models/guiPropertyType.mjs +1 -14
- package/esm2022/lib/api/models/guiRelationModel.mjs +1 -12
- package/esm2022/lib/api/models/revEntityWithChangesDto.mjs +1 -1
- package/esm2022/lib/api/models/revEntityWithStateDto.mjs +1 -1
- package/esm2022/lib/api/models/revisionType.mjs +1 -14
- package/esm2022/lib/api/services/audit-revisions-api.service.mjs +4 -5
- package/esm2022/lib/components/entity-changes-field/entity-changes-field.component.mjs +31 -20
- package/esm2022/lib/components/pages/entity-revisions/audit-entity-revisions.page.component.mjs +39 -32
- package/esm2022/lib/components/pages/revisions/audit-revisions.page.component.mjs +17 -15
- package/esm2022/lib/helpers/descriptor.mjs +136 -0
- package/esm2022/lib/helpers/entity-changes.mjs +42 -0
- package/esm2022/lib/helpers/i18n.mjs +14 -0
- package/fesm2022/mediusinc-mng-commons-audit.mjs +282 -325
- package/fesm2022/mediusinc-mng-commons-audit.mjs.map +1 -1
- package/lib/api/models/entityChange.d.ts +0 -11
- package/lib/api/models/guiEntityModel.d.ts +0 -11
- package/lib/api/models/guiPropertyModel.d.ts +0 -11
- package/lib/api/models/guiRelationModel.d.ts +0 -11
- package/lib/api/models/revEntityWithChangesDto.d.ts +0 -11
- package/lib/api/models/revEntityWithStateDto.d.ts +0 -11
- package/lib/components/entity-changes-field/entity-changes-field.component.d.ts +5 -8
- package/lib/components/pages/entity-revisions/audit-entity-revisions.page.component.d.ts +8 -15
- package/lib/components/pages/revisions/audit-revisions.page.component.d.ts +5 -7
- package/lib/helpers/descriptor.d.ts +10 -0
- package/lib/helpers/entity-changes.d.ts +5 -0
- package/lib/helpers/i18n.d.ts +3 -0
- package/package.json +2 -2
- package/version-info.json +5 -5
- package/esm2022/lib/utils/audit.util.mjs +0 -227
- package/lib/utils/audit.util.d.ts +0 -22
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { CommonsConfigurationService,
|
|
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,
|
|
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
|
|
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';
|
|
@@ -118,270 +117,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
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:
|
|
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:
|
|
138
|
+
params: dataListParamsToUrlQuery(params),
|
|
404
139
|
headers: localVarHeaders
|
|
405
140
|
})
|
|
406
141
|
.pipe(map(res => {
|
|
@@ -441,18 +176,181 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
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
|
|
447
|
-
this
|
|
448
|
-
this
|
|
449
|
-
this
|
|
450
|
-
this
|
|
451
|
-
this
|
|
452
|
-
this
|
|
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
|
|
455
|
-
const entityClass = this
|
|
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
|
|
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'
|
|
472
|
-
|
|
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
|
|
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
|
|
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,30 +435,36 @@ class AuditEntityRevisionsPageComponent {
|
|
|
536
435
|
}
|
|
537
436
|
});
|
|
538
437
|
modelI18n.forEach(item => {
|
|
539
|
-
|
|
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
|
-
|
|
546
|
-
|
|
443
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
444
|
+
this.#showTableviewEffectRef = effectWithDeps([this.descriptor], descriptor => {
|
|
547
445
|
if (descriptor) {
|
|
548
|
-
|
|
549
|
-
this.showTableview.set(true);
|
|
550
|
-
});
|
|
446
|
+
this.showTableview.set(true);
|
|
551
447
|
}
|
|
552
|
-
}
|
|
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);
|
|
556
|
-
const currentUrl = this
|
|
461
|
+
const currentUrl = this.#router.url;
|
|
557
462
|
const routePrefix = currentUrl.substring(0, currentUrl.lastIndexOf('/audit/entity-revisions') + '/audit/entity-revisions'.length);
|
|
558
463
|
if (value) {
|
|
559
|
-
this
|
|
464
|
+
this.#router.navigate([routePrefix, value.entityName]);
|
|
560
465
|
}
|
|
561
466
|
else {
|
|
562
|
-
this
|
|
467
|
+
this.#router.navigate([routePrefix]);
|
|
563
468
|
}
|
|
564
469
|
}
|
|
565
470
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditEntityRevisionsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
@@ -567,29 +472,77 @@ class AuditEntityRevisionsPageComponent {
|
|
|
567
472
|
}
|
|
568
473
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditEntityRevisionsPageComponent, decorators: [{
|
|
569
474
|
type: Component,
|
|
570
|
-
args: [{ standalone: true, selector: 'mng-audit-entity-revisions-page', imports: [DropdownComponent, FormsModule,
|
|
571
|
-
}]
|
|
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
|
+
}
|
|
572
518
|
|
|
573
519
|
class EntityChangesFieldComponent extends AFormlyCustomFieldComponent {
|
|
574
520
|
constructor() {
|
|
575
521
|
super(...arguments);
|
|
576
|
-
this
|
|
522
|
+
this.#destroyRef = inject(DestroyRef);
|
|
523
|
+
this.#translate = inject(TranslateService);
|
|
524
|
+
this.injector = input();
|
|
577
525
|
this.entityChanges = signal([]);
|
|
578
526
|
this.modelFetched = signal(false);
|
|
579
|
-
this
|
|
527
|
+
this.#auditModel = [];
|
|
580
528
|
}
|
|
529
|
+
#destroyRef;
|
|
530
|
+
#translate;
|
|
531
|
+
#auditModel;
|
|
532
|
+
#fieldValue;
|
|
581
533
|
ngOnInit() {
|
|
582
|
-
this
|
|
583
|
-
this.injector
|
|
534
|
+
this.#fieldValue = this.formControl.value;
|
|
535
|
+
const injector = this.injector();
|
|
536
|
+
injector
|
|
584
537
|
?.get(AuditService, undefined, { optional: true })
|
|
585
|
-
?.auditModel$.pipe(takeUntilDestroyed(this
|
|
538
|
+
?.auditModel$.pipe(takeUntilDestroyed(this.#destroyRef))
|
|
586
539
|
.subscribe({
|
|
587
540
|
next: model => {
|
|
588
|
-
this
|
|
589
|
-
if (this
|
|
590
|
-
this.entityChanges.set(
|
|
541
|
+
this.#auditModel = model;
|
|
542
|
+
if (this.#fieldValue) {
|
|
543
|
+
this.entityChanges.set(auditMapToEntityChangesArray(this.#fieldValue).map(fv => ({
|
|
591
544
|
data: fv,
|
|
592
|
-
descriptor: this
|
|
545
|
+
descriptor: this.#createDescriptor(fv)
|
|
593
546
|
})));
|
|
594
547
|
this.modelFetched.set(true);
|
|
595
548
|
}
|
|
@@ -598,8 +551,11 @@ class EntityChangesFieldComponent extends AFormlyCustomFieldComponent {
|
|
|
598
551
|
throw new CommonsInternalError('Error while trying to fetch audit model from audit service', { name: 'EntityChangesFieldComponentError', cause: err });
|
|
599
552
|
}
|
|
600
553
|
});
|
|
554
|
+
if (injector) {
|
|
555
|
+
this.#translate = injector.get(TranslateService);
|
|
556
|
+
}
|
|
601
557
|
}
|
|
602
|
-
createDescriptor(entityChanges) {
|
|
558
|
+
#createDescriptor(entityChanges) {
|
|
603
559
|
const changedFields = [];
|
|
604
560
|
if (entityChanges.items && entityChanges.items[0].revType === RevisionTypeDto.Mod) {
|
|
605
561
|
for (const key in entityChanges.items[0]) {
|
|
@@ -608,14 +564,14 @@ class EntityChangesFieldComponent extends AFormlyCustomFieldComponent {
|
|
|
608
564
|
}
|
|
609
565
|
}
|
|
610
566
|
}
|
|
611
|
-
const guiEntityModel = this
|
|
567
|
+
const guiEntityModel = this.#auditModel.filter(m => m.entityName === entityChanges.entityType)[0];
|
|
612
568
|
const desc = tableDescriptor({ i18nBase: guiEntityModel.entityName }).withClassName('py-2');
|
|
613
569
|
if (guiEntityModel.entityName) {
|
|
614
|
-
desc.withTitle(guiEntityModel.entityName);
|
|
570
|
+
desc.withTitle(getI18nAuditEntityName(this.#translate, guiEntityModel.entityName));
|
|
615
571
|
}
|
|
616
572
|
desc.addColumnEnum('revType', revisionTypeEnum).withTitle('MngEntityRevisionChangeState.properties.revType');
|
|
617
573
|
if (guiEntityModel.properties) {
|
|
618
|
-
|
|
574
|
+
auditAddColumnsFromModel(this.#translate, desc, guiEntityModel.entityName ?? '', guiEntityModel.properties, undefined, false, false);
|
|
619
575
|
}
|
|
620
576
|
desc.withRowClassName(undefined, (_, item) => (item ? (item.color === 'green' ? 'audit-row-added' : 'audit-row-deleted') : ''));
|
|
621
577
|
desc.columns.forEach(col => {
|
|
@@ -630,42 +586,39 @@ class EntityChangesFieldComponent extends AFormlyCustomFieldComponent {
|
|
|
630
586
|
return desc;
|
|
631
587
|
}
|
|
632
588
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: EntityChangesFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
633
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", 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 }); }
|
|
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 }); }
|
|
634
590
|
}
|
|
635
591
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: EntityChangesFieldComponent, decorators: [{
|
|
636
592
|
type: Component,
|
|
637
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"] }]
|
|
638
|
-
}]
|
|
639
|
-
type: Input
|
|
640
|
-
}] } });
|
|
594
|
+
}] });
|
|
641
595
|
|
|
642
596
|
class AuditRevisionsPageComponent {
|
|
643
597
|
constructor() {
|
|
644
|
-
this
|
|
645
|
-
this
|
|
646
|
-
this
|
|
647
|
-
this
|
|
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);
|
|
648
603
|
this.descriptor = computed(() => {
|
|
649
|
-
const revModel = this
|
|
604
|
+
const revModel = this.#revModel();
|
|
650
605
|
if (revModel) {
|
|
651
606
|
const idProperty = revModel.properties?.filter(prop => prop.isId).map(prop => prop.resolvedPropertyName)[0];
|
|
652
607
|
const revEntModel = model({ id: 'rev', title: 'rev', i18nBase: 'MngRevEntity' });
|
|
653
|
-
if (revModel.entityName)
|
|
654
|
-
revEntModel.withI18nBase(revModel.entityName);
|
|
655
608
|
if (idProperty)
|
|
656
609
|
revEntModel.withIdPropertyUnsafe(idProperty);
|
|
657
610
|
const desc = tableviewDescriptor(revEntModel);
|
|
658
611
|
const detailsDescriptor = editorDescriptor({ i18nBase: 'MngRevEntity', tableviewEditorType: TableviewEditorTypeEnum.Details });
|
|
659
612
|
detailsDescriptor.model.withIdPropertyUnsafe('revEntity.' + idProperty);
|
|
660
613
|
if (revModel.properties) {
|
|
661
|
-
|
|
662
|
-
|
|
614
|
+
auditAddColumnsFromModel(this.#translate, desc.table, revModel.entityName ?? '', revModel.properties);
|
|
615
|
+
auditAddFieldsFromModel(this.#translate, detailsDescriptor, revModel.entityName ?? '', revModel.properties);
|
|
663
616
|
}
|
|
664
617
|
detailsDescriptor
|
|
665
618
|
.addField('entityNameChangesMap')
|
|
666
619
|
.asCustomComponent(EntityChangesFieldComponent, {
|
|
667
620
|
fieldWrappers: ['field-no-label'],
|
|
668
|
-
inputs: { injector: this
|
|
621
|
+
inputs: { injector: this.#injector }
|
|
669
622
|
})
|
|
670
623
|
.withDisabled();
|
|
671
624
|
desc.withDetailsDescriptor(detailsDescriptor); // MngRevEntity is extended by MngRevEntityWithChangesDto, so no real harm here
|
|
@@ -688,12 +641,16 @@ class AuditRevisionsPageComponent {
|
|
|
688
641
|
return [detailsAction];
|
|
689
642
|
});
|
|
690
643
|
}
|
|
644
|
+
#injector;
|
|
645
|
+
#translate;
|
|
646
|
+
#auditService;
|
|
647
|
+
#revModel;
|
|
691
648
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditRevisionsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
692
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 }); }
|
|
693
650
|
}
|
|
694
651
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AuditRevisionsPageComponent, decorators: [{
|
|
695
652
|
type: Component,
|
|
696
|
-
args: [{ standalone: true, selector: 'mng-audit-revisions-page', imports: [TableviewComponent
|
|
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" }]
|
|
697
654
|
}] });
|
|
698
655
|
|
|
699
656
|
/**
|