@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.
- 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 +7 -8
- package/esm2022/lib/api/services/audit.service.mjs +4 -4
- package/esm2022/lib/components/entity-changes-field/entity-changes-field.component.mjs +33 -22
- package/esm2022/lib/components/pages/audit/audit.page.component.mjs +4 -4
- package/esm2022/lib/components/pages/entity-revisions/audit-entity-revisions.page.component.mjs +43 -34
- package/esm2022/lib/components/pages/revisions/audit-revisions.page.component.mjs +20 -18
- 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 +300 -341
- 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 +4 -4
- 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';
|
|
@@ -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.
|
|
106
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.
|
|
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.
|
|
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.
|
|
114
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.
|
|
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.
|
|
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:
|
|
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 => {
|
|
@@ -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.
|
|
438
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.
|
|
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.
|
|
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
|
|
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,58 +435,114 @@ 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);
|
|
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
|
|
464
|
+
this.#router.navigate([routePrefix, value.entityName]);
|
|
558
465
|
}
|
|
559
466
|
else {
|
|
560
|
-
this
|
|
467
|
+
this.#router.navigate([routePrefix]);
|
|
561
468
|
}
|
|
562
469
|
}
|
|
563
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.
|
|
564
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.
|
|
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.
|
|
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,
|
|
569
|
-
}]
|
|
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
|
|
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
|
|
527
|
+
this.#auditModel = [];
|
|
578
528
|
}
|
|
529
|
+
#destroyRef;
|
|
530
|
+
#translate;
|
|
531
|
+
#auditModel;
|
|
532
|
+
#fieldValue;
|
|
579
533
|
ngOnInit() {
|
|
580
|
-
this
|
|
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
|
|
538
|
+
?.auditModel$.pipe(takeUntilDestroyed(this.#destroyRef))
|
|
584
539
|
.subscribe({
|
|
585
540
|
next: model => {
|
|
586
|
-
this
|
|
587
|
-
if (this
|
|
588
|
-
this.entityChanges.set(
|
|
541
|
+
this.#auditModel = model;
|
|
542
|
+
if (this.#fieldValue) {
|
|
543
|
+
this.entityChanges.set(auditMapToEntityChangesArray(this.#fieldValue).map(fv => ({
|
|
589
544
|
data: fv,
|
|
590
|
-
descriptor: this
|
|
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
|
|
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
|
-
|
|
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.
|
|
631
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.
|
|
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.
|
|
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
|
-
}]
|
|
637
|
-
type: Input
|
|
638
|
-
}] } });
|
|
594
|
+
}] });
|
|
639
595
|
|
|
640
596
|
class AuditRevisionsPageComponent {
|
|
641
597
|
constructor() {
|
|
642
|
-
this
|
|
643
|
-
this
|
|
644
|
-
this
|
|
645
|
-
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);
|
|
646
603
|
this.descriptor = computed(() => {
|
|
647
|
-
const revModel = this
|
|
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
|
-
|
|
660
|
-
|
|
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
|
|
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
|
-
|
|
690
|
-
|
|
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.
|
|
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
|
|
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
|
/**
|