@juice-js/audit 0.0.0-stage → 1.0.0-alpha.1
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/README.md +74 -2
- package/fesm2022/juice-js-audit-access-log.page-CrH7ib4K.mjs +291 -0
- package/fesm2022/juice-js-audit-access-log.page-CrH7ib4K.mjs.map +1 -0
- package/fesm2022/juice-js-audit-access-logs.page-qVBQLq2K.mjs +588 -0
- package/fesm2022/juice-js-audit-access-logs.page-qVBQLq2K.mjs.map +1 -0
- package/fesm2022/juice-js-audit-data-change.page-CuI9ccJb.mjs +269 -0
- package/fesm2022/juice-js-audit-data-change.page-CuI9ccJb.mjs.map +1 -0
- package/fesm2022/juice-js-audit-data-changes.page-C-k_Shce.mjs +435 -0
- package/fesm2022/juice-js-audit-data-changes.page-C-k_Shce.mjs.map +1 -0
- package/fesm2022/juice-js-audit-overview.page-DnP722u2.mjs +282 -0
- package/fesm2022/juice-js-audit-overview.page-DnP722u2.mjs.map +1 -0
- package/fesm2022/juice-js-audit-paging-D5-1J1rG.mjs +61 -0
- package/fesm2022/juice-js-audit-paging-D5-1J1rG.mjs.map +1 -0
- package/fesm2022/juice-js-audit-trace.page-Df6Sy2x8.mjs +229 -0
- package/fesm2022/juice-js-audit-trace.page-Df6Sy2x8.mjs.map +1 -0
- package/fesm2022/juice-js-audit-ui-DnfhiB6p.mjs +1123 -0
- package/fesm2022/juice-js-audit-ui-DnfhiB6p.mjs.map +1 -0
- package/fesm2022/juice-js-audit.mjs +313 -0
- package/fesm2022/juice-js-audit.mjs.map +1 -0
- package/package.json +45 -4
- package/styles/_audit.scss +139 -0
- package/types/juice-js-audit.d.ts +216 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { AuditApiService, AuditContextService, AuditLinkPipe, accessLogSummary } from "./juice-js-audit.mjs";
|
|
2
|
+
import { c as TraceRef, f as formatValue, i as ChangeDiff, m as apiResource, n as ActionBadge, p as problemText, r as AuditContextBar, t as AccessLogTable, u as KeysPipe } from "./juice-js-audit-ui-DnfhiB6p.mjs";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import { ChangeDetectionStrategy, Component, computed, inject, input } from "@angular/core";
|
|
5
|
+
import { RouterLink } from "@angular/router";
|
|
6
|
+
import { of } from "rxjs";
|
|
7
|
+
import { DatePipe } from "@angular/common";
|
|
8
|
+
import * as i2 from "@angular/material/progress-bar";
|
|
9
|
+
import { MatProgressBarModule } from "@angular/material/progress-bar";
|
|
10
|
+
import * as i1 from "@angular/material/button";
|
|
11
|
+
import { MatButtonModule } from "@angular/material/button";
|
|
12
|
+
var DataChangePage = class DataChangePage {
|
|
13
|
+
api = inject(AuditApiService);
|
|
14
|
+
ctx = inject(AuditContextService);
|
|
15
|
+
id = input.required(...ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []);
|
|
16
|
+
change = apiResource({
|
|
17
|
+
params: () => this.id(),
|
|
18
|
+
stream: ({ params }) => this.api.dataChange(params)
|
|
19
|
+
});
|
|
20
|
+
trace = apiResource({
|
|
21
|
+
params: () => this.change.value()?.traceId ?? void 0,
|
|
22
|
+
stream: ({ params }) => params ? this.api.trace(params) : of(void 0)
|
|
23
|
+
});
|
|
24
|
+
title = computed(() => {
|
|
25
|
+
const c = this.change.value();
|
|
26
|
+
return c ? `${c.schema ? c.schema + "." : ""}${c.table}` : "Data change";
|
|
27
|
+
}, ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
|
|
28
|
+
keyValue = computed(() => {
|
|
29
|
+
const keys = this.change.value()?.keys;
|
|
30
|
+
if (keys && typeof keys === "object" && !Array.isArray(keys)) {
|
|
31
|
+
const values = Object.values(keys);
|
|
32
|
+
return values.length === 1 ? formatValue(values[0]) : null;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}, ...ngDevMode ? [{ debugName: "keyValue" }] : /* istanbul ignore next */ []);
|
|
36
|
+
accessLogs = computed(() => (this.trace.value()?.accessLogs ?? []).map(accessLogSummary), ...ngDevMode ? [{ debugName: "accessLogs" }] : /* istanbul ignore next */ []);
|
|
37
|
+
error = computed(() => problemText(this.change.error()), ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
|
|
38
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
39
|
+
minVersion: "12.0.0",
|
|
40
|
+
version: "22.2.4",
|
|
41
|
+
ngImport: i0,
|
|
42
|
+
type: DataChangePage,
|
|
43
|
+
deps: [],
|
|
44
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
45
|
+
});
|
|
46
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
47
|
+
minVersion: "17.0.0",
|
|
48
|
+
version: "22.2.4",
|
|
49
|
+
type: DataChangePage,
|
|
50
|
+
isStandalone: true,
|
|
51
|
+
selector: "ng-component",
|
|
52
|
+
inputs: { id: {
|
|
53
|
+
classPropertyName: "id",
|
|
54
|
+
publicName: "id",
|
|
55
|
+
isSignal: true,
|
|
56
|
+
isRequired: true,
|
|
57
|
+
transformFunction: null
|
|
58
|
+
} },
|
|
59
|
+
ngImport: i0,
|
|
60
|
+
template: `
|
|
61
|
+
<ja-context-bar [showRange]="false">
|
|
62
|
+
<span class="ja-crumb"><a [routerLink]="['data-changes'] | jaLink" [queryParams]="ctx.keep()">Data changes</a> /</span>
|
|
63
|
+
<h1>{{ title() }}</h1>
|
|
64
|
+
</ja-context-bar>
|
|
65
|
+
@if (change.isLoading()) { <mat-progress-bar mode="indeterminate" /> }
|
|
66
|
+
@if (change.error()) { <p class="ja-error">{{ error() }}</p> }
|
|
67
|
+
@if (change.value(); as c) {
|
|
68
|
+
<div class="ja-summary">
|
|
69
|
+
<ja-action [action]="c.action" />
|
|
70
|
+
<span>{{ c.dateTime | date: 'MMM d, y, HH:mm:ss.SSS' }}</span>
|
|
71
|
+
<span>by <strong>{{ c.user || 'no user' }}</strong></span>
|
|
72
|
+
@if (c.tenantId) { <span class="ja-muted">tenant {{ c.tenantId }}</span> }
|
|
73
|
+
<span class="ja-mono">{{ c.keys | jaKeys }}</span>
|
|
74
|
+
@if (c.database) { <span class="ja-muted">database {{ c.database }}</span> }
|
|
75
|
+
<span class="ja-muted">trace <ja-trace-ref [traceId]="c.traceId" [short]="false" /></span>
|
|
76
|
+
</div>
|
|
77
|
+
<section class="ja-card">
|
|
78
|
+
<div class="ja-row"><h2>Values</h2>
|
|
79
|
+
@if (keyValue(); as k) {
|
|
80
|
+
<a mat-button [routerLink]="['data-changes'] | jaLink" [queryParams]="ctx.keep({ table: c.table, key: k })">History of this row</a>
|
|
81
|
+
}
|
|
82
|
+
</div>
|
|
83
|
+
<ja-change-diff [changes]="c.changes" />
|
|
84
|
+
</section>
|
|
85
|
+
<section class="ja-card">
|
|
86
|
+
<h2>Made by</h2>
|
|
87
|
+
@if (!c.traceId) { <p class="ja-muted">No trace id was recorded with this change.</p> }
|
|
88
|
+
@if (trace.isLoading()) { <mat-progress-bar mode="indeterminate" /> }
|
|
89
|
+
@if (trace.value(); as t) {
|
|
90
|
+
@if (t.accessLogs.length === 0) { <p class="ja-muted">No access record under this trace: the work that made it was not audited, or ran in another service.</p> }
|
|
91
|
+
@else { <ja-access-log-table [rows]="accessLogs()" [compact]="true" /> }
|
|
92
|
+
@if (t.dataChanges.length > 1) {
|
|
93
|
+
<p><a [routerLink]="['traces', t.traceId] | jaLink" [queryParams]="ctx.keep()">{{ t.dataChanges.length - 1 }} more change{{ t.dataChanges.length === 2 ? '' : 's' }} in the same trace</a></p>
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
</section>
|
|
97
|
+
}`,
|
|
98
|
+
isInline: true,
|
|
99
|
+
dependencies: [
|
|
100
|
+
{
|
|
101
|
+
kind: "directive",
|
|
102
|
+
type: RouterLink,
|
|
103
|
+
selector: "[routerLink]",
|
|
104
|
+
inputs: [
|
|
105
|
+
"target",
|
|
106
|
+
"queryParams",
|
|
107
|
+
"fragment",
|
|
108
|
+
"queryParamsHandling",
|
|
109
|
+
"state",
|
|
110
|
+
"info",
|
|
111
|
+
"relativeTo",
|
|
112
|
+
"preserveFragment",
|
|
113
|
+
"skipLocationChange",
|
|
114
|
+
"replaceUrl",
|
|
115
|
+
"browserUrl",
|
|
116
|
+
"routerLink"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
kind: "ngmodule",
|
|
121
|
+
type: MatButtonModule
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
kind: "component",
|
|
125
|
+
type: i1.MatButton,
|
|
126
|
+
selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ",
|
|
127
|
+
inputs: ["matButton"],
|
|
128
|
+
exportAs: ["matButton", "matAnchor"]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
kind: "ngmodule",
|
|
132
|
+
type: MatProgressBarModule
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
kind: "component",
|
|
136
|
+
type: i2.MatProgressBar,
|
|
137
|
+
selector: "mat-progress-bar",
|
|
138
|
+
inputs: [
|
|
139
|
+
"color",
|
|
140
|
+
"value",
|
|
141
|
+
"bufferValue",
|
|
142
|
+
"mode"
|
|
143
|
+
],
|
|
144
|
+
outputs: ["animationEnd"],
|
|
145
|
+
exportAs: ["matProgressBar"]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
kind: "component",
|
|
149
|
+
type: AuditContextBar,
|
|
150
|
+
selector: "ja-context-bar",
|
|
151
|
+
inputs: ["showRange"]
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
kind: "component",
|
|
155
|
+
type: AccessLogTable,
|
|
156
|
+
selector: "ja-access-log-table",
|
|
157
|
+
inputs: ["rows", "compact"]
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
kind: "component",
|
|
161
|
+
type: ActionBadge,
|
|
162
|
+
selector: "ja-action",
|
|
163
|
+
inputs: ["action"]
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
kind: "component",
|
|
167
|
+
type: ChangeDiff,
|
|
168
|
+
selector: "ja-change-diff",
|
|
169
|
+
inputs: ["changes"]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
kind: "component",
|
|
173
|
+
type: TraceRef,
|
|
174
|
+
selector: "ja-trace-ref",
|
|
175
|
+
inputs: ["traceId", "short"]
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
kind: "pipe",
|
|
179
|
+
type: DatePipe,
|
|
180
|
+
name: "date"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
kind: "pipe",
|
|
184
|
+
type: AuditLinkPipe,
|
|
185
|
+
name: "jaLink"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
kind: "pipe",
|
|
189
|
+
type: KeysPipe,
|
|
190
|
+
name: "jaKeys"
|
|
191
|
+
}
|
|
192
|
+
],
|
|
193
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
197
|
+
minVersion: "12.0.0",
|
|
198
|
+
version: "22.2.4",
|
|
199
|
+
ngImport: i0,
|
|
200
|
+
type: DataChangePage,
|
|
201
|
+
decorators: [{
|
|
202
|
+
type: Component,
|
|
203
|
+
args: [{
|
|
204
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
205
|
+
imports: [
|
|
206
|
+
RouterLink,
|
|
207
|
+
DatePipe,
|
|
208
|
+
MatButtonModule,
|
|
209
|
+
MatProgressBarModule,
|
|
210
|
+
AuditLinkPipe,
|
|
211
|
+
KeysPipe,
|
|
212
|
+
AuditContextBar,
|
|
213
|
+
AccessLogTable,
|
|
214
|
+
ActionBadge,
|
|
215
|
+
ChangeDiff,
|
|
216
|
+
TraceRef
|
|
217
|
+
],
|
|
218
|
+
template: `
|
|
219
|
+
<ja-context-bar [showRange]="false">
|
|
220
|
+
<span class="ja-crumb"><a [routerLink]="['data-changes'] | jaLink" [queryParams]="ctx.keep()">Data changes</a> /</span>
|
|
221
|
+
<h1>{{ title() }}</h1>
|
|
222
|
+
</ja-context-bar>
|
|
223
|
+
@if (change.isLoading()) { <mat-progress-bar mode="indeterminate" /> }
|
|
224
|
+
@if (change.error()) { <p class="ja-error">{{ error() }}</p> }
|
|
225
|
+
@if (change.value(); as c) {
|
|
226
|
+
<div class="ja-summary">
|
|
227
|
+
<ja-action [action]="c.action" />
|
|
228
|
+
<span>{{ c.dateTime | date: 'MMM d, y, HH:mm:ss.SSS' }}</span>
|
|
229
|
+
<span>by <strong>{{ c.user || 'no user' }}</strong></span>
|
|
230
|
+
@if (c.tenantId) { <span class="ja-muted">tenant {{ c.tenantId }}</span> }
|
|
231
|
+
<span class="ja-mono">{{ c.keys | jaKeys }}</span>
|
|
232
|
+
@if (c.database) { <span class="ja-muted">database {{ c.database }}</span> }
|
|
233
|
+
<span class="ja-muted">trace <ja-trace-ref [traceId]="c.traceId" [short]="false" /></span>
|
|
234
|
+
</div>
|
|
235
|
+
<section class="ja-card">
|
|
236
|
+
<div class="ja-row"><h2>Values</h2>
|
|
237
|
+
@if (keyValue(); as k) {
|
|
238
|
+
<a mat-button [routerLink]="['data-changes'] | jaLink" [queryParams]="ctx.keep({ table: c.table, key: k })">History of this row</a>
|
|
239
|
+
}
|
|
240
|
+
</div>
|
|
241
|
+
<ja-change-diff [changes]="c.changes" />
|
|
242
|
+
</section>
|
|
243
|
+
<section class="ja-card">
|
|
244
|
+
<h2>Made by</h2>
|
|
245
|
+
@if (!c.traceId) { <p class="ja-muted">No trace id was recorded with this change.</p> }
|
|
246
|
+
@if (trace.isLoading()) { <mat-progress-bar mode="indeterminate" /> }
|
|
247
|
+
@if (trace.value(); as t) {
|
|
248
|
+
@if (t.accessLogs.length === 0) { <p class="ja-muted">No access record under this trace: the work that made it was not audited, or ran in another service.</p> }
|
|
249
|
+
@else { <ja-access-log-table [rows]="accessLogs()" [compact]="true" /> }
|
|
250
|
+
@if (t.dataChanges.length > 1) {
|
|
251
|
+
<p><a [routerLink]="['traces', t.traceId] | jaLink" [queryParams]="ctx.keep()">{{ t.dataChanges.length - 1 }} more change{{ t.dataChanges.length === 2 ? '' : 's' }} in the same trace</a></p>
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
</section>
|
|
255
|
+
}`
|
|
256
|
+
}]
|
|
257
|
+
}],
|
|
258
|
+
propDecorators: { id: [{
|
|
259
|
+
type: i0.Input,
|
|
260
|
+
args: [{
|
|
261
|
+
isSignal: true,
|
|
262
|
+
alias: "id",
|
|
263
|
+
required: true
|
|
264
|
+
}]
|
|
265
|
+
}] }
|
|
266
|
+
});
|
|
267
|
+
export { DataChangePage };
|
|
268
|
+
|
|
269
|
+
//# sourceMappingURL=juice-js-audit-data-change.page-CuI9ccJb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"juice-js-audit-data-change.page-CuI9ccJb.mjs","names":[],"sources":["../../../../projects/juice-js/audit/src/lib/pages/data-change.page.ts"],"sourcesContent":["import { DatePipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { apiResource } from '../shared/resource';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { RouterLink } from '@angular/router';\nimport { of } from 'rxjs';\nimport { AuditApiService } from '../core/api.service';\nimport { accessLogSummary } from '../core/models';\nimport { AuditContextService } from '../core/context.service';\nimport { AuditLinkPipe } from '../core/options';\nimport { KeysPipe, formatValue, problemText } from '../shared/format';\nimport { AccessLogTable, ActionBadge, AuditContextBar, ChangeDiff, TraceRef } from '../shared/ui';\n\n/** One row change: its values before and after, and the request, message or job that made it. */\n@Component({\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, DatePipe, MatButtonModule, MatProgressBarModule, AuditLinkPipe, KeysPipe, AuditContextBar,\n AccessLogTable, ActionBadge, ChangeDiff, TraceRef],\n template: `\n <ja-context-bar [showRange]=\"false\">\n <span class=\"ja-crumb\"><a [routerLink]=\"['data-changes'] | jaLink\" [queryParams]=\"ctx.keep()\">Data changes</a> /</span>\n <h1>{{ title() }}</h1>\n </ja-context-bar>\n @if (change.isLoading()) { <mat-progress-bar mode=\"indeterminate\" /> }\n @if (change.error()) { <p class=\"ja-error\">{{ error() }}</p> }\n @if (change.value(); as c) {\n <div class=\"ja-summary\">\n <ja-action [action]=\"c.action\" />\n <span>{{ c.dateTime | date: 'MMM d, y, HH:mm:ss.SSS' }}</span>\n <span>by <strong>{{ c.user || 'no user' }}</strong></span>\n @if (c.tenantId) { <span class=\"ja-muted\">tenant {{ c.tenantId }}</span> }\n <span class=\"ja-mono\">{{ c.keys | jaKeys }}</span>\n @if (c.database) { <span class=\"ja-muted\">database {{ c.database }}</span> }\n <span class=\"ja-muted\">trace <ja-trace-ref [traceId]=\"c.traceId\" [short]=\"false\" /></span>\n </div>\n <section class=\"ja-card\">\n <div class=\"ja-row\"><h2>Values</h2>\n @if (keyValue(); as k) {\n <a mat-button [routerLink]=\"['data-changes'] | jaLink\" [queryParams]=\"ctx.keep({ table: c.table, key: k })\">History of this row</a>\n }\n </div>\n <ja-change-diff [changes]=\"c.changes\" />\n </section>\n <section class=\"ja-card\">\n <h2>Made by</h2>\n @if (!c.traceId) { <p class=\"ja-muted\">No trace id was recorded with this change.</p> }\n @if (trace.isLoading()) { <mat-progress-bar mode=\"indeterminate\" /> }\n @if (trace.value(); as t) {\n @if (t.accessLogs.length === 0) { <p class=\"ja-muted\">No access record under this trace: the work that made it was not audited, or ran in another service.</p> }\n @else { <ja-access-log-table [rows]=\"accessLogs()\" [compact]=\"true\" /> }\n @if (t.dataChanges.length > 1) {\n <p><a [routerLink]=\"['traces', t.traceId] | jaLink\" [queryParams]=\"ctx.keep()\">{{ t.dataChanges.length - 1 }} more change{{ t.dataChanges.length === 2 ? '' : 's' }} in the same trace</a></p>\n }\n }\n </section>\n }`,\n})\nexport class DataChangePage {\n private readonly api = inject(AuditApiService);\n protected readonly ctx = inject(AuditContextService);\n readonly id = input.required<string>();\n\n protected readonly change = apiResource({ params: () => this.id(), stream: ({ params }) => this.api.dataChange(params) });\n protected readonly trace = apiResource({\n params: () => this.change.value()?.traceId ?? undefined,\n stream: ({ params }) => params ? this.api.trace(params) : of(undefined),\n });\n protected readonly title = computed(() => {\n const c = this.change.value();\n return c ? `${c.schema ? c.schema + '.' : ''}${c.table}` : 'Data change';\n });\n /** The row's key when it has a single one: the value a key search finds its history by. */\n protected readonly keyValue = computed(() => {\n const keys = this.change.value()?.keys;\n if (keys && typeof keys === 'object' && !Array.isArray(keys)) {\n const values = Object.values(keys);\n return values.length === 1 ? formatValue(values[0]) : null;\n }\n return null;\n });\n protected readonly accessLogs = computed(() => (this.trace.value()?.accessLogs ?? []).map(accessLogSummary));\n protected readonly error = computed(() => problemText(this.change.error()));\n}\n"],"mappings":"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"}
|