@mintplayer/ng-spark 22.23.0 → 22.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +181 -0
  2. package/fesm2022/mintplayer-ng-spark-attribute-description.mjs +100 -47
  3. package/fesm2022/mintplayer-ng-spark-attribute-description.mjs.map +1 -1
  4. package/fesm2022/mintplayer-ng-spark-client-operations.mjs +308 -329
  5. package/fesm2022/mintplayer-ng-spark-client-operations.mjs.map +1 -1
  6. package/fesm2022/mintplayer-ng-spark-column-filter.mjs +175 -135
  7. package/fesm2022/mintplayer-ng-spark-column-filter.mjs.map +1 -1
  8. package/fesm2022/mintplayer-ng-spark-grid.mjs +2259 -1119
  9. package/fesm2022/mintplayer-ng-spark-grid.mjs.map +1 -1
  10. package/fesm2022/mintplayer-ng-spark-history.mjs +611 -0
  11. package/fesm2022/mintplayer-ng-spark-history.mjs.map +1 -0
  12. package/fesm2022/mintplayer-ng-spark-icon.mjs +64 -27
  13. package/fesm2022/mintplayer-ng-spark-icon.mjs.map +1 -1
  14. package/fesm2022/mintplayer-ng-spark-models.mjs +366 -762
  15. package/fesm2022/mintplayer-ng-spark-models.mjs.map +1 -1
  16. package/fesm2022/mintplayer-ng-spark-moderation.mjs +1212 -0
  17. package/fesm2022/mintplayer-ng-spark-moderation.mjs.map +1 -0
  18. package/fesm2022/mintplayer-ng-spark-panels.mjs +52 -0
  19. package/fesm2022/mintplayer-ng-spark-panels.mjs.map +1 -0
  20. package/fesm2022/mintplayer-ng-spark-pipes.mjs +1122 -765
  21. package/fesm2022/mintplayer-ng-spark-pipes.mjs.map +1 -1
  22. package/fesm2022/mintplayer-ng-spark-po-create.mjs +273 -169
  23. package/fesm2022/mintplayer-ng-spark-po-create.mjs.map +1 -1
  24. package/fesm2022/mintplayer-ng-spark-po-detail.mjs +786 -410
  25. package/fesm2022/mintplayer-ng-spark-po-detail.mjs.map +1 -1
  26. package/fesm2022/mintplayer-ng-spark-po-edit.mjs +292 -284
  27. package/fesm2022/mintplayer-ng-spark-po-edit.mjs.map +1 -1
  28. package/fesm2022/mintplayer-ng-spark-po-form.mjs +2187 -1225
  29. package/fesm2022/mintplayer-ng-spark-po-form.mjs.map +1 -1
  30. package/fesm2022/mintplayer-ng-spark-query-list.mjs +516 -303
  31. package/fesm2022/mintplayer-ng-spark-query-list.mjs.map +1 -1
  32. package/fesm2022/mintplayer-ng-spark-renderers.mjs +17 -55
  33. package/fesm2022/mintplayer-ng-spark-renderers.mjs.map +1 -1
  34. package/fesm2022/mintplayer-ng-spark-retry-action-modal.mjs +216 -177
  35. package/fesm2022/mintplayer-ng-spark-retry-action-modal.mjs.map +1 -1
  36. package/fesm2022/mintplayer-ng-spark-routes.mjs +24 -28
  37. package/fesm2022/mintplayer-ng-spark-routes.mjs.map +1 -1
  38. package/fesm2022/mintplayer-ng-spark-services.mjs +625 -640
  39. package/fesm2022/mintplayer-ng-spark-services.mjs.map +1 -1
  40. package/fesm2022/mintplayer-ng-spark-shell.mjs +1013 -397
  41. package/fesm2022/mintplayer-ng-spark-shell.mjs.map +1 -1
  42. package/fesm2022/mintplayer-ng-spark-soft-delete.mjs +294 -0
  43. package/fesm2022/mintplayer-ng-spark-soft-delete.mjs.map +1 -0
  44. package/fesm2022/mintplayer-ng-spark.mjs +13 -50
  45. package/fesm2022/mintplayer-ng-spark.mjs.map +1 -1
  46. package/package.json +17 -1
  47. package/types/mintplayer-ng-spark-attribute-description.d.ts +25 -18
  48. package/types/mintplayer-ng-spark-client-operations.d.ts +133 -160
  49. package/types/mintplayer-ng-spark-column-filter.d.ts +73 -55
  50. package/types/mintplayer-ng-spark-grid.d.ts +885 -448
  51. package/types/mintplayer-ng-spark-history.d.ts +223 -0
  52. package/types/mintplayer-ng-spark-icon.d.ts +15 -13
  53. package/types/mintplayer-ng-spark-models.d.ts +624 -573
  54. package/types/mintplayer-ng-spark-moderation.d.ts +402 -0
  55. package/types/mintplayer-ng-spark-panels.d.ts +108 -0
  56. package/types/mintplayer-ng-spark-pipes.d.ts +120 -149
  57. package/types/mintplayer-ng-spark-po-create.d.ts +46 -37
  58. package/types/mintplayer-ng-spark-po-detail.d.ts +177 -117
  59. package/types/mintplayer-ng-spark-po-edit.d.ts +64 -65
  60. package/types/mintplayer-ng-spark-po-form.d.ts +507 -371
  61. package/types/mintplayer-ng-spark-query-list.d.ts +118 -82
  62. package/types/mintplayer-ng-spark-renderers.d.ts +79 -85
  63. package/types/mintplayer-ng-spark-retry-action-modal.d.ts +31 -34
  64. package/types/mintplayer-ng-spark-routes.d.ts +7 -11
  65. package/types/mintplayer-ng-spark-services.d.ts +377 -261
  66. package/types/mintplayer-ng-spark-shell.d.ts +209 -128
  67. package/types/mintplayer-ng-spark-soft-delete.d.ts +90 -0
  68. package/types/mintplayer-ng-spark.d.ts +7 -12
@@ -0,0 +1,611 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, Injectable, computed, effect, inject, input, output, signal, untracked } from "@angular/core";
3
+ import { SparkLanguageService, SparkService } from "@mintplayer/ng-spark/services";
4
+ import { ShowedOn, hasShowedOnFlag, valueFor } from "@mintplayer/ng-spark/models";
5
+ import { DatePipe } from "@angular/common";
6
+ import { Color } from "@mintplayer/ng-bootstrap";
7
+ import { BsAlertComponent } from "@mintplayer/ng-bootstrap/alert";
8
+ import { BsBadgeComponent } from "@mintplayer/ng-bootstrap/badge";
9
+ import { BsSpinnerComponent } from "@mintplayer/ng-bootstrap/spinner";
10
+ import { BsTableComponent } from "@mintplayer/ng-bootstrap/table";
11
+ import { SparkGridCellComponent, SparkGridRenderers } from "@mintplayer/ng-spark/grid";
12
+ import { QueryCellValuePipe, QueryReferenceChipsPipe, ResolveTranslationPipe, TranslateKeyPipe } from "@mintplayer/ng-spark/pipes";
13
+ import { cellValue } from "@mintplayer/ng-spark/renderers";
14
+ import { BsCardComponent, BsCardHeaderComponent } from "@mintplayer/ng-bootstrap/card";
15
+ import { provideSparkDetailPanels } from "@mintplayer/ng-spark/panels";
16
+ var SparkHistoryService = class SparkHistoryService {
17
+ spark = inject(SparkService);
18
+ list(type, id, options) {
19
+ return this.spark.postEnvelope("/po/revisions", {
20
+ objectTypeId: type,
21
+ id,
22
+ ...options?.skip ? { skip: options.skip } : {},
23
+ ...options?.take ? { take: options.take } : {},
24
+ ...options?.deleted && options.deleted !== "exclude" ? { deleted: options.deleted } : {}
25
+ });
26
+ }
27
+ get(type, id, changeVector, options) {
28
+ return this.spark.postEnvelope("/po/revision", {
29
+ objectTypeId: type,
30
+ id,
31
+ changeVector,
32
+ ...options?.deleted && options.deleted !== "exclude" ? { deleted: options.deleted } : {}
33
+ });
34
+ }
35
+ revert(type, id, changeVector) {
36
+ return this.spark.postEnvelope("/po/revert", {
37
+ objectTypeId: type,
38
+ id,
39
+ changeVector
40
+ });
41
+ }
42
+ static ɵfac = i0.ɵɵngDeclareFactory({
43
+ minVersion: "12.0.0",
44
+ version: "22.2.0",
45
+ ngImport: i0,
46
+ type: SparkHistoryService,
47
+ deps: [],
48
+ target: i0.ɵɵFactoryTarget.Injectable
49
+ });
50
+ static ɵprov = i0.ɵɵngDeclareInjectable({
51
+ minVersion: "12.0.0",
52
+ version: "22.2.0",
53
+ ngImport: i0,
54
+ type: SparkHistoryService,
55
+ providedIn: "root"
56
+ });
57
+ };
58
+ i0.ɵɵngDeclareClassMetadata({
59
+ minVersion: "12.0.0",
60
+ version: "22.2.0",
61
+ ngImport: i0,
62
+ type: SparkHistoryService,
63
+ decorators: [{
64
+ type: Injectable,
65
+ args: [{ providedIn: "root" }]
66
+ }]
67
+ });
68
+ function revisionAttributes(entityType) {
69
+ return (entityType?.attributes ?? []).filter((a) => a.isVisible && hasShowedOnFlag(a.showedOn, ShowedOn.PersistentObject)).sort((a, b) => a.order - b.order);
70
+ }
71
+ function comparableValue(attribute) {
72
+ if (!attribute) return "\0absent";
73
+ return JSON.stringify({
74
+ v: attribute.value ?? null,
75
+ o: attribute.object ? nestedValues(attribute.object) : null,
76
+ os: attribute.objects ? attribute.objects.map(nestedValues) : null
77
+ });
78
+ }
79
+ function nestedValues(po) {
80
+ const result = {};
81
+ for (const a of po.attributes ?? []) result[a.name] = comparableValue(a);
82
+ return result;
83
+ }
84
+ function diffRevision(entityType, revision, current) {
85
+ if (!revision || !current) return [];
86
+ const changes = [];
87
+ for (const attribute of revisionAttributes(entityType)) {
88
+ const r = revision.attributes.find((a) => a.name === attribute.name);
89
+ const c = current.attributes.find((a) => a.name === attribute.name);
90
+ if (comparableValue(r) !== comparableValue(c)) changes.push({
91
+ attribute,
92
+ revision: r,
93
+ current: c
94
+ });
95
+ }
96
+ return changes;
97
+ }
98
+ const cellValuePipe = new QueryCellValuePipe();
99
+ const chipsPipe = new QueryReferenceChipsPipe();
100
+ var SparkPoHistoryComponent = class SparkPoHistoryComponent {
101
+ history = inject(SparkHistoryService);
102
+ lang = inject(SparkLanguageService);
103
+ type = input.required(...ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []);
104
+ id = input.required(...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
105
+ entityType = input.required(...ngDevMode ? [{ debugName: "entityType" }] : /* istanbul ignore next */ []);
106
+ current = input(null, ...ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []);
107
+ permissions = input(null, ...ngDevMode ? [{ debugName: "permissions" }] : /* istanbul ignore next */ []);
108
+ deleted = input(null, ...ngDevMode ? [{ debugName: "deleted" }] : /* istanbul ignore next */ []);
109
+ pageSize = input(50, ...ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []);
110
+ reverted = output();
111
+ colors = Color;
112
+ revisions = signal([], ...ngDevMode ? [{ debugName: "revisions" }] : /* istanbul ignore next */ []);
113
+ loading = signal(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
114
+ hasMore = signal(false, ...ngDevMode ? [{ debugName: "hasMore" }] : /* istanbul ignore next */ []);
115
+ error = signal(null, ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
116
+ selected = signal(null, ...ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []);
117
+ selectedObject = signal(null, ...ngDevMode ? [{ debugName: "selectedObject" }] : /* istanbul ignore next */ []);
118
+ selectedLoading = signal(false, ...ngDevMode ? [{ debugName: "selectedLoading" }] : /* istanbul ignore next */ []);
119
+ view = signal("diff", ...ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []);
120
+ reverting = signal(false, ...ngDevMode ? [{ debugName: "reverting" }] : /* istanbul ignore next */ []);
121
+ canView = computed(() => this.permissions()?.canViewHistory === true, ...ngDevMode ? [{ debugName: "canView" }] : /* istanbul ignore next */ []);
122
+ attributes = computed(() => revisionAttributes(this.entityType()), ...ngDevMode ? [{ debugName: "attributes" }] : /* istanbul ignore next */ []);
123
+ changes = computed(() => diffRevision(this.entityType(), this.selectedObject(), this.current()), ...ngDevMode ? [{ debugName: "changes" }] : /* istanbul ignore next */ []);
124
+ gridRenderers = inject(SparkGridRenderers);
125
+ lookupOptions = signal({}, ...ngDevMode ? [{ debugName: "lookupOptions" }] : /* istanbul ignore next */ []);
126
+ viewCells = computed(() => {
127
+ const revision = this.selectedObject();
128
+ return revision ? this.attributes().map((a) => ({
129
+ attribute: a,
130
+ cell: this.cell(a, revision)
131
+ })) : [];
132
+ }, ...ngDevMode ? [{ debugName: "viewCells" }] : /* istanbul ignore next */ []);
133
+ changeCells = computed(() => {
134
+ const revision = this.selectedObject();
135
+ const current = this.current();
136
+ return this.changes().map((change) => ({
137
+ change,
138
+ old: this.cell(change.attribute, revision),
139
+ now: this.cell(change.attribute, current)
140
+ }));
141
+ }, ...ngDevMode ? [{ debugName: "changeCells" }] : /* istanbul ignore next */ []);
142
+ canRevertSelected = computed(() => {
143
+ const revision = this.selected();
144
+ return !!revision && this.permissions()?.canRevert === true && this.deleted() !== "only" && !revision.isCurrent && !revision.isDeleteRevision && !!this.selectedObject();
145
+ }, ...ngDevMode ? [{ debugName: "canRevertSelected" }] : /* istanbul ignore next */ []);
146
+ constructor() {
147
+ effect(() => {
148
+ const attributes = this.attributes();
149
+ untracked(() => {
150
+ this.gridRenderers.loadLookupOptions(attributes).then((o) => this.lookupOptions.set(o), () => this.lookupOptions.set({}));
151
+ });
152
+ });
153
+ effect(() => {
154
+ const type = this.type();
155
+ const id = this.id();
156
+ const deleted = this.deleted();
157
+ const allowed = this.canView();
158
+ untracked(() => {
159
+ this.clearSelection();
160
+ this.revisions.set([]);
161
+ if (allowed && type && id) this.loadPage(type, id, deleted, 0);
162
+ });
163
+ });
164
+ }
165
+ async refresh() {
166
+ this.clearSelection();
167
+ this.revisions.set([]);
168
+ await this.loadPage(this.type(), this.id(), this.deleted(), 0);
169
+ }
170
+ async loadMore() {
171
+ await this.loadPage(this.type(), this.id(), this.deleted(), this.revisions().length);
172
+ }
173
+ async loadPage(type, id, deleted, skip) {
174
+ this.loading.set(true);
175
+ this.error.set(null);
176
+ try {
177
+ const take = this.pageSize();
178
+ const page = await this.history.list(type, id, {
179
+ skip,
180
+ take,
181
+ deleted
182
+ });
183
+ if (type !== this.type() || id !== this.id()) return;
184
+ this.revisions.update((existing) => skip === 0 ? page : [...existing, ...page]);
185
+ this.hasMore.set(page.length >= take);
186
+ } catch (e) {
187
+ this.error.set(this.describe(e));
188
+ } finally {
189
+ this.loading.set(false);
190
+ }
191
+ }
192
+ async select(revision) {
193
+ if (this.selected()?.changeVector === revision.changeVector) {
194
+ this.clearSelection();
195
+ return;
196
+ }
197
+ this.selected.set(revision);
198
+ this.selectedObject.set(null);
199
+ this.error.set(null);
200
+ this.selectedLoading.set(true);
201
+ try {
202
+ const po = await this.history.get(this.type(), this.id(), revision.changeVector, { deleted: this.deleted() });
203
+ if (this.selected()?.changeVector === revision.changeVector) this.selectedObject.set(po);
204
+ } catch (e) {
205
+ this.error.set(this.describe(e));
206
+ } finally {
207
+ this.selectedLoading.set(false);
208
+ }
209
+ }
210
+ clearSelection() {
211
+ this.selected.set(null);
212
+ this.selectedObject.set(null);
213
+ }
214
+ async revert() {
215
+ const revision = this.selected();
216
+ if (!revision || !this.canRevertSelected() || this.reverting()) return;
217
+ if (!confirm(this.lang.t("history.confirmRevert"))) return;
218
+ this.reverting.set(true);
219
+ this.error.set(null);
220
+ try {
221
+ const saved = await this.history.revert(this.type(), this.id(), revision.changeVector);
222
+ this.reverted.emit(saved);
223
+ await this.refresh();
224
+ } catch (e) {
225
+ this.error.set(this.describe(e));
226
+ } finally {
227
+ this.reverting.set(false);
228
+ }
229
+ }
230
+ cell(attribute, po) {
231
+ const column = attribute;
232
+ const row = po;
233
+ const display = cellValuePipe.transform(column, row, this.lookupOptions());
234
+ return {
235
+ column,
236
+ display: attribute.dataType !== "boolean" && (display == null || display === "") ? "-" : display,
237
+ rendererValue: cellValue(valueFor(row, attribute.name)),
238
+ chips: chipsPipe.transform(column, row)
239
+ };
240
+ }
241
+ who(revision) {
242
+ return revision.userName || revision.userId || this.lang.t("history.unknownUser");
243
+ }
244
+ describe(err) {
245
+ switch (err?.status) {
246
+ case 404: return this.lang.t("history.unavailable");
247
+ case 409: return this.lang.t("history.conflict");
248
+ default: return err?.error?.error || err?.message || this.lang.t("common.actionFailed");
249
+ }
250
+ }
251
+ static ɵfac = i0.ɵɵngDeclareFactory({
252
+ minVersion: "12.0.0",
253
+ version: "22.2.0",
254
+ ngImport: i0,
255
+ type: SparkPoHistoryComponent,
256
+ deps: [],
257
+ target: i0.ɵɵFactoryTarget.Component
258
+ });
259
+ static ɵcmp = i0.ɵɵngDeclareComponent({
260
+ minVersion: "17.0.0",
261
+ version: "22.2.0",
262
+ type: SparkPoHistoryComponent,
263
+ isStandalone: true,
264
+ selector: "spark-po-history",
265
+ inputs: {
266
+ type: {
267
+ classPropertyName: "type",
268
+ publicName: "type",
269
+ isSignal: true,
270
+ isRequired: true,
271
+ transformFunction: null
272
+ },
273
+ id: {
274
+ classPropertyName: "id",
275
+ publicName: "id",
276
+ isSignal: true,
277
+ isRequired: true,
278
+ transformFunction: null
279
+ },
280
+ entityType: {
281
+ classPropertyName: "entityType",
282
+ publicName: "entityType",
283
+ isSignal: true,
284
+ isRequired: true,
285
+ transformFunction: null
286
+ },
287
+ current: {
288
+ classPropertyName: "current",
289
+ publicName: "current",
290
+ isSignal: true,
291
+ isRequired: false,
292
+ transformFunction: null
293
+ },
294
+ permissions: {
295
+ classPropertyName: "permissions",
296
+ publicName: "permissions",
297
+ isSignal: true,
298
+ isRequired: false,
299
+ transformFunction: null
300
+ },
301
+ deleted: {
302
+ classPropertyName: "deleted",
303
+ publicName: "deleted",
304
+ isSignal: true,
305
+ isRequired: false,
306
+ transformFunction: null
307
+ },
308
+ pageSize: {
309
+ classPropertyName: "pageSize",
310
+ publicName: "pageSize",
311
+ isSignal: true,
312
+ isRequired: false,
313
+ transformFunction: null
314
+ }
315
+ },
316
+ outputs: { reverted: "reverted" },
317
+ ngImport: i0,
318
+ template: "@if (canView()) {\n <div class=\"spark-po-history\">\n @if (error(); as message) {\n <bs-alert [type]=\"colors.danger\" class=\"d-block mb-3\">{{ message }}</bs-alert>\n }\n\n @if (revisions().length === 0 && !loading()) {\n <p class=\"text-muted mb-0 spark-history-empty\">{{ 'history.noRevisions' | t }}</p>\n } @else {\n <bs-table [isResponsive]=\"true\">\n <thead>\n <tr>\n <th>{{ 'history.modifiedAt' | t }}</th>\n <th>{{ 'history.modifiedBy' | t }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (revision of revisions(); track revision.changeVector) {\n <tr class=\"spark-history-row\" [class.table-active]=\"selected()?.changeVector === revision.changeVector\">\n <td>\n <button type=\"button\" class=\"btn btn-link p-0 spark-history-select\" (click)=\"select(revision)\">\n {{ revision.lastModified ? (revision.lastModified | date:'medium') : '—' }}\n </button>\n </td>\n <td>{{ who(revision) }}</td>\n <td class=\"text-end\">\n @if (revision.isCurrent) {\n <bs-badge [type]=\"colors.primary\" class=\"spark-history-current\">{{ 'history.current' | t }}</bs-badge>\n }\n @if (revision.isDeleteRevision) {\n <bs-badge [type]=\"colors.secondary\" class=\"ms-1\">{{ 'history.deleteRevision' | t }}</bs-badge>\n }\n </td>\n </tr>\n }\n </tbody>\n </bs-table>\n }\n\n @if (loading()) {\n <div class=\"text-center p-2\"><bs-spinner /></div>\n } @else if (hasMore()) {\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm spark-history-more\" (click)=\"loadMore()\">\n {{ 'history.loadMore' | t }}\n </button>\n }\n\n @if (selected(); as revision) {\n <div class=\"mt-3 spark-history-selected\">\n <div class=\"d-flex flex-wrap gap-2 align-items-center mb-2\">\n <div class=\"btn-group\" role=\"group\">\n <button type=\"button\" class=\"btn btn-sm spark-history-diff-tab\"\n [class.btn-secondary]=\"view() === 'diff'\" [class.btn-outline-secondary]=\"view() !== 'diff'\"\n (click)=\"view.set('diff')\">{{ 'history.changes' | t }}</button>\n <button type=\"button\" class=\"btn btn-sm spark-history-view-tab\"\n [class.btn-secondary]=\"view() === 'view'\" [class.btn-outline-secondary]=\"view() !== 'view'\"\n (click)=\"view.set('view')\">{{ 'history.revision' | t }}</button>\n </div>\n @if (canRevertSelected()) {\n <button type=\"button\" class=\"btn btn-warning btn-sm spark-history-revert\" [disabled]=\"reverting()\" (click)=\"revert()\">\n {{ 'history.revert' | t }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm ms-auto\" (click)=\"clearSelection()\">\n {{ 'history.close' | t }}\n </button>\n </div>\n\n @if (selectedLoading()) {\n <div class=\"text-center p-2\"><bs-spinner /></div>\n } @else if (selectedObject()) {\n @if (view() === 'diff') {\n @if (changes().length === 0) {\n <p class=\"text-muted spark-history-nochanges\">{{ 'history.noChanges' | t }}</p>\n } @else {\n <bs-table [isResponsive]=\"true\">\n <thead>\n <tr>\n <th>{{ 'history.field' | t }}</th>\n <th>{{ 'history.revisionValue' | t }}</th>\n <th>{{ 'history.currentValue' | t }}</th>\n </tr>\n </thead>\n <tbody>\n @for (row of changeCells(); track row.change.attribute.name) {\n <tr class=\"spark-history-change\">\n <th scope=\"row\">{{ row.change.attribute.label | resolveTranslation:row.change.attribute.name }}</th>\n <td class=\"spark-history-old\">\n <spark-grid-cell [column]=\"row.old.column\" [display]=\"row.old.display\" [rendererValue]=\"row.old.rendererValue\"\n [item]=\"selectedObject()\" [chips]=\"row.old.chips\" />\n </td>\n <td class=\"spark-history-new\">\n <spark-grid-cell [column]=\"row.now.column\" [display]=\"row.now.display\" [rendererValue]=\"row.now.rendererValue\"\n [item]=\"current()\" [chips]=\"row.now.chips\" />\n </td>\n </tr>\n }\n </tbody>\n </bs-table>\n }\n } @else {\n <dl class=\"spark-history-view\">\n @for (entry of viewCells(); track entry.attribute.name) {\n <dt>{{ entry.attribute.label | resolveTranslation:entry.attribute.name }}</dt>\n <dd>\n <spark-grid-cell [column]=\"entry.cell.column\" [display]=\"entry.cell.display\" [rendererValue]=\"entry.cell.rendererValue\"\n [item]=\"selectedObject()\" [chips]=\"entry.cell.chips\" />\n </dd>\n }\n </dl>\n }\n }\n </div>\n }\n </div>\n}\n",
319
+ dependencies: [
320
+ {
321
+ kind: "component",
322
+ type: BsAlertComponent,
323
+ selector: "bs-alert",
324
+ inputs: [
325
+ "type",
326
+ "announce",
327
+ "isVisible"
328
+ ],
329
+ outputs: ["isVisibleChange", "afterOpenedOrClosed"]
330
+ },
331
+ {
332
+ kind: "component",
333
+ type: BsBadgeComponent,
334
+ selector: "bs-badge",
335
+ inputs: [
336
+ "type",
337
+ "unit",
338
+ "decorative"
339
+ ]
340
+ },
341
+ {
342
+ kind: "component",
343
+ type: BsSpinnerComponent,
344
+ selector: "bs-spinner",
345
+ inputs: ["type", "color"]
346
+ },
347
+ {
348
+ kind: "component",
349
+ type: BsTableComponent,
350
+ selector: "bs-table",
351
+ inputs: [
352
+ "isResponsive",
353
+ "striped",
354
+ "hover",
355
+ "border",
356
+ "ariaRowCount"
357
+ ]
358
+ },
359
+ {
360
+ kind: "component",
361
+ type: SparkGridCellComponent,
362
+ selector: "spark-grid-cell",
363
+ inputs: [
364
+ "column",
365
+ "display",
366
+ "rendererValue",
367
+ "item",
368
+ "chips",
369
+ "link"
370
+ ]
371
+ },
372
+ {
373
+ kind: "pipe",
374
+ type: DatePipe,
375
+ name: "date"
376
+ },
377
+ {
378
+ kind: "pipe",
379
+ type: ResolveTranslationPipe,
380
+ name: "resolveTranslation"
381
+ },
382
+ {
383
+ kind: "pipe",
384
+ type: TranslateKeyPipe,
385
+ name: "t"
386
+ }
387
+ ],
388
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
389
+ });
390
+ };
391
+ i0.ɵɵngDeclareClassMetadata({
392
+ minVersion: "12.0.0",
393
+ version: "22.2.0",
394
+ ngImport: i0,
395
+ type: SparkPoHistoryComponent,
396
+ decorators: [{
397
+ type: Component,
398
+ args: [{
399
+ selector: "spark-po-history",
400
+ imports: [
401
+ DatePipe,
402
+ BsAlertComponent,
403
+ BsBadgeComponent,
404
+ BsSpinnerComponent,
405
+ BsTableComponent,
406
+ SparkGridCellComponent,
407
+ ResolveTranslationPipe,
408
+ TranslateKeyPipe
409
+ ],
410
+ changeDetection: ChangeDetectionStrategy.OnPush,
411
+ template: "@if (canView()) {\n <div class=\"spark-po-history\">\n @if (error(); as message) {\n <bs-alert [type]=\"colors.danger\" class=\"d-block mb-3\">{{ message }}</bs-alert>\n }\n\n @if (revisions().length === 0 && !loading()) {\n <p class=\"text-muted mb-0 spark-history-empty\">{{ 'history.noRevisions' | t }}</p>\n } @else {\n <bs-table [isResponsive]=\"true\">\n <thead>\n <tr>\n <th>{{ 'history.modifiedAt' | t }}</th>\n <th>{{ 'history.modifiedBy' | t }}</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (revision of revisions(); track revision.changeVector) {\n <tr class=\"spark-history-row\" [class.table-active]=\"selected()?.changeVector === revision.changeVector\">\n <td>\n <button type=\"button\" class=\"btn btn-link p-0 spark-history-select\" (click)=\"select(revision)\">\n {{ revision.lastModified ? (revision.lastModified | date:'medium') : '—' }}\n </button>\n </td>\n <td>{{ who(revision) }}</td>\n <td class=\"text-end\">\n @if (revision.isCurrent) {\n <bs-badge [type]=\"colors.primary\" class=\"spark-history-current\">{{ 'history.current' | t }}</bs-badge>\n }\n @if (revision.isDeleteRevision) {\n <bs-badge [type]=\"colors.secondary\" class=\"ms-1\">{{ 'history.deleteRevision' | t }}</bs-badge>\n }\n </td>\n </tr>\n }\n </tbody>\n </bs-table>\n }\n\n @if (loading()) {\n <div class=\"text-center p-2\"><bs-spinner /></div>\n } @else if (hasMore()) {\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm spark-history-more\" (click)=\"loadMore()\">\n {{ 'history.loadMore' | t }}\n </button>\n }\n\n @if (selected(); as revision) {\n <div class=\"mt-3 spark-history-selected\">\n <div class=\"d-flex flex-wrap gap-2 align-items-center mb-2\">\n <div class=\"btn-group\" role=\"group\">\n <button type=\"button\" class=\"btn btn-sm spark-history-diff-tab\"\n [class.btn-secondary]=\"view() === 'diff'\" [class.btn-outline-secondary]=\"view() !== 'diff'\"\n (click)=\"view.set('diff')\">{{ 'history.changes' | t }}</button>\n <button type=\"button\" class=\"btn btn-sm spark-history-view-tab\"\n [class.btn-secondary]=\"view() === 'view'\" [class.btn-outline-secondary]=\"view() !== 'view'\"\n (click)=\"view.set('view')\">{{ 'history.revision' | t }}</button>\n </div>\n @if (canRevertSelected()) {\n <button type=\"button\" class=\"btn btn-warning btn-sm spark-history-revert\" [disabled]=\"reverting()\" (click)=\"revert()\">\n {{ 'history.revert' | t }}\n </button>\n }\n <button type=\"button\" class=\"btn btn-outline-secondary btn-sm ms-auto\" (click)=\"clearSelection()\">\n {{ 'history.close' | t }}\n </button>\n </div>\n\n @if (selectedLoading()) {\n <div class=\"text-center p-2\"><bs-spinner /></div>\n } @else if (selectedObject()) {\n @if (view() === 'diff') {\n @if (changes().length === 0) {\n <p class=\"text-muted spark-history-nochanges\">{{ 'history.noChanges' | t }}</p>\n } @else {\n <bs-table [isResponsive]=\"true\">\n <thead>\n <tr>\n <th>{{ 'history.field' | t }}</th>\n <th>{{ 'history.revisionValue' | t }}</th>\n <th>{{ 'history.currentValue' | t }}</th>\n </tr>\n </thead>\n <tbody>\n @for (row of changeCells(); track row.change.attribute.name) {\n <tr class=\"spark-history-change\">\n <th scope=\"row\">{{ row.change.attribute.label | resolveTranslation:row.change.attribute.name }}</th>\n <td class=\"spark-history-old\">\n <spark-grid-cell [column]=\"row.old.column\" [display]=\"row.old.display\" [rendererValue]=\"row.old.rendererValue\"\n [item]=\"selectedObject()\" [chips]=\"row.old.chips\" />\n </td>\n <td class=\"spark-history-new\">\n <spark-grid-cell [column]=\"row.now.column\" [display]=\"row.now.display\" [rendererValue]=\"row.now.rendererValue\"\n [item]=\"current()\" [chips]=\"row.now.chips\" />\n </td>\n </tr>\n }\n </tbody>\n </bs-table>\n }\n } @else {\n <dl class=\"spark-history-view\">\n @for (entry of viewCells(); track entry.attribute.name) {\n <dt>{{ entry.attribute.label | resolveTranslation:entry.attribute.name }}</dt>\n <dd>\n <spark-grid-cell [column]=\"entry.cell.column\" [display]=\"entry.cell.display\" [rendererValue]=\"entry.cell.rendererValue\"\n [item]=\"selectedObject()\" [chips]=\"entry.cell.chips\" />\n </dd>\n }\n </dl>\n }\n }\n </div>\n }\n </div>\n}\n"
412
+ }]
413
+ }],
414
+ ctorParameters: () => [],
415
+ propDecorators: {
416
+ type: [{
417
+ type: i0.Input,
418
+ args: [{
419
+ isSignal: true,
420
+ alias: "type",
421
+ required: true
422
+ }]
423
+ }],
424
+ id: [{
425
+ type: i0.Input,
426
+ args: [{
427
+ isSignal: true,
428
+ alias: "id",
429
+ required: true
430
+ }]
431
+ }],
432
+ entityType: [{
433
+ type: i0.Input,
434
+ args: [{
435
+ isSignal: true,
436
+ alias: "entityType",
437
+ required: true
438
+ }]
439
+ }],
440
+ current: [{
441
+ type: i0.Input,
442
+ args: [{
443
+ isSignal: true,
444
+ alias: "current",
445
+ required: false
446
+ }]
447
+ }],
448
+ permissions: [{
449
+ type: i0.Input,
450
+ args: [{
451
+ isSignal: true,
452
+ alias: "permissions",
453
+ required: false
454
+ }]
455
+ }],
456
+ deleted: [{
457
+ type: i0.Input,
458
+ args: [{
459
+ isSignal: true,
460
+ alias: "deleted",
461
+ required: false
462
+ }]
463
+ }],
464
+ pageSize: [{
465
+ type: i0.Input,
466
+ args: [{
467
+ isSignal: true,
468
+ alias: "pageSize",
469
+ required: false
470
+ }]
471
+ }],
472
+ reverted: [{
473
+ type: i0.Output,
474
+ args: ["reverted"]
475
+ }]
476
+ }
477
+ });
478
+ var SparkHistoryPanelComponent = class SparkHistoryPanelComponent {
479
+ context = input.required(...ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []);
480
+ visible = computed(() => this.context().permissions?.canViewHistory === true, ...ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []);
481
+ static ɵfac = i0.ɵɵngDeclareFactory({
482
+ minVersion: "12.0.0",
483
+ version: "22.2.0",
484
+ ngImport: i0,
485
+ type: SparkHistoryPanelComponent,
486
+ deps: [],
487
+ target: i0.ɵɵFactoryTarget.Component
488
+ });
489
+ static ɵcmp = i0.ɵɵngDeclareComponent({
490
+ minVersion: "17.0.0",
491
+ version: "22.2.0",
492
+ type: SparkHistoryPanelComponent,
493
+ isStandalone: true,
494
+ selector: "spark-history-panel",
495
+ inputs: { context: {
496
+ classPropertyName: "context",
497
+ publicName: "context",
498
+ isSignal: true,
499
+ isRequired: true,
500
+ transformFunction: null
501
+ } },
502
+ ngImport: i0,
503
+ template: `
504
+ @if (visible()) {
505
+ <bs-card class="d-block spark-history-panel">
506
+ <bs-card-header>{{ 'history.title' | t }}</bs-card-header>
507
+ <div class="p-3">
508
+ <spark-po-history
509
+ [type]="context().type"
510
+ [id]="context().id"
511
+ [entityType]="context().entityType"
512
+ [current]="context().item"
513
+ [permissions]="context().permissions"
514
+ [deleted]="context().deleted"
515
+ (reverted)="context().reload()" />
516
+ </div>
517
+ </bs-card>
518
+ }
519
+ `,
520
+ isInline: true,
521
+ dependencies: [
522
+ {
523
+ kind: "component",
524
+ type: BsCardComponent,
525
+ selector: "bs-card",
526
+ inputs: ["color", "outline"]
527
+ },
528
+ {
529
+ kind: "component",
530
+ type: BsCardHeaderComponent,
531
+ selector: "bs-card-header",
532
+ inputs: ["color", "navStyle"]
533
+ },
534
+ {
535
+ kind: "component",
536
+ type: SparkPoHistoryComponent,
537
+ selector: "spark-po-history",
538
+ inputs: [
539
+ "type",
540
+ "id",
541
+ "entityType",
542
+ "current",
543
+ "permissions",
544
+ "deleted",
545
+ "pageSize"
546
+ ],
547
+ outputs: ["reverted"]
548
+ },
549
+ {
550
+ kind: "pipe",
551
+ type: TranslateKeyPipe,
552
+ name: "t"
553
+ }
554
+ ],
555
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
556
+ });
557
+ };
558
+ i0.ɵɵngDeclareClassMetadata({
559
+ minVersion: "12.0.0",
560
+ version: "22.2.0",
561
+ ngImport: i0,
562
+ type: SparkHistoryPanelComponent,
563
+ decorators: [{
564
+ type: Component,
565
+ args: [{
566
+ selector: "spark-history-panel",
567
+ imports: [
568
+ BsCardComponent,
569
+ BsCardHeaderComponent,
570
+ TranslateKeyPipe,
571
+ SparkPoHistoryComponent
572
+ ],
573
+ changeDetection: ChangeDetectionStrategy.OnPush,
574
+ template: `
575
+ @if (visible()) {
576
+ <bs-card class="d-block spark-history-panel">
577
+ <bs-card-header>{{ 'history.title' | t }}</bs-card-header>
578
+ <div class="p-3">
579
+ <spark-po-history
580
+ [type]="context().type"
581
+ [id]="context().id"
582
+ [entityType]="context().entityType"
583
+ [current]="context().item"
584
+ [permissions]="context().permissions"
585
+ [deleted]="context().deleted"
586
+ (reverted)="context().reload()" />
587
+ </div>
588
+ </bs-card>
589
+ }
590
+ `
591
+ }]
592
+ }],
593
+ propDecorators: { context: [{
594
+ type: i0.Input,
595
+ args: [{
596
+ isSignal: true,
597
+ alias: "context",
598
+ required: true
599
+ }]
600
+ }] }
601
+ });
602
+ function provideSparkHistory(options) {
603
+ return provideSparkDetailPanels({
604
+ id: "spark-history",
605
+ component: SparkHistoryPanelComponent,
606
+ order: options?.order ?? 100
607
+ });
608
+ }
609
+ export { SparkHistoryPanelComponent, SparkHistoryService, SparkPoHistoryComponent, comparableValue, diffRevision, provideSparkHistory, revisionAttributes };
610
+
611
+ //# sourceMappingURL=mintplayer-ng-spark-history.mjs.map