@quazardous/qdadm 2.32.0 → 2.33.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 (36) hide show
  1. package/dist/styles/qdadm.css +1 -1
  2. package/package.json +8 -2
  3. package/src/components/display/EmailPreview.vue +227 -0
  4. package/src/components/display/EntityTimeline.vue +408 -0
  5. package/src/components/display/LogStream.vue +364 -0
  6. package/src/components/display/PayloadDiff.vue +236 -0
  7. package/src/components/display/PayloadViewer.vue +246 -0
  8. package/src/components/index.ts +8 -0
  9. package/src/components/layout/AppLayout.vue +8 -0
  10. package/src/components/tasks/TaskDialog.vue +95 -0
  11. package/src/components/tasks/TaskHost.vue +45 -0
  12. package/src/components/tasks/TaskTray.vue +54 -0
  13. package/src/composables/index.ts +11 -0
  14. package/src/composables/useListPage.filters.ts +26 -1
  15. package/src/composables/useLogStream.ts +264 -0
  16. package/src/email/index.ts +46 -0
  17. package/src/entity/storage/SdkStorage.ts +53 -1
  18. package/src/entity/storage/index.ts +2 -0
  19. package/src/i18n/defaults/core.en.generated.ts +85 -0
  20. package/src/i18n/defaults/core.en.yml +85 -0
  21. package/src/i18n/defaults/core.fr.generated.ts +85 -0
  22. package/src/i18n/defaults/core.fr.yml +85 -0
  23. package/src/index.ts +21 -0
  24. package/src/kernel/Kernel.vue.ts +9 -2
  25. package/src/styles/_email.scss +188 -0
  26. package/src/styles/_log-stream.scss +167 -0
  27. package/src/styles/_payload.scss +312 -0
  28. package/src/styles/_tasks.scss +212 -0
  29. package/src/styles/_timeline.scss +229 -0
  30. package/src/styles/index.scss +5 -0
  31. package/src/tasks/taskStore.ts +460 -0
  32. package/src/tasks/useTaskRunner.ts +52 -0
  33. package/src/utils/ansi.ts +127 -0
  34. package/src/utils/email.ts +270 -0
  35. package/src/utils/index.ts +32 -0
  36. package/src/utils/payload.ts +480 -0
@@ -0,0 +1,312 @@
1
+ /**
2
+ * PayloadViewer / PayloadDiff (#4112)
3
+ */
4
+
5
+ @use 'variables' as *;
6
+
7
+ .qd-payload {
8
+ --pl-tag: #22863a;
9
+ --pl-attr: #6f42c1;
10
+ --pl-value: #032f62;
11
+ --pl-comment: #6a737d;
12
+ --pl-ins-bg: rgba(46, 160, 67, 0.16);
13
+ --pl-del-bg: rgba(248, 81, 73, 0.16);
14
+
15
+ border: 1px solid var(--p-surface-200);
16
+ border-radius: $radius-sm;
17
+ overflow: hidden;
18
+ min-width: 0;
19
+ background: var(--p-surface-0);
20
+ }
21
+
22
+ .qd-payload-request {
23
+ padding: 0.5rem 0.75rem;
24
+ border-bottom: 1px solid var(--p-surface-200);
25
+ background: var(--p-surface-50);
26
+ font-size: $font-size-sm;
27
+ }
28
+
29
+ .qd-payload-line {
30
+ display: flex;
31
+ flex-wrap: wrap;
32
+ align-items: center;
33
+ gap: 0.5rem;
34
+ min-width: 0;
35
+ }
36
+
37
+ .pl-method {
38
+ font-weight: 700;
39
+ font-family: $font-family-mono;
40
+ }
41
+
42
+ .pl-url {
43
+ font-family: $font-family-mono;
44
+ word-break: break-all;
45
+ min-width: 0;
46
+ }
47
+
48
+ .pl-status {
49
+ padding: 0 0.5rem;
50
+ border-radius: 999px;
51
+ font-weight: 600;
52
+ font-size: $font-size-xs;
53
+ background: var(--p-surface-200);
54
+
55
+ &--ok { background: var(--p-green-100); color: var(--p-green-800); }
56
+ &--info { background: var(--p-blue-100); color: var(--p-blue-800); }
57
+ &--warn { background: var(--p-orange-100); color: var(--p-orange-800); }
58
+ &--error { background: var(--p-red-100); color: var(--p-red-800); }
59
+ }
60
+
61
+ .qd-payload-headers {
62
+ margin-top: 0.375rem;
63
+
64
+ summary {
65
+ cursor: pointer;
66
+ color: var(--p-text-muted-color);
67
+ }
68
+
69
+ table {
70
+ margin-top: 0.25rem;
71
+ border-collapse: collapse;
72
+ font-family: $font-family-mono;
73
+ font-size: $font-size-xs;
74
+ }
75
+
76
+ th {
77
+ text-align: left;
78
+ padding: 0.125rem 1rem 0.125rem 0;
79
+ font-weight: 600;
80
+ white-space: nowrap;
81
+ vertical-align: top;
82
+ }
83
+
84
+ td {
85
+ word-break: break-all;
86
+ }
87
+ }
88
+
89
+ .qd-payload-toolbar {
90
+ display: flex;
91
+ align-items: center;
92
+ flex-wrap: wrap;
93
+ gap: 0.5rem;
94
+ padding: 0.125rem 0.5rem;
95
+ border-bottom: 1px solid var(--p-surface-200);
96
+ font-size: $font-size-xs;
97
+ }
98
+
99
+ .qd-payload-format {
100
+ font-weight: 700;
101
+ letter-spacing: 0.05em;
102
+ color: var(--p-text-muted-color);
103
+ }
104
+
105
+ .qd-payload-size {
106
+ color: var(--p-text-muted-color);
107
+ }
108
+
109
+ .qd-payload-spacer {
110
+ flex: 1;
111
+ }
112
+
113
+ .qd-payload-check {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ gap: 0.25rem;
117
+ cursor: pointer;
118
+ }
119
+
120
+ .qd-payload-warning,
121
+ .qd-payload-identical {
122
+ padding: 0.375rem 0.75rem;
123
+ font-size: $font-size-sm;
124
+ }
125
+
126
+ .qd-payload-warning {
127
+ background: var(--p-orange-50);
128
+ color: var(--p-orange-800);
129
+ }
130
+
131
+ .qd-payload-identical {
132
+ background: var(--p-green-50);
133
+ color: var(--p-green-800);
134
+ }
135
+
136
+ .qd-payload-body {
137
+ overflow: auto;
138
+
139
+ .json-viewer {
140
+ border: none;
141
+ border-radius: 0;
142
+ }
143
+ }
144
+
145
+ .qd-payload-code {
146
+ margin: 0;
147
+ padding: 0.5rem 0.75rem 0.5rem 0;
148
+ font-family: $font-family-mono;
149
+ font-size: 0.8125rem;
150
+ line-height: 1.5;
151
+ white-space: pre;
152
+ }
153
+
154
+ .pl-n {
155
+ display: inline-block;
156
+ min-width: 3rem;
157
+ padding-right: 0.75rem;
158
+ text-align: right;
159
+ color: var(--p-text-muted-color);
160
+ user-select: none;
161
+ }
162
+
163
+ .pl-tag { color: var(--pl-tag); }
164
+ .pl-attr { color: var(--pl-attr); }
165
+ .pl-value { color: var(--pl-value); }
166
+ .pl-punct { color: var(--p-text-muted-color); }
167
+ .pl-comment, .pl-decl { color: var(--pl-comment); font-style: italic; }
168
+ .pl-cdata { color: var(--pl-comment); }
169
+
170
+ .qd-payload-table-wrap {
171
+ min-width: 0;
172
+ }
173
+
174
+ .qd-payload-table {
175
+ border-collapse: collapse;
176
+ font-size: $font-size-sm;
177
+ width: max-content;
178
+ min-width: 100%;
179
+
180
+ th,
181
+ td {
182
+ padding: 0.25rem 0.75rem;
183
+ border-bottom: 1px solid var(--p-surface-100);
184
+ text-align: left;
185
+ vertical-align: top;
186
+ white-space: pre-wrap;
187
+ }
188
+
189
+ thead th {
190
+ position: sticky;
191
+ top: 0;
192
+ background: var(--p-surface-50);
193
+ font-weight: 600;
194
+ }
195
+
196
+ .pl-n {
197
+ display: table-cell;
198
+ min-width: 0;
199
+ }
200
+ }
201
+
202
+ .qd-payload-kv th {
203
+ font-family: $font-family-mono;
204
+ font-weight: 600;
205
+ white-space: nowrap;
206
+ }
207
+
208
+ .qd-payload-more {
209
+ display: block;
210
+ width: 100%;
211
+ padding: 0.375rem;
212
+ border: none;
213
+ background: var(--p-surface-50);
214
+ color: var(--p-primary-color);
215
+ cursor: pointer;
216
+ }
217
+
218
+ .qd-payload-binary p {
219
+ margin: 0.5rem 0.75rem;
220
+ font-size: $font-size-sm;
221
+ }
222
+
223
+ // --- Diff ---
224
+
225
+ .pl-count {
226
+ font-weight: 700;
227
+ font-variant-numeric: tabular-nums;
228
+
229
+ &--add { color: var(--p-green-600); }
230
+ &--del { color: var(--p-red-600); }
231
+ &--chg { color: var(--p-orange-600); }
232
+ }
233
+
234
+ .pl-diff {
235
+ width: 100%;
236
+ border-collapse: collapse;
237
+ table-layout: fixed;
238
+ font-family: $font-family-mono;
239
+ font-size: 0.8125rem;
240
+ line-height: 1.5;
241
+
242
+ th {
243
+ padding: 0.25rem 0.75rem;
244
+ background: var(--p-surface-50);
245
+ font-family: var(--p-font-family, inherit);
246
+ font-size: $font-size-xs;
247
+ text-align: left;
248
+ }
249
+
250
+ td {
251
+ padding: 0 0.5rem;
252
+ white-space: pre-wrap;
253
+ word-break: break-all;
254
+ vertical-align: top;
255
+ }
256
+
257
+ td.pl-n {
258
+ display: table-cell;
259
+ width: 3rem;
260
+ min-width: 0;
261
+ }
262
+
263
+ .pl-sign {
264
+ width: 1rem;
265
+ padding: 0;
266
+ text-align: center;
267
+ }
268
+ }
269
+
270
+ .pl-diff--split td:nth-child(3) {
271
+ border-left: 1px solid var(--p-surface-200);
272
+ }
273
+
274
+ .pl-ins,
275
+ tr.pl-ins td {
276
+ background: var(--pl-ins-bg);
277
+ }
278
+
279
+ .pl-del,
280
+ tr.pl-del td {
281
+ background: var(--pl-del-bg);
282
+ }
283
+
284
+ .pl-empty {
285
+ background: repeating-linear-gradient(45deg, transparent 0 4px, var(--p-surface-100) 4px 8px);
286
+ }
287
+
288
+ .pl-fold td {
289
+ padding: 0;
290
+
291
+ button {
292
+ width: 100%;
293
+ padding: 0.125rem;
294
+ border: none;
295
+ background: var(--p-surface-100);
296
+ color: var(--p-text-muted-color);
297
+ font-size: $font-size-xs;
298
+ cursor: pointer;
299
+ }
300
+ }
301
+
302
+ .pl-csv-diff {
303
+ .pl-row--added td { background: var(--pl-ins-bg); }
304
+ .pl-row--removed td { background: var(--pl-del-bg); }
305
+
306
+ .pl-cell--changed {
307
+ background: color-mix(in srgb, var(--p-orange-400) 18%, transparent);
308
+
309
+ del { color: var(--p-red-700); }
310
+ ins { color: var(--p-green-700); text-decoration: none; font-weight: 600; }
311
+ }
312
+ }
@@ -0,0 +1,212 @@
1
+ /**
2
+ * TaskRunner (#4114): follow dialog, typed confirmation, sidebar tray
3
+ */
4
+
5
+ @use 'variables' as *;
6
+
7
+ .qd-task-head {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: 0.75rem;
11
+ margin-bottom: 0.75rem;
12
+ font-size: $font-size-sm;
13
+ }
14
+
15
+ .qd-task-status {
16
+ display: inline-flex;
17
+ align-items: center;
18
+ gap: 0.375rem;
19
+ padding: 0.125rem 0.625rem;
20
+ border-radius: 999px;
21
+ font-weight: 600;
22
+ background: var(--p-blue-50);
23
+ color: var(--p-blue-700);
24
+
25
+ &--succeeded { background: var(--p-green-50); color: var(--p-green-700); }
26
+ &--failed { background: var(--p-red-50); color: var(--p-red-700); }
27
+ &--cancelled { background: var(--p-surface-100); color: var(--p-text-muted-color); }
28
+ }
29
+
30
+ .qd-task-elapsed,
31
+ .qd-task-id {
32
+ color: var(--p-text-muted-color);
33
+ font-variant-numeric: tabular-nums;
34
+ }
35
+
36
+ .qd-task-id {
37
+ margin-left: auto;
38
+ font-family: $font-family-mono;
39
+ font-size: $font-size-xs;
40
+ }
41
+
42
+ .qd-task-progress {
43
+ height: 0.75rem;
44
+ }
45
+
46
+ .qd-task-step {
47
+ margin-top: 0.375rem;
48
+ color: var(--p-text-muted-color);
49
+ font-size: $font-size-sm;
50
+ }
51
+
52
+ .qd-task-log {
53
+ margin-top: 0.75rem;
54
+ }
55
+
56
+ .qd-task-error,
57
+ .qd-task-warning {
58
+ margin-top: 0.75rem;
59
+ padding: 0.5rem 0.75rem;
60
+ border-radius: $radius-sm;
61
+ font-size: $font-size-sm;
62
+ overflow-wrap: anywhere;
63
+ }
64
+
65
+ .qd-task-error {
66
+ background: var(--p-red-50);
67
+ color: var(--p-red-800);
68
+ }
69
+
70
+ .qd-task-warning {
71
+ background: var(--p-orange-50);
72
+ color: var(--p-orange-800);
73
+ }
74
+
75
+ .qd-task-result {
76
+ margin-top: 0.75rem;
77
+ }
78
+
79
+ .qd-task-dialog .p-dialog-footer {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 0.5rem;
83
+ }
84
+
85
+ .qd-task-spacer {
86
+ flex: 1;
87
+ }
88
+
89
+ .qd-task-link {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ gap: 0.375rem;
93
+ font-size: $font-size-sm;
94
+ }
95
+
96
+ .qd-task-confirm-message {
97
+ margin: 0 0 0.75rem;
98
+ }
99
+
100
+ .qd-task-confirm-label {
101
+ display: block;
102
+ margin-bottom: 0.375rem;
103
+ font-size: $font-size-sm;
104
+ }
105
+
106
+ .qd-task-confirm-input {
107
+ width: 100%;
108
+ font-family: $font-family-mono;
109
+ }
110
+
111
+ // --- Tray (in the sidebar) ---
112
+
113
+ .qd-task-tray {
114
+ padding: 0.25rem 0.75rem;
115
+ }
116
+
117
+ .qd-task-tray-button {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 0.5rem;
121
+ width: 100%;
122
+ padding: 0.5rem 0.625rem;
123
+ border: 1px solid var(--p-surface-200);
124
+ border-radius: $radius-sm;
125
+ background: var(--p-surface-0);
126
+ color: inherit;
127
+ font: inherit;
128
+ font-size: $font-size-sm;
129
+ cursor: pointer;
130
+
131
+ &--busy {
132
+ border-color: var(--p-primary-color);
133
+ }
134
+
135
+ &:hover {
136
+ background: var(--p-surface-50);
137
+ }
138
+ }
139
+
140
+ .qd-task-tray-label {
141
+ flex: 1;
142
+ text-align: left;
143
+ min-width: 0;
144
+ overflow: hidden;
145
+ text-overflow: ellipsis;
146
+ white-space: nowrap;
147
+ }
148
+
149
+ .qd-task-tray-count {
150
+ min-width: 1.25rem;
151
+ padding: 0 0.375rem;
152
+ border-radius: 999px;
153
+ background: var(--p-primary-color);
154
+ color: var(--p-primary-contrast-color);
155
+ font-size: $font-size-xs;
156
+ font-weight: 700;
157
+ text-align: center;
158
+ }
159
+
160
+ .qd-task-list {
161
+ list-style: none;
162
+ margin: 0 0 0.25rem;
163
+ padding: 0;
164
+ min-width: 18rem;
165
+ max-width: 24rem;
166
+ }
167
+
168
+ .qd-task-item {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: 0.5rem;
172
+ width: 100%;
173
+ padding: 0.375rem 0.5rem;
174
+ border: none;
175
+ border-radius: $radius-sm;
176
+ background: transparent;
177
+ color: inherit;
178
+ font: inherit;
179
+ font-size: $font-size-sm;
180
+ text-align: left;
181
+ cursor: pointer;
182
+
183
+ &:hover {
184
+ background: var(--p-surface-100);
185
+ }
186
+
187
+ &--succeeded i { color: var(--p-green-600); }
188
+ &--failed i { color: var(--p-red-600); }
189
+ &--cancelled i { color: var(--p-text-muted-color); }
190
+ }
191
+
192
+ .qd-task-item-label {
193
+ flex: 1;
194
+ min-width: 0;
195
+ overflow: hidden;
196
+ text-overflow: ellipsis;
197
+ white-space: nowrap;
198
+ }
199
+
200
+ .qd-task-item-state {
201
+ color: var(--p-text-muted-color);
202
+ font-size: $font-size-xs;
203
+ white-space: nowrap;
204
+ }
205
+
206
+ .sidebar--collapsed .qd-task-tray {
207
+ padding: 0.25rem;
208
+
209
+ .qd-task-tray-label {
210
+ display: none;
211
+ }
212
+ }