@memberjunction/ng-dashboards 6.2.0-edge.2 → 6.2.0-edge.4
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/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts +4 -3
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +8 -5
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
- package/dist/AI/components/duplicates/compare-value.component.d.ts +67 -0
- package/dist/AI/components/duplicates/compare-value.component.d.ts.map +1 -0
- package/dist/AI/components/duplicates/compare-value.component.js +168 -0
- package/dist/AI/components/duplicates/compare-value.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +49 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +287 -169
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +77 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +116 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +16 -4
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +2 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +12 -6
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-index-auto.d.ts +29 -0
- package/dist/AI/components/vectors/vector-index-auto.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-index-auto.js +59 -0
- package/dist/AI/components/vectors/vector-index-auto.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +9 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +65 -20
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +7 -3
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +3 -2
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +0 -3
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +5 -14
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +12 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.js +128 -81
- package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +12 -10
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts +14 -43
- package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-agent-context.js +6 -29
- package/dist/DashboardBrowser/dashboard-browser-agent-context.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +174 -321
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +522 -1195
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-library-filter.d.ts +116 -0
- package/dist/DashboardBrowser/dashboard-library-filter.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboard-library-filter.js +277 -0
- package/dist/DashboardBrowser/dashboard-library-filter.js.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboards-agent-tools.d.ts +26 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.js +32 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.js.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts +58 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.js +391 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.js.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts +37 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.js +68 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.js.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.component.d.ts +295 -0
- package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.component.js +1022 -0
- package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.types.d.ts +23 -0
- package/dist/DashboardEditor/dashboard-editor.types.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.types.js +3 -0
- package/dist/DashboardEditor/dashboard-editor.types.js.map +1 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.d.ts +11 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.js +17 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.js.map +1 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +30 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +349 -232
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +2 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +0 -14
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +7 -29
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Home/home-agent-context.d.ts +29 -10
- package/dist/Home/home-agent-context.d.ts.map +1 -1
- package/dist/Home/home-agent-context.js +50 -24
- package/dist/Home/home-agent-context.js.map +1 -1
- package/dist/Home/home-dashboard-switcher.component.d.ts +95 -0
- package/dist/Home/home-dashboard-switcher.component.d.ts.map +1 -0
- package/dist/Home/home-dashboard-switcher.component.js +442 -0
- package/dist/Home/home-dashboard-switcher.component.js.map +1 -0
- package/dist/Home/home-dashboard.component.d.ts +330 -17
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +1702 -1014
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Home/home-menus.d.ts +38 -0
- package/dist/Home/home-menus.d.ts.map +1 -0
- package/dist/Home/home-menus.js +53 -0
- package/dist/Home/home-menus.js.map +1 -0
- package/dist/Home/home-pinned-dashboards.d.ts +33 -0
- package/dist/Home/home-pinned-dashboards.d.ts.map +1 -0
- package/dist/Home/home-pinned-dashboards.js +76 -0
- package/dist/Home/home-pinned-dashboards.js.map +1 -0
- package/dist/PredictiveStudio/components/ps-production.component.d.ts +5 -1
- package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-production.component.js +64 -41
- package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +3 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js +2 -2
- package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js.map +1 -1
- package/dist/TelephonyOperations/telephony-operations-agent-context.d.ts +107 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.d.ts.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.js +216 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.js.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts +58 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js +812 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js.map +1 -0
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +7 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/WorkQueue/components/work-queue-bindings.component.d.ts +37 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.js +210 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.d.ts +70 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.js +496 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.d.ts +22 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.js +99 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-overview.component.d.ts +29 -0
- package/dist/WorkQueue/components/work-queue-overview.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-overview.component.js +278 -0
- package/dist/WorkQueue/components/work-queue-overview.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.d.ts +59 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.js +359 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.js.map +1 -0
- package/dist/WorkQueue/services/work-queue-operator.service.d.ts +22 -0
- package/dist/WorkQueue/services/work-queue-operator.service.d.ts.map +1 -0
- package/dist/WorkQueue/services/work-queue-operator.service.js +44 -0
- package/dist/WorkQueue/services/work-queue-operator.service.js.map +1 -0
- package/dist/WorkQueue/work-queue-agent-context.d.ts +67 -0
- package/dist/WorkQueue/work-queue-agent-context.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-agent-context.js +119 -0
- package/dist/WorkQueue/work-queue-agent-context.js.map +1 -0
- package/dist/WorkQueue/work-queue-dashboard.component.d.ts +94 -0
- package/dist/WorkQueue/work-queue-dashboard.component.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-dashboard.component.js +545 -0
- package/dist/WorkQueue/work-queue-dashboard.component.js.map +1 -0
- package/dist/WorkQueue/work-queue-types.d.ts +40 -0
- package/dist/WorkQueue/work-queue-types.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-types.js +2 -0
- package/dist/WorkQueue/work-queue-types.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +21 -20
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +4 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +69 -61
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +29 -2
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +1 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +3 -1
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +14 -13
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +6 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +9 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/dashboard-library-changes.d.ts +23 -0
- package/dist/shared/dashboard-library-changes.d.ts.map +1 -0
- package/dist/shared/dashboard-library-changes.js +26 -0
- package/dist/shared/dashboard-library-changes.js.map +1 -0
- package/dist/shared/dashboard-owner-names.d.ts +17 -0
- package/dist/shared/dashboard-owner-names.d.ts.map +1 -0
- package/dist/shared/dashboard-owner-names.js +65 -0
- package/dist/shared/dashboard-owner-names.js.map +1 -0
- package/dist/shared/dashboard-recents.d.ts +34 -0
- package/dist/shared/dashboard-recents.d.ts.map +1 -0
- package/dist/shared/dashboard-recents.js +87 -0
- package/dist/shared/dashboard-recents.js.map +1 -0
- package/dist/shared/dashboards-app-install.d.ts +59 -0
- package/dist/shared/dashboards-app-install.d.ts.map +1 -0
- package/dist/shared/dashboards-app-install.js +97 -0
- package/dist/shared/dashboards-app-install.js.map +1 -0
- package/dist/shared/dashboards-app.helpers.d.ts +42 -0
- package/dist/shared/dashboards-app.helpers.d.ts.map +1 -0
- package/dist/shared/dashboards-app.helpers.js +143 -0
- package/dist/shared/dashboards-app.helpers.js.map +1 -0
- package/dist/work-queue-dashboards.module.d.ts +23 -0
- package/dist/work-queue-dashboards.module.d.ts.map +1 -0
- package/dist/work-queue-dashboards.module.js +92 -0
- package/dist/work-queue-dashboards.module.js.map +1 -0
- package/package.json +73 -66
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { FormatAge } from '../work-queue-agent-context';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../services/work-queue-operator.service";
|
|
5
|
+
import * as i2 from "@angular/forms";
|
|
6
|
+
import * as i3 from "@memberjunction/ng-ui-components";
|
|
7
|
+
import * as i4 from "@memberjunction/ng-shared-generic";
|
|
8
|
+
import * as i5 from "./work-queue-discard-dialog.component";
|
|
9
|
+
import * as i6 from "@angular/common";
|
|
10
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
11
|
+
const _forTrack1 = ($index, $item) => $item.DeliveryID;
|
|
12
|
+
const _forTrack2 = ($index, $item) => $item.Key;
|
|
13
|
+
function WorkQueueDeadLettersComponent_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
+
i0.ɵɵelementStart(0, "option", 5);
|
|
15
|
+
i0.ɵɵtext(1);
|
|
16
|
+
i0.ɵɵelementEnd();
|
|
17
|
+
} if (rf & 2) {
|
|
18
|
+
const s_r1 = ctx.$implicit;
|
|
19
|
+
i0.ɵɵproperty("value", s_r1.Name);
|
|
20
|
+
i0.ɵɵadvance();
|
|
21
|
+
i0.ɵɵtextInterpolate4("", s_r1.Name, " \u2014 ", s_r1.Topic, " (", s_r1.PartitionMode, ", ", s_r1.Transport, ")");
|
|
22
|
+
} }
|
|
23
|
+
function WorkQueueDeadLettersComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
24
|
+
i0.ɵɵelementStart(0, "span", 6);
|
|
25
|
+
i0.ɵɵelement(1, "i", 16);
|
|
26
|
+
i0.ɵɵtext(2);
|
|
27
|
+
i0.ɵɵelementEnd();
|
|
28
|
+
} if (rf & 2) {
|
|
29
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
30
|
+
i0.ɵɵadvance(2);
|
|
31
|
+
i0.ɵɵtextInterpolate1(" Best-effort scan on ", ctx_r1.Current == null ? null : ctx_r1.Current.DriverClass, ": up to 100 dead letters, no paging.");
|
|
32
|
+
} }
|
|
33
|
+
function WorkQueueDeadLettersComponent_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
34
|
+
i0.ɵɵelementStart(0, "div", 18);
|
|
35
|
+
i0.ɵɵelement(1, "i", 19);
|
|
36
|
+
i0.ɵɵelementStart(2, "code");
|
|
37
|
+
i0.ɵɵtext(3);
|
|
38
|
+
i0.ɵɵelementEnd();
|
|
39
|
+
i0.ɵɵtext(4);
|
|
40
|
+
i0.ɵɵelementEnd();
|
|
41
|
+
} if (rf & 2) {
|
|
42
|
+
const o_r3 = ctx.$implicit;
|
|
43
|
+
i0.ɵɵclassProp("wq-outcome-ok", o_r3.Ok)("wq-outcome-error", !o_r3.Ok);
|
|
44
|
+
i0.ɵɵadvance();
|
|
45
|
+
i0.ɵɵclassProp("fa-circle-check", o_r3.Ok)("fa-circle-xmark", !o_r3.Ok);
|
|
46
|
+
i0.ɵɵadvance(2);
|
|
47
|
+
i0.ɵɵtextInterpolate(o_r3.DeliveryID);
|
|
48
|
+
i0.ɵɵadvance();
|
|
49
|
+
i0.ɵɵtextInterpolate1(" ", o_r3.Message, " ");
|
|
50
|
+
} }
|
|
51
|
+
function WorkQueueDeadLettersComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
52
|
+
i0.ɵɵelementStart(0, "div", 7);
|
|
53
|
+
i0.ɵɵrepeaterCreate(1, WorkQueueDeadLettersComponent_Conditional_10_For_2_Template, 5, 10, "div", 17, _forTrack1);
|
|
54
|
+
i0.ɵɵelementEnd();
|
|
55
|
+
} if (rf & 2) {
|
|
56
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
57
|
+
i0.ɵɵadvance();
|
|
58
|
+
i0.ɵɵrepeater(ctx_r1.Outcomes);
|
|
59
|
+
} }
|
|
60
|
+
function WorkQueueDeadLettersComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
+
i0.ɵɵelement(0, "mj-empty-state", 8);
|
|
62
|
+
} }
|
|
63
|
+
function WorkQueueDeadLettersComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
64
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
65
|
+
i0.ɵɵelement(1, "mj-loading", 20);
|
|
66
|
+
i0.ɵɵelementEnd();
|
|
67
|
+
} }
|
|
68
|
+
function WorkQueueDeadLettersComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
69
|
+
i0.ɵɵelement(0, "mj-alert", 10);
|
|
70
|
+
} if (rf & 2) {
|
|
71
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
72
|
+
i0.ɵɵproperty("Message", ctx_r1.LoadError);
|
|
73
|
+
} }
|
|
74
|
+
function WorkQueueDeadLettersComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
75
|
+
i0.ɵɵelement(0, "mj-alert", 11);
|
|
76
|
+
} }
|
|
77
|
+
function WorkQueueDeadLettersComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
78
|
+
i0.ɵɵelement(0, "mj-empty-state", 12);
|
|
79
|
+
} }
|
|
80
|
+
function WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
81
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
82
|
+
i0.ɵɵtext(1, "blocks key");
|
|
83
|
+
i0.ɵɵelementEnd();
|
|
84
|
+
} }
|
|
85
|
+
function WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
+
i0.ɵɵelementStart(0, "dt");
|
|
87
|
+
i0.ɵɵtext(1, "Correlation");
|
|
88
|
+
i0.ɵɵelementEnd();
|
|
89
|
+
i0.ɵɵelementStart(2, "dd");
|
|
90
|
+
i0.ɵɵtext(3);
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
} if (rf & 2) {
|
|
93
|
+
const item_r6 = i0.ɵɵnextContext(2).$implicit;
|
|
94
|
+
i0.ɵɵadvance(3);
|
|
95
|
+
i0.ɵɵtextInterpolate(item_r6.Message.CorrelationID);
|
|
96
|
+
} }
|
|
97
|
+
function WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
98
|
+
i0.ɵɵelementStart(0, "dt");
|
|
99
|
+
i0.ɵɵtext(1, "Last error");
|
|
100
|
+
i0.ɵɵelementEnd();
|
|
101
|
+
i0.ɵɵelementStart(2, "dd")(3, "pre", 35);
|
|
102
|
+
i0.ɵɵtext(4);
|
|
103
|
+
i0.ɵɵelementEnd()();
|
|
104
|
+
} if (rf & 2) {
|
|
105
|
+
const item_r6 = i0.ɵɵnextContext(2).$implicit;
|
|
106
|
+
i0.ɵɵadvance(4);
|
|
107
|
+
i0.ɵɵtextInterpolate(item_r6.LastError);
|
|
108
|
+
} }
|
|
109
|
+
function WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
110
|
+
i0.ɵɵelementStart(0, "p", 33);
|
|
111
|
+
i0.ɵɵtext(1, "none");
|
|
112
|
+
i0.ɵɵelementEnd();
|
|
113
|
+
} }
|
|
114
|
+
function WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_26_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
115
|
+
i0.ɵɵelementStart(0, "dt");
|
|
116
|
+
i0.ɵɵtext(1);
|
|
117
|
+
i0.ɵɵelementEnd();
|
|
118
|
+
i0.ɵɵelementStart(2, "dd");
|
|
119
|
+
i0.ɵɵtext(3);
|
|
120
|
+
i0.ɵɵelementEnd();
|
|
121
|
+
} if (rf & 2) {
|
|
122
|
+
const a_r7 = ctx.$implicit;
|
|
123
|
+
i0.ɵɵadvance();
|
|
124
|
+
i0.ɵɵtextInterpolate(a_r7.Key);
|
|
125
|
+
i0.ɵɵadvance(2);
|
|
126
|
+
i0.ɵɵtextInterpolate(a_r7.Value);
|
|
127
|
+
} }
|
|
128
|
+
function WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
129
|
+
i0.ɵɵelementStart(0, "dl");
|
|
130
|
+
i0.ɵɵrepeaterCreate(1, WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_26_For_2_Template, 4, 2, null, null, _forTrack2);
|
|
131
|
+
i0.ɵɵelementEnd();
|
|
132
|
+
} if (rf & 2) {
|
|
133
|
+
const item_r6 = i0.ɵɵnextContext(2).$implicit;
|
|
134
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
135
|
+
i0.ɵɵadvance();
|
|
136
|
+
i0.ɵɵrepeater(ctx_r1.AttributeEntries(item_r6));
|
|
137
|
+
} }
|
|
138
|
+
function WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
139
|
+
i0.ɵɵelementStart(0, "tr", 29)(1, "td", 30)(2, "div", 31)(3, "div", 32)(4, "h4");
|
|
140
|
+
i0.ɵɵtext(5, "Delivery");
|
|
141
|
+
i0.ɵɵelementEnd();
|
|
142
|
+
i0.ɵɵelementStart(6, "dl")(7, "dt");
|
|
143
|
+
i0.ɵɵtext(8, "Delivery ID");
|
|
144
|
+
i0.ɵɵelementEnd();
|
|
145
|
+
i0.ɵɵelementStart(9, "dd")(10, "code");
|
|
146
|
+
i0.ɵɵtext(11);
|
|
147
|
+
i0.ɵɵelementEnd()();
|
|
148
|
+
i0.ɵɵelementStart(12, "dt");
|
|
149
|
+
i0.ɵɵtext(13, "Topic");
|
|
150
|
+
i0.ɵɵelementEnd();
|
|
151
|
+
i0.ɵɵelementStart(14, "dd");
|
|
152
|
+
i0.ɵɵtext(15);
|
|
153
|
+
i0.ɵɵelementEnd();
|
|
154
|
+
i0.ɵɵelementStart(16, "dt");
|
|
155
|
+
i0.ɵɵtext(17, "Published");
|
|
156
|
+
i0.ɵɵelementEnd();
|
|
157
|
+
i0.ɵɵelementStart(18, "dd");
|
|
158
|
+
i0.ɵɵtext(19);
|
|
159
|
+
i0.ɵɵpipe(20, "date");
|
|
160
|
+
i0.ɵɵelementEnd();
|
|
161
|
+
i0.ɵɵconditionalCreate(21, WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_21_Template, 4, 1);
|
|
162
|
+
i0.ɵɵconditionalCreate(22, WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_22_Template, 5, 1);
|
|
163
|
+
i0.ɵɵelementEnd();
|
|
164
|
+
i0.ɵɵelementStart(23, "h4");
|
|
165
|
+
i0.ɵɵtext(24, "Attributes");
|
|
166
|
+
i0.ɵɵelementEnd();
|
|
167
|
+
i0.ɵɵconditionalCreate(25, WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_25_Template, 2, 0, "p", 33)(26, WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Conditional_26_Template, 3, 0, "dl");
|
|
168
|
+
i0.ɵɵelementEnd();
|
|
169
|
+
i0.ɵɵelementStart(27, "div", 32)(28, "h4");
|
|
170
|
+
i0.ɵɵtext(29, "Payload");
|
|
171
|
+
i0.ɵɵelementEnd();
|
|
172
|
+
i0.ɵɵelementStart(30, "pre", 34);
|
|
173
|
+
i0.ɵɵtext(31);
|
|
174
|
+
i0.ɵɵelementEnd()()()()();
|
|
175
|
+
} if (rf & 2) {
|
|
176
|
+
const item_r6 = i0.ɵɵnextContext().$implicit;
|
|
177
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
178
|
+
i0.ɵɵadvance(11);
|
|
179
|
+
i0.ɵɵtextInterpolate(item_r6.DeliveryID);
|
|
180
|
+
i0.ɵɵadvance(4);
|
|
181
|
+
i0.ɵɵtextInterpolate(item_r6.Message.Topic);
|
|
182
|
+
i0.ɵɵadvance(4);
|
|
183
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(20, 7, item_r6.Message.PublishedAt, "medium"));
|
|
184
|
+
i0.ɵɵadvance(2);
|
|
185
|
+
i0.ɵɵconditional(item_r6.Message.CorrelationID ? 21 : -1);
|
|
186
|
+
i0.ɵɵadvance();
|
|
187
|
+
i0.ɵɵconditional(item_r6.LastError ? 22 : -1);
|
|
188
|
+
i0.ɵɵadvance(3);
|
|
189
|
+
i0.ɵɵconditional(ctx_r1.AttributeEntries(item_r6).length === 0 ? 25 : 26);
|
|
190
|
+
i0.ɵɵadvance(6);
|
|
191
|
+
i0.ɵɵtextInterpolate(ctx_r1.PrettyPayload(item_r6));
|
|
192
|
+
} }
|
|
193
|
+
function WorkQueueDeadLettersComponent_Conditional_16_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
194
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
195
|
+
i0.ɵɵelementStart(0, "tr", 24);
|
|
196
|
+
i0.ɵɵlistener("click", function WorkQueueDeadLettersComponent_Conditional_16_For_18_Template_tr_click_0_listener() { const item_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleExpanded(item_r6.DeliveryID)); });
|
|
197
|
+
i0.ɵɵelementStart(1, "td", 21)(2, "input", 25);
|
|
198
|
+
i0.ɵɵlistener("click", function WorkQueueDeadLettersComponent_Conditional_16_For_18_Template_input_click_2_listener($event) { const item_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleSelected(item_r6.DeliveryID, $event)); });
|
|
199
|
+
i0.ɵɵelementEnd()();
|
|
200
|
+
i0.ɵɵelementStart(3, "td")(4, "span", 26);
|
|
201
|
+
i0.ɵɵtext(5);
|
|
202
|
+
i0.ɵɵelementEnd();
|
|
203
|
+
i0.ɵɵconditionalCreate(6, WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_6_Template, 2, 0, "span", 27);
|
|
204
|
+
i0.ɵɵelementEnd();
|
|
205
|
+
i0.ɵɵelementStart(7, "td")(8, "code", 28);
|
|
206
|
+
i0.ɵɵtext(9);
|
|
207
|
+
i0.ɵɵelementEnd()();
|
|
208
|
+
i0.ɵɵelementStart(10, "td");
|
|
209
|
+
i0.ɵɵtext(11);
|
|
210
|
+
i0.ɵɵelementEnd();
|
|
211
|
+
i0.ɵɵelementStart(12, "td", 23);
|
|
212
|
+
i0.ɵɵtext(13);
|
|
213
|
+
i0.ɵɵelementEnd();
|
|
214
|
+
i0.ɵɵelementStart(14, "td");
|
|
215
|
+
i0.ɵɵtext(15);
|
|
216
|
+
i0.ɵɵpipe(16, "date");
|
|
217
|
+
i0.ɵɵelementEnd();
|
|
218
|
+
i0.ɵɵelementStart(17, "td", 23);
|
|
219
|
+
i0.ɵɵelement(18, "i", 19);
|
|
220
|
+
i0.ɵɵelementEnd()();
|
|
221
|
+
i0.ɵɵconditionalCreate(19, WorkQueueDeadLettersComponent_Conditional_16_For_18_Conditional_19_Template, 32, 10, "tr", 29);
|
|
222
|
+
} if (rf & 2) {
|
|
223
|
+
const item_r6 = ctx.$implicit;
|
|
224
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
225
|
+
i0.ɵɵadvance(2);
|
|
226
|
+
i0.ɵɵproperty("checked", ctx_r1.Selected.has(item_r6.DeliveryID));
|
|
227
|
+
i0.ɵɵadvance(3);
|
|
228
|
+
i0.ɵɵtextInterpolate(item_r6.Reason);
|
|
229
|
+
i0.ɵɵadvance();
|
|
230
|
+
i0.ɵɵconditional(item_r6.BlocksKey ? 6 : -1);
|
|
231
|
+
i0.ɵɵadvance(3);
|
|
232
|
+
i0.ɵɵtextInterpolate(item_r6.Message.MessageID);
|
|
233
|
+
i0.ɵɵadvance(2);
|
|
234
|
+
i0.ɵɵtextInterpolate(item_r6.PartitionKey ?? "\u2014");
|
|
235
|
+
i0.ɵɵadvance(2);
|
|
236
|
+
i0.ɵɵtextInterpolate(item_r6.Attempts);
|
|
237
|
+
i0.ɵɵadvance(2);
|
|
238
|
+
i0.ɵɵtextInterpolate(item_r6.DeadLetteredAt ? i0.ɵɵpipeBind2(16, 12, item_r6.DeadLetteredAt, "medium") : "\u2014");
|
|
239
|
+
i0.ɵɵadvance(3);
|
|
240
|
+
i0.ɵɵclassProp("fa-chevron-down", ctx_r1.ExpandedID !== item_r6.DeliveryID)("fa-chevron-up", ctx_r1.ExpandedID === item_r6.DeliveryID);
|
|
241
|
+
i0.ɵɵadvance();
|
|
242
|
+
i0.ɵɵconditional(ctx_r1.ExpandedID === item_r6.DeliveryID ? 19 : -1);
|
|
243
|
+
} }
|
|
244
|
+
function WorkQueueDeadLettersComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
245
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
246
|
+
i0.ɵɵelementStart(0, "table", 13)(1, "thead")(2, "tr")(3, "th", 21)(4, "input", 22);
|
|
247
|
+
i0.ɵɵlistener("change", function WorkQueueDeadLettersComponent_Conditional_16_Template_input_change_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleAll()); });
|
|
248
|
+
i0.ɵɵelementEnd()();
|
|
249
|
+
i0.ɵɵelementStart(5, "th");
|
|
250
|
+
i0.ɵɵtext(6, "Reason");
|
|
251
|
+
i0.ɵɵelementEnd();
|
|
252
|
+
i0.ɵɵelementStart(7, "th");
|
|
253
|
+
i0.ɵɵtext(8, "Message");
|
|
254
|
+
i0.ɵɵelementEnd();
|
|
255
|
+
i0.ɵɵelementStart(9, "th");
|
|
256
|
+
i0.ɵɵtext(10, "Key");
|
|
257
|
+
i0.ɵɵelementEnd();
|
|
258
|
+
i0.ɵɵelementStart(11, "th", 23);
|
|
259
|
+
i0.ɵɵtext(12, "Attempts");
|
|
260
|
+
i0.ɵɵelementEnd();
|
|
261
|
+
i0.ɵɵelementStart(13, "th");
|
|
262
|
+
i0.ɵɵtext(14, "Dead-lettered");
|
|
263
|
+
i0.ɵɵelementEnd();
|
|
264
|
+
i0.ɵɵelement(15, "th");
|
|
265
|
+
i0.ɵɵelementEnd()();
|
|
266
|
+
i0.ɵɵelementStart(16, "tbody");
|
|
267
|
+
i0.ɵɵrepeaterCreate(17, WorkQueueDeadLettersComponent_Conditional_16_For_18_Template, 20, 15, null, null, _forTrack1);
|
|
268
|
+
i0.ɵɵelementEnd()();
|
|
269
|
+
} if (rf & 2) {
|
|
270
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
271
|
+
i0.ɵɵadvance(4);
|
|
272
|
+
i0.ɵɵproperty("checked", ctx_r1.AllSelected);
|
|
273
|
+
i0.ɵɵadvance(13);
|
|
274
|
+
i0.ɵɵrepeater(ctx_r1.Items);
|
|
275
|
+
} }
|
|
276
|
+
/**
|
|
277
|
+
* Dead-letter browser for one subscription: list (best-effort scan on cloud transports), envelope viewer, and the
|
|
278
|
+
* replay / discard actions, which loop the single-item operations client-side and report per-item results.
|
|
279
|
+
*/
|
|
280
|
+
export class WorkQueueDeadLettersComponent {
|
|
281
|
+
operator;
|
|
282
|
+
cdr;
|
|
283
|
+
Provider;
|
|
284
|
+
Subscriptions = [];
|
|
285
|
+
SelectedSubscription = null;
|
|
286
|
+
/** Update on MJ: Work Queue Subscriptions — replay and discard are disabled without it. */
|
|
287
|
+
CanOperate = false;
|
|
288
|
+
SelectedSubscriptionChange = new EventEmitter();
|
|
289
|
+
/** Emitted after a replay or discard changed something, so the dashboard refreshes stats. */
|
|
290
|
+
Changed = new EventEmitter();
|
|
291
|
+
Loaded = new EventEmitter();
|
|
292
|
+
Items = [];
|
|
293
|
+
Supported = true;
|
|
294
|
+
IsLoading = false;
|
|
295
|
+
LoadError = null;
|
|
296
|
+
ExpandedID = null;
|
|
297
|
+
Selected = new Set();
|
|
298
|
+
ConfirmReplayVisible = false;
|
|
299
|
+
DiscardVisible = false;
|
|
300
|
+
ActionInProgress = false;
|
|
301
|
+
Outcomes = [];
|
|
302
|
+
constructor(operator, cdr) {
|
|
303
|
+
this.operator = operator;
|
|
304
|
+
this.cdr = cdr;
|
|
305
|
+
}
|
|
306
|
+
ngOnChanges(changes) {
|
|
307
|
+
if (changes['SelectedSubscription'] || changes['Provider']) {
|
|
308
|
+
void this.Refresh();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
get Current() {
|
|
312
|
+
return this.Subscriptions.find((s) => s.Name === this.SelectedSubscription);
|
|
313
|
+
}
|
|
314
|
+
get IsBestEffort() {
|
|
315
|
+
return this.Current !== undefined && this.Current.DriverClass !== 'Database';
|
|
316
|
+
}
|
|
317
|
+
get SelectedCount() {
|
|
318
|
+
return this.Selected.size;
|
|
319
|
+
}
|
|
320
|
+
get AllSelected() {
|
|
321
|
+
return this.Items.length > 0 && this.Items.every((i) => this.Selected.has(i.DeliveryID));
|
|
322
|
+
}
|
|
323
|
+
OnSubscriptionChange(name) {
|
|
324
|
+
this.SelectedSubscriptionChange.emit(name === '' ? null : name);
|
|
325
|
+
}
|
|
326
|
+
async Refresh() {
|
|
327
|
+
this.Selected.clear();
|
|
328
|
+
this.Outcomes = [];
|
|
329
|
+
if (!this.SelectedSubscription || !this.Provider) {
|
|
330
|
+
this.Items = [];
|
|
331
|
+
this.emitLoaded();
|
|
332
|
+
this.cdr.markForCheck();
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
this.IsLoading = true;
|
|
336
|
+
this.LoadError = null;
|
|
337
|
+
this.cdr.markForCheck();
|
|
338
|
+
try {
|
|
339
|
+
const output = await this.operator.ListDeadLetters(this.Provider, this.SelectedSubscription);
|
|
340
|
+
this.Supported = output.supported;
|
|
341
|
+
this.Items = output.items;
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
this.Items = [];
|
|
345
|
+
this.LoadError = error instanceof Error ? error.message : String(error);
|
|
346
|
+
}
|
|
347
|
+
finally {
|
|
348
|
+
this.IsLoading = false;
|
|
349
|
+
this.emitLoaded();
|
|
350
|
+
this.cdr.markForCheck();
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
ToggleExpanded(id) {
|
|
354
|
+
this.ExpandedID = this.ExpandedID === id ? null : id;
|
|
355
|
+
}
|
|
356
|
+
ToggleSelected(id, event) {
|
|
357
|
+
event.stopPropagation();
|
|
358
|
+
if (this.Selected.has(id))
|
|
359
|
+
this.Selected.delete(id);
|
|
360
|
+
else
|
|
361
|
+
this.Selected.add(id);
|
|
362
|
+
this.emitLoaded();
|
|
363
|
+
}
|
|
364
|
+
ToggleAll() {
|
|
365
|
+
if (this.AllSelected)
|
|
366
|
+
this.Selected.clear();
|
|
367
|
+
else
|
|
368
|
+
this.Items.forEach((i) => this.Selected.add(i.DeliveryID));
|
|
369
|
+
this.emitLoaded();
|
|
370
|
+
}
|
|
371
|
+
Age(seconds) {
|
|
372
|
+
return FormatAge(seconds);
|
|
373
|
+
}
|
|
374
|
+
PrettyPayload(item) {
|
|
375
|
+
const json = item.Message.PayloadJSON;
|
|
376
|
+
if (json === null) {
|
|
377
|
+
return item.Message.PayloadRef ? `PayloadRef: ${JSON.stringify(item.Message.PayloadRef)}` : '(no payload)';
|
|
378
|
+
}
|
|
379
|
+
try {
|
|
380
|
+
return JSON.stringify(JSON.parse(json), null, 2);
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
return json;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
AttributeEntries(item) {
|
|
387
|
+
return Object.entries(item.Message.Attributes).map(([Key, Value]) => ({ Key, Value }));
|
|
388
|
+
}
|
|
389
|
+
/** How many waiting items a discard of the selected blocking heads would release, for the confirmation text. */
|
|
390
|
+
get DiscardMessage() {
|
|
391
|
+
const blocking = this.Items.filter((i) => this.Selected.has(i.DeliveryID) && i.BlocksKey).length;
|
|
392
|
+
const base = `${this.SelectedCount} dead letter${this.SelectedCount === 1 ? '' : 's'} will be discarded permanently.`;
|
|
393
|
+
return blocking > 0 ? `${base} ${blocking} of them block${blocking === 1 ? 's' : ''} an Ordered key; discarding releases the items waiting behind ${blocking === 1 ? 'it' : 'them'}.` : base;
|
|
394
|
+
}
|
|
395
|
+
RequestReplay() {
|
|
396
|
+
if (this.SelectedCount > 0 && this.CanOperate)
|
|
397
|
+
this.ConfirmReplayVisible = true;
|
|
398
|
+
}
|
|
399
|
+
RequestDiscard() {
|
|
400
|
+
if (this.SelectedCount > 0 && this.CanOperate)
|
|
401
|
+
this.DiscardVisible = true;
|
|
402
|
+
}
|
|
403
|
+
async ReplaySelected() {
|
|
404
|
+
this.ConfirmReplayVisible = false;
|
|
405
|
+
await this.runForSelected('replay', (id) => this.operator.Replay(this.Provider, this.SelectedSubscription ?? '', id, 'Replayed from the Work Queue dashboard')
|
|
406
|
+
.then((r) => (r.supported ? (r.replayed ? 'replayed' : 'not replayed (already resolved?)') : 'not supported on this transport')));
|
|
407
|
+
}
|
|
408
|
+
async DiscardSelected(reason) {
|
|
409
|
+
await this.runForSelected('discard', (id) => this.operator.Discard(this.Provider, this.SelectedSubscription ?? '', id, reason)
|
|
410
|
+
.then((r) => (r.supported ? (r.discarded ? 'discarded' : 'not discarded (already resolved?)') : 'not supported on this transport')));
|
|
411
|
+
this.DiscardVisible = false;
|
|
412
|
+
this.cdr.markForCheck();
|
|
413
|
+
}
|
|
414
|
+
async runForSelected(verb, action) {
|
|
415
|
+
this.ActionInProgress = true;
|
|
416
|
+
this.cdr.markForCheck();
|
|
417
|
+
const outcomes = [];
|
|
418
|
+
for (const id of [...this.Selected]) {
|
|
419
|
+
try {
|
|
420
|
+
outcomes.push({ DeliveryID: id, Ok: true, Message: await action(id) });
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
outcomes.push({ DeliveryID: id, Ok: false, Message: `${verb} failed: ${error instanceof Error ? error.message : String(error)}` });
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
this.ActionInProgress = false;
|
|
427
|
+
await this.Refresh();
|
|
428
|
+
this.Outcomes = outcomes;
|
|
429
|
+
if (outcomes.some((o) => o.Ok)) {
|
|
430
|
+
this.Changed.emit();
|
|
431
|
+
}
|
|
432
|
+
this.cdr.markForCheck();
|
|
433
|
+
}
|
|
434
|
+
emitLoaded() {
|
|
435
|
+
this.Loaded.emit({ Count: this.Items.length, Selected: this.Selected.size });
|
|
436
|
+
}
|
|
437
|
+
static ɵfac = function WorkQueueDeadLettersComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || WorkQueueDeadLettersComponent)(i0.ɵɵdirectiveInject(i1.WorkQueueOperatorService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
438
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WorkQueueDeadLettersComponent, selectors: [["mj-work-queue-dead-letters"]], inputs: { Provider: "Provider", Subscriptions: "Subscriptions", SelectedSubscription: "SelectedSubscription", CanOperate: "CanOperate" }, outputs: { SelectedSubscriptionChange: "SelectedSubscriptionChange", Changed: "Changed", Loaded: "Loaded" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 19, vars: 9, consts: [[1, "wq-panel"], [1, "wq-picker-row"], ["for", "wq-dl-subscription", 1, "wq-label"], ["id", "wq-dl-subscription", 1, "wq-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], [1, "wq-hint"], [1, "wq-outcomes"], ["Icon", "fa-solid fa-envelope-open-text", "Title", "Pick a subscription", "Message", "Dead letters are listed per subscription."], [1, "wq-loading"], ["Variant", "error", "Title", "Could not list dead letters", 3, "Message"], ["Variant", "info", "Title", "Not supported", "Message", "This transport does not expose its dead letters to MemberJunction."], ["Variant", "empty", "Icon", "fa-solid fa-circle-check", "Title", "No dead letters", "Message", "Every delivery on this subscription completed, is pending, or is in flight."], [1, "wq-table"], ["Title", "Replay dead letters", "Type", "warning", "ConfirmText", "Replay", "Icon", "fa-solid fa-rotate-left", "DetailMessage", "A replayed delivery keeps its message and runs as a fresh attempt; an Ordered head resumes its key in order.", 3, "Confirmed", "Cancelled", "Visible", "Message"], ["Title", "Discard dead letters", 3, "VisibleChange", "Confirmed", "Visible", "Message", "Busy"], [1, "fa-solid", "fa-circle-info"], [1, "wq-outcome", 3, "wq-outcome-ok", "wq-outcome-error"], [1, "wq-outcome"], [1, "fa-solid"], ["text", "Scanning dead letters...", "size", "medium"], [1, "wq-check"], ["type", "checkbox", "title", "Select all", 3, "change", "checked"], [1, "wq-num"], [1, "wq-row", 3, "click"], ["type", "checkbox", 3, "click", "checked"], [1, "wq-reason"], [1, "wq-chip", "wq-chip-warning"], [1, "wq-id"], [1, "wq-detail-row"], ["colspan", "7"], [1, "wq-detail"], [1, "wq-detail-col"], [1, "wq-muted"], [1, "wq-pre"], [1, "wq-pre", "wq-pre-error"]], template: function WorkQueueDeadLettersComponent_Template(rf, ctx) { if (rf & 1) {
|
|
439
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "label", 2);
|
|
440
|
+
i0.ɵɵtext(3, "Subscription");
|
|
441
|
+
i0.ɵɵelementEnd();
|
|
442
|
+
i0.ɵɵelementStart(4, "select", 3);
|
|
443
|
+
i0.ɵɵlistener("ngModelChange", function WorkQueueDeadLettersComponent_Template_select_ngModelChange_4_listener($event) { return ctx.OnSubscriptionChange($event); });
|
|
444
|
+
i0.ɵɵelementStart(5, "option", 4);
|
|
445
|
+
i0.ɵɵtext(6, "Choose a subscription\u2026");
|
|
446
|
+
i0.ɵɵelementEnd();
|
|
447
|
+
i0.ɵɵrepeaterCreate(7, WorkQueueDeadLettersComponent_For_8_Template, 2, 5, "option", 5, _forTrack0);
|
|
448
|
+
i0.ɵɵelementEnd();
|
|
449
|
+
i0.ɵɵconditionalCreate(9, WorkQueueDeadLettersComponent_Conditional_9_Template, 3, 1, "span", 6);
|
|
450
|
+
i0.ɵɵelementEnd();
|
|
451
|
+
i0.ɵɵconditionalCreate(10, WorkQueueDeadLettersComponent_Conditional_10_Template, 3, 0, "div", 7);
|
|
452
|
+
i0.ɵɵconditionalCreate(11, WorkQueueDeadLettersComponent_Conditional_11_Template, 1, 0, "mj-empty-state", 8)(12, WorkQueueDeadLettersComponent_Conditional_12_Template, 2, 0, "div", 9)(13, WorkQueueDeadLettersComponent_Conditional_13_Template, 1, 1, "mj-alert", 10)(14, WorkQueueDeadLettersComponent_Conditional_14_Template, 1, 0, "mj-alert", 11)(15, WorkQueueDeadLettersComponent_Conditional_15_Template, 1, 0, "mj-empty-state", 12)(16, WorkQueueDeadLettersComponent_Conditional_16_Template, 19, 1, "table", 13);
|
|
453
|
+
i0.ɵɵelementEnd();
|
|
454
|
+
i0.ɵɵelementStart(17, "mj-confirm-dialog", 14);
|
|
455
|
+
i0.ɵɵlistener("Confirmed", function WorkQueueDeadLettersComponent_Template_mj_confirm_dialog_Confirmed_17_listener() { return ctx.ReplaySelected(); })("Cancelled", function WorkQueueDeadLettersComponent_Template_mj_confirm_dialog_Cancelled_17_listener() { return ctx.ConfirmReplayVisible = false; });
|
|
456
|
+
i0.ɵɵelementEnd();
|
|
457
|
+
i0.ɵɵelementStart(18, "mj-work-queue-discard-dialog", 15);
|
|
458
|
+
i0.ɵɵlistener("VisibleChange", function WorkQueueDeadLettersComponent_Template_mj_work_queue_discard_dialog_VisibleChange_18_listener($event) { return ctx.DiscardVisible = $event; })("Confirmed", function WorkQueueDeadLettersComponent_Template_mj_work_queue_discard_dialog_Confirmed_18_listener($event) { return ctx.DiscardSelected($event); });
|
|
459
|
+
i0.ɵɵelementEnd();
|
|
460
|
+
} if (rf & 2) {
|
|
461
|
+
i0.ɵɵadvance(4);
|
|
462
|
+
i0.ɵɵproperty("ngModel", ctx.SelectedSubscription ?? "");
|
|
463
|
+
i0.ɵɵadvance(3);
|
|
464
|
+
i0.ɵɵrepeater(ctx.Subscriptions);
|
|
465
|
+
i0.ɵɵadvance(2);
|
|
466
|
+
i0.ɵɵconditional(ctx.IsBestEffort && ctx.Supported ? 9 : -1);
|
|
467
|
+
i0.ɵɵadvance();
|
|
468
|
+
i0.ɵɵconditional(ctx.Outcomes.length > 0 ? 10 : -1);
|
|
469
|
+
i0.ɵɵadvance();
|
|
470
|
+
i0.ɵɵconditional(!ctx.SelectedSubscription ? 11 : ctx.IsLoading ? 12 : ctx.LoadError ? 13 : !ctx.Supported ? 14 : ctx.Items.length === 0 ? 15 : 16);
|
|
471
|
+
i0.ɵɵadvance(6);
|
|
472
|
+
i0.ɵɵproperty("Visible", ctx.ConfirmReplayVisible)("Message", ctx.SelectedCount + " dead letter" + (ctx.SelectedCount === 1 ? "" : "s") + " will be queued again on this subscription.");
|
|
473
|
+
i0.ɵɵadvance();
|
|
474
|
+
i0.ɵɵproperty("Visible", ctx.DiscardVisible)("Message", ctx.DiscardMessage)("Busy", ctx.ActionInProgress);
|
|
475
|
+
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJAlertComponent, i3.MJConfirmDialogComponent, i3.MJEmptyStateComponent, i4.LoadingComponent, i5.WorkQueueDiscardDialogComponent, i6.DatePipe], styles: [".wq-panel[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.wq-picker-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.wq-label[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n}\n\n.wq-select[_ngcontent-%COMP%] {\n min-width: 320px;\n padding: 8px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font: inherit;\n}\n\n.wq-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n}\n\n.wq-hint[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.wq-loading[_ngcontent-%COMP%] {\n padding: 40px 0;\n}\n\n.wq-outcomes[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8rem;\n}\n\n.wq-outcome[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.wq-outcome-ok[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.wq-outcome-error[_ngcontent-%COMP%] {\n color: var(--mj-status-error-text);\n}\n\n.wq-outcome-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.wq-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.wq-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 8px 12px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.wq-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n\n.wq-check[_ngcontent-%COMP%] {\n width: 32px;\n}\n\n.wq-num[_ngcontent-%COMP%] {\n text-align: right;\n white-space: nowrap;\n}\n\n.wq-row[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.wq-row[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n}\n\n.wq-reason[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.wq-id[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-secondary);\n}\n\n.wq-chip[_ngcontent-%COMP%] {\n display: inline-block;\n margin-left: 6px;\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.wq-chip-warning[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 14%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.wq-detail-row[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n}\n\n.wq-detail[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(280px, 1fr) minmax(280px, 2fr);\n gap: 16px;\n}\n\n.wq-detail[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] {\n margin: 0 0 6px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-secondary);\n}\n\n.wq-detail[_ngcontent-%COMP%] dl[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: 4px 12px;\n margin: 0 0 12px;\n font-size: 0.8rem;\n}\n\n.wq-detail[_ngcontent-%COMP%] dt[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.wq-detail[_ngcontent-%COMP%] dd[_ngcontent-%COMP%] {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.wq-pre[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px;\n max-height: 320px;\n overflow: auto;\n border-radius: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n font-size: 0.75rem;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.wq-pre-error[_ngcontent-%COMP%] {\n color: var(--mj-status-error-text);\n}\n\n.wq-muted[_ngcontent-%COMP%] {\n margin: 0 0 12px;\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n}\n\n@media (max-width: 800px) {\n .wq-detail[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .wq-select[_ngcontent-%COMP%] {\n min-width: 0;\n width: 100%;\n }\n}"], changeDetection: 0 });
|
|
476
|
+
}
|
|
477
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WorkQueueDeadLettersComponent, [{
|
|
478
|
+
type: Component,
|
|
479
|
+
args: [{ standalone: false, selector: 'mj-work-queue-dead-letters', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"wq-panel\">\n <div class=\"wq-picker-row\">\n <label class=\"wq-label\" for=\"wq-dl-subscription\">Subscription</label>\n <select id=\"wq-dl-subscription\" class=\"wq-select\" [ngModel]=\"SelectedSubscription ?? ''\" (ngModelChange)=\"OnSubscriptionChange($event)\">\n <option value=\"\">Choose a subscription\u2026</option>\n @for (s of Subscriptions; track s.ID) {\n <option [value]=\"s.Name\">{{ s.Name }} \u2014 {{ s.Topic }} ({{ s.PartitionMode }}, {{ s.Transport }})</option>\n }\n </select>\n @if (IsBestEffort && Supported) {\n <span class=\"wq-hint\"><i class=\"fa-solid fa-circle-info\"></i> Best-effort scan on {{ Current?.DriverClass }}: up to 100 dead letters, no paging.</span>\n }\n </div>\n\n @if (Outcomes.length > 0) {\n <div class=\"wq-outcomes\">\n @for (o of Outcomes; track o.DeliveryID) {\n <div class=\"wq-outcome\" [class.wq-outcome-ok]=\"o.Ok\" [class.wq-outcome-error]=\"!o.Ok\">\n <i class=\"fa-solid\" [class.fa-circle-check]=\"o.Ok\" [class.fa-circle-xmark]=\"!o.Ok\"></i>\n <code>{{ o.DeliveryID }}</code> {{ o.Message }}\n </div>\n }\n </div>\n }\n\n @if (!SelectedSubscription) {\n <mj-empty-state Icon=\"fa-solid fa-envelope-open-text\" Title=\"Pick a subscription\" Message=\"Dead letters are listed per subscription.\" />\n } @else if (IsLoading) {\n <div class=\"wq-loading\"><mj-loading text=\"Scanning dead letters...\" size=\"medium\"></mj-loading></div>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\" Title=\"Could not list dead letters\" [Message]=\"LoadError\"></mj-alert>\n } @else if (!Supported) {\n <mj-alert Variant=\"info\" Title=\"Not supported\" Message=\"This transport does not expose its dead letters to MemberJunction.\"></mj-alert>\n } @else if (Items.length === 0) {\n <mj-empty-state Variant=\"empty\" Icon=\"fa-solid fa-circle-check\" Title=\"No dead letters\" Message=\"Every delivery on this subscription completed, is pending, or is in flight.\" />\n } @else {\n <table class=\"wq-table\">\n <thead>\n <tr>\n <th class=\"wq-check\"><input type=\"checkbox\" [checked]=\"AllSelected\" (change)=\"ToggleAll()\" title=\"Select all\" /></th>\n <th>Reason</th>\n <th>Message</th>\n <th>Key</th>\n <th class=\"wq-num\">Attempts</th>\n <th>Dead-lettered</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (item of Items; track item.DeliveryID) {\n <tr class=\"wq-row\" (click)=\"ToggleExpanded(item.DeliveryID)\">\n <td class=\"wq-check\"><input type=\"checkbox\" [checked]=\"Selected.has(item.DeliveryID)\" (click)=\"ToggleSelected(item.DeliveryID, $event)\" /></td>\n <td>\n <span class=\"wq-reason\">{{ item.Reason }}</span>\n @if (item.BlocksKey) { <span class=\"wq-chip wq-chip-warning\">blocks key</span> }\n </td>\n <td><code class=\"wq-id\">{{ item.Message.MessageID }}</code></td>\n <td>{{ item.PartitionKey ?? '\u2014' }}</td>\n <td class=\"wq-num\">{{ item.Attempts }}</td>\n <td>{{ item.DeadLetteredAt ? (item.DeadLetteredAt | date:'medium') : '\u2014' }}</td>\n <td class=\"wq-num\"><i class=\"fa-solid\" [class.fa-chevron-down]=\"ExpandedID !== item.DeliveryID\" [class.fa-chevron-up]=\"ExpandedID === item.DeliveryID\"></i></td>\n </tr>\n @if (ExpandedID === item.DeliveryID) {\n <tr class=\"wq-detail-row\">\n <td colspan=\"7\">\n <div class=\"wq-detail\">\n <div class=\"wq-detail-col\">\n <h4>Delivery</h4>\n <dl>\n <dt>Delivery ID</dt><dd><code>{{ item.DeliveryID }}</code></dd>\n <dt>Topic</dt><dd>{{ item.Message.Topic }}</dd>\n <dt>Published</dt><dd>{{ item.Message.PublishedAt | date:'medium' }}</dd>\n @if (item.Message.CorrelationID) { <dt>Correlation</dt><dd>{{ item.Message.CorrelationID }}</dd> }\n @if (item.LastError) { <dt>Last error</dt><dd><pre class=\"wq-pre wq-pre-error\">{{ item.LastError }}</pre></dd> }\n </dl>\n <h4>Attributes</h4>\n @if (AttributeEntries(item).length === 0) { <p class=\"wq-muted\">none</p> } @else {\n <dl>\n @for (a of AttributeEntries(item); track a.Key) { <dt>{{ a.Key }}</dt><dd>{{ a.Value }}</dd> }\n </dl>\n }\n </div>\n <div class=\"wq-detail-col\">\n <h4>Payload</h4>\n <pre class=\"wq-pre\">{{ PrettyPayload(item) }}</pre>\n </div>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n }\n</div>\n\n<mj-confirm-dialog [Visible]=\"ConfirmReplayVisible\" Title=\"Replay dead letters\" Type=\"warning\" ConfirmText=\"Replay\" Icon=\"fa-solid fa-rotate-left\"\n [Message]=\"SelectedCount + ' dead letter' + (SelectedCount === 1 ? '' : 's') + ' will be queued again on this subscription.'\"\n DetailMessage=\"A replayed delivery keeps its message and runs as a fresh attempt; an Ordered head resumes its key in order.\"\n (Confirmed)=\"ReplaySelected()\" (Cancelled)=\"ConfirmReplayVisible = false\"></mj-confirm-dialog>\n\n<mj-work-queue-discard-dialog [Visible]=\"DiscardVisible\" Title=\"Discard dead letters\" [Message]=\"DiscardMessage\" [Busy]=\"ActionInProgress\"\n (VisibleChange)=\"DiscardVisible = $event\" (Confirmed)=\"DiscardSelected($event)\"></mj-work-queue-discard-dialog>\n", styles: [".wq-panel {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.wq-picker-row {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.wq-label {\n font-size: 0.8rem;\n color: var(--mj-text-secondary);\n}\n\n.wq-select {\n min-width: 320px;\n padding: 8px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font: inherit;\n}\n\n.wq-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n}\n\n.wq-hint {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.wq-loading {\n padding: 40px 0;\n}\n\n.wq-outcomes {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 0.8rem;\n}\n\n.wq-outcome {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.wq-outcome-ok i {\n color: var(--mj-status-success);\n}\n\n.wq-outcome-error {\n color: var(--mj-status-error-text);\n}\n\n.wq-outcome-error i {\n color: var(--mj-status-error);\n}\n\n.wq-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.wq-table th {\n text-align: left;\n padding: 8px 12px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-secondary);\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.wq-table td {\n padding: 10px 12px;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n\n.wq-check {\n width: 32px;\n}\n\n.wq-num {\n text-align: right;\n white-space: nowrap;\n}\n\n.wq-row {\n cursor: pointer;\n}\n\n.wq-row:hover td {\n background: var(--mj-bg-surface-hover);\n}\n\n.wq-reason {\n font-weight: 500;\n}\n\n.wq-id {\n font-size: 0.75rem;\n color: var(--mj-text-secondary);\n}\n\n.wq-chip {\n display: inline-block;\n margin-left: 6px;\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 0.7rem;\n font-weight: 600;\n}\n\n.wq-chip-warning {\n background: color-mix(in srgb, var(--mj-status-warning) 14%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text);\n}\n\n.wq-detail-row td {\n background: var(--mj-bg-surface-sunken);\n}\n\n.wq-detail {\n display: grid;\n grid-template-columns: minmax(280px, 1fr) minmax(280px, 2fr);\n gap: 16px;\n}\n\n.wq-detail h4 {\n margin: 0 0 6px;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-secondary);\n}\n\n.wq-detail dl {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: 4px 12px;\n margin: 0 0 12px;\n font-size: 0.8rem;\n}\n\n.wq-detail dt {\n color: var(--mj-text-muted);\n}\n\n.wq-detail dd {\n margin: 0;\n overflow-wrap: anywhere;\n}\n\n.wq-pre {\n margin: 0;\n padding: 10px;\n max-height: 320px;\n overflow: auto;\n border-radius: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n font-size: 0.75rem;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.wq-pre-error {\n color: var(--mj-status-error-text);\n}\n\n.wq-muted {\n margin: 0 0 12px;\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n}\n\n@media (max-width: 800px) {\n .wq-detail {\n grid-template-columns: 1fr;\n }\n .wq-select {\n min-width: 0;\n width: 100%;\n }\n}\n"] }]
|
|
480
|
+
}], () => [{ type: i1.WorkQueueOperatorService }, { type: i0.ChangeDetectorRef }], { Provider: [{
|
|
481
|
+
type: Input
|
|
482
|
+
}], Subscriptions: [{
|
|
483
|
+
type: Input
|
|
484
|
+
}], SelectedSubscription: [{
|
|
485
|
+
type: Input
|
|
486
|
+
}], CanOperate: [{
|
|
487
|
+
type: Input
|
|
488
|
+
}], SelectedSubscriptionChange: [{
|
|
489
|
+
type: Output
|
|
490
|
+
}], Changed: [{
|
|
491
|
+
type: Output
|
|
492
|
+
}], Loaded: [{
|
|
493
|
+
type: Output
|
|
494
|
+
}] }); })();
|
|
495
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WorkQueueDeadLettersComponent, { className: "WorkQueueDeadLettersComponent", filePath: "src/WorkQueue/components/work-queue-dead-letters.component.ts", lineNumber: 26 }); })();
|
|
496
|
+
//# sourceMappingURL=work-queue-dead-letters.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-queue-dead-letters.component.js","sourceRoot":"","sources":["../../../src/WorkQueue/components/work-queue-dead-letters.component.ts","../../../src/WorkQueue/components/work-queue-dead-letters.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport type { IMetadataProvider } from '@memberjunction/core';\nimport type { WorkQueueDeadLetterRow } from '@memberjunction/core-entities';\nimport { WorkQueueOperatorService } from '../services/work-queue-operator.service';\nimport { FormatAge } from '../work-queue-agent-context';\nimport type { WorkQueueSubscriptionOption } from '../work-queue-types';\n\n/** One per-item outcome of a bulk replay or discard, shown until the next action. */\nexport interface WorkQueueActionOutcome {\n DeliveryID: string;\n Ok: boolean;\n Message: string;\n}\n\n/**\n * Dead-letter browser for one subscription: list (best-effort scan on cloud transports), envelope viewer, and the\n * replay / discard actions, which loop the single-item operations client-side and report per-item results.\n */\n@Component({\n standalone: false,\n selector: 'mj-work-queue-dead-letters',\n templateUrl: './work-queue-dead-letters.component.html',\n styleUrls: ['./work-queue-dead-letters.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkQueueDeadLettersComponent implements OnChanges {\n @Input() Provider!: IMetadataProvider;\n @Input() Subscriptions: WorkQueueSubscriptionOption[] = [];\n @Input() SelectedSubscription: string | null = null;\n /** Update on MJ: Work Queue Subscriptions — replay and discard are disabled without it. */\n @Input() CanOperate = false;\n @Output() SelectedSubscriptionChange = new EventEmitter<string | null>();\n /** Emitted after a replay or discard changed something, so the dashboard refreshes stats. */\n @Output() Changed = new EventEmitter<void>();\n @Output() Loaded = new EventEmitter<{ Count: number; Selected: number }>();\n\n public Items: WorkQueueDeadLetterRow[] = [];\n public Supported = true;\n public IsLoading = false;\n public LoadError: string | null = null;\n public ExpandedID: string | null = null;\n public Selected = new Set<string>();\n public ConfirmReplayVisible = false;\n public DiscardVisible = false;\n public ActionInProgress = false;\n public Outcomes: WorkQueueActionOutcome[] = [];\n\n constructor(private readonly operator: WorkQueueOperatorService, private readonly cdr: ChangeDetectorRef) {}\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['SelectedSubscription'] || changes['Provider']) {\n void this.Refresh();\n }\n }\n\n public get Current(): WorkQueueSubscriptionOption | undefined {\n return this.Subscriptions.find((s) => s.Name === this.SelectedSubscription);\n }\n\n public get IsBestEffort(): boolean {\n return this.Current !== undefined && this.Current.DriverClass !== 'Database';\n }\n\n public get SelectedCount(): number {\n return this.Selected.size;\n }\n\n public get AllSelected(): boolean {\n return this.Items.length > 0 && this.Items.every((i) => this.Selected.has(i.DeliveryID));\n }\n\n public OnSubscriptionChange(name: string): void {\n this.SelectedSubscriptionChange.emit(name === '' ? null : name);\n }\n\n public async Refresh(): Promise<void> {\n this.Selected.clear();\n this.Outcomes = [];\n if (!this.SelectedSubscription || !this.Provider) {\n this.Items = [];\n this.emitLoaded();\n this.cdr.markForCheck();\n return;\n }\n this.IsLoading = true;\n this.LoadError = null;\n this.cdr.markForCheck();\n try {\n const output = await this.operator.ListDeadLetters(this.Provider, this.SelectedSubscription);\n this.Supported = output.supported;\n this.Items = output.items;\n } catch (error) {\n this.Items = [];\n this.LoadError = error instanceof Error ? error.message : String(error);\n } finally {\n this.IsLoading = false;\n this.emitLoaded();\n this.cdr.markForCheck();\n }\n }\n\n public ToggleExpanded(id: string): void {\n this.ExpandedID = this.ExpandedID === id ? null : id;\n }\n\n public ToggleSelected(id: string, event: Event): void {\n event.stopPropagation();\n if (this.Selected.has(id)) this.Selected.delete(id); else this.Selected.add(id);\n this.emitLoaded();\n }\n\n public ToggleAll(): void {\n if (this.AllSelected) this.Selected.clear(); else this.Items.forEach((i) => this.Selected.add(i.DeliveryID));\n this.emitLoaded();\n }\n\n public Age(seconds: number | null | undefined): string {\n return FormatAge(seconds);\n }\n\n public PrettyPayload(item: WorkQueueDeadLetterRow): string {\n const json = item.Message.PayloadJSON;\n if (json === null) {\n return item.Message.PayloadRef ? `PayloadRef: ${JSON.stringify(item.Message.PayloadRef)}` : '(no payload)';\n }\n try {\n return JSON.stringify(JSON.parse(json), null, 2);\n } catch {\n return json;\n }\n }\n\n public AttributeEntries(item: WorkQueueDeadLetterRow): { Key: string; Value: string }[] {\n return Object.entries(item.Message.Attributes).map(([Key, Value]) => ({ Key, Value }));\n }\n\n /** How many waiting items a discard of the selected blocking heads would release, for the confirmation text. */\n public get DiscardMessage(): string {\n const blocking = this.Items.filter((i) => this.Selected.has(i.DeliveryID) && i.BlocksKey).length;\n const base = `${this.SelectedCount} dead letter${this.SelectedCount === 1 ? '' : 's'} will be discarded permanently.`;\n return blocking > 0 ? `${base} ${blocking} of them block${blocking === 1 ? 's' : ''} an Ordered key; discarding releases the items waiting behind ${blocking === 1 ? 'it' : 'them'}.` : base;\n }\n\n public RequestReplay(): void {\n if (this.SelectedCount > 0 && this.CanOperate) this.ConfirmReplayVisible = true;\n }\n\n public RequestDiscard(): void {\n if (this.SelectedCount > 0 && this.CanOperate) this.DiscardVisible = true;\n }\n\n public async ReplaySelected(): Promise<void> {\n this.ConfirmReplayVisible = false;\n await this.runForSelected('replay', (id) => this.operator.Replay(this.Provider, this.SelectedSubscription ?? '', id, 'Replayed from the Work Queue dashboard')\n .then((r) => (r.supported ? (r.replayed ? 'replayed' : 'not replayed (already resolved?)') : 'not supported on this transport')));\n }\n\n public async DiscardSelected(reason: string): Promise<void> {\n await this.runForSelected('discard', (id) => this.operator.Discard(this.Provider, this.SelectedSubscription ?? '', id, reason)\n .then((r) => (r.supported ? (r.discarded ? 'discarded' : 'not discarded (already resolved?)') : 'not supported on this transport')));\n this.DiscardVisible = false;\n this.cdr.markForCheck();\n }\n\n private async runForSelected(verb: string, action: (deliveryID: string) => Promise<string>): Promise<void> {\n this.ActionInProgress = true;\n this.cdr.markForCheck();\n const outcomes: WorkQueueActionOutcome[] = [];\n for (const id of [...this.Selected]) {\n try {\n outcomes.push({ DeliveryID: id, Ok: true, Message: await action(id) });\n } catch (error) {\n outcomes.push({ DeliveryID: id, Ok: false, Message: `${verb} failed: ${error instanceof Error ? error.message : String(error)}` });\n }\n }\n this.ActionInProgress = false;\n await this.Refresh();\n this.Outcomes = outcomes;\n if (outcomes.some((o) => o.Ok)) {\n this.Changed.emit();\n }\n this.cdr.markForCheck();\n }\n\n private emitLoaded(): void {\n this.Loaded.emit({ Count: this.Items.length, Selected: this.Selected.size });\n }\n}\n","<div class=\"wq-panel\">\n <div class=\"wq-picker-row\">\n <label class=\"wq-label\" for=\"wq-dl-subscription\">Subscription</label>\n <select id=\"wq-dl-subscription\" class=\"wq-select\" [ngModel]=\"SelectedSubscription ?? ''\" (ngModelChange)=\"OnSubscriptionChange($event)\">\n <option value=\"\">Choose a subscription…</option>\n @for (s of Subscriptions; track s.ID) {\n <option [value]=\"s.Name\">{{ s.Name }} — {{ s.Topic }} ({{ s.PartitionMode }}, {{ s.Transport }})</option>\n }\n </select>\n @if (IsBestEffort && Supported) {\n <span class=\"wq-hint\"><i class=\"fa-solid fa-circle-info\"></i> Best-effort scan on {{ Current?.DriverClass }}: up to 100 dead letters, no paging.</span>\n }\n </div>\n\n @if (Outcomes.length > 0) {\n <div class=\"wq-outcomes\">\n @for (o of Outcomes; track o.DeliveryID) {\n <div class=\"wq-outcome\" [class.wq-outcome-ok]=\"o.Ok\" [class.wq-outcome-error]=\"!o.Ok\">\n <i class=\"fa-solid\" [class.fa-circle-check]=\"o.Ok\" [class.fa-circle-xmark]=\"!o.Ok\"></i>\n <code>{{ o.DeliveryID }}</code> {{ o.Message }}\n </div>\n }\n </div>\n }\n\n @if (!SelectedSubscription) {\n <mj-empty-state Icon=\"fa-solid fa-envelope-open-text\" Title=\"Pick a subscription\" Message=\"Dead letters are listed per subscription.\" />\n } @else if (IsLoading) {\n <div class=\"wq-loading\"><mj-loading text=\"Scanning dead letters...\" size=\"medium\"></mj-loading></div>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\" Title=\"Could not list dead letters\" [Message]=\"LoadError\"></mj-alert>\n } @else if (!Supported) {\n <mj-alert Variant=\"info\" Title=\"Not supported\" Message=\"This transport does not expose its dead letters to MemberJunction.\"></mj-alert>\n } @else if (Items.length === 0) {\n <mj-empty-state Variant=\"empty\" Icon=\"fa-solid fa-circle-check\" Title=\"No dead letters\" Message=\"Every delivery on this subscription completed, is pending, or is in flight.\" />\n } @else {\n <table class=\"wq-table\">\n <thead>\n <tr>\n <th class=\"wq-check\"><input type=\"checkbox\" [checked]=\"AllSelected\" (change)=\"ToggleAll()\" title=\"Select all\" /></th>\n <th>Reason</th>\n <th>Message</th>\n <th>Key</th>\n <th class=\"wq-num\">Attempts</th>\n <th>Dead-lettered</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (item of Items; track item.DeliveryID) {\n <tr class=\"wq-row\" (click)=\"ToggleExpanded(item.DeliveryID)\">\n <td class=\"wq-check\"><input type=\"checkbox\" [checked]=\"Selected.has(item.DeliveryID)\" (click)=\"ToggleSelected(item.DeliveryID, $event)\" /></td>\n <td>\n <span class=\"wq-reason\">{{ item.Reason }}</span>\n @if (item.BlocksKey) { <span class=\"wq-chip wq-chip-warning\">blocks key</span> }\n </td>\n <td><code class=\"wq-id\">{{ item.Message.MessageID }}</code></td>\n <td>{{ item.PartitionKey ?? '—' }}</td>\n <td class=\"wq-num\">{{ item.Attempts }}</td>\n <td>{{ item.DeadLetteredAt ? (item.DeadLetteredAt | date:'medium') : '—' }}</td>\n <td class=\"wq-num\"><i class=\"fa-solid\" [class.fa-chevron-down]=\"ExpandedID !== item.DeliveryID\" [class.fa-chevron-up]=\"ExpandedID === item.DeliveryID\"></i></td>\n </tr>\n @if (ExpandedID === item.DeliveryID) {\n <tr class=\"wq-detail-row\">\n <td colspan=\"7\">\n <div class=\"wq-detail\">\n <div class=\"wq-detail-col\">\n <h4>Delivery</h4>\n <dl>\n <dt>Delivery ID</dt><dd><code>{{ item.DeliveryID }}</code></dd>\n <dt>Topic</dt><dd>{{ item.Message.Topic }}</dd>\n <dt>Published</dt><dd>{{ item.Message.PublishedAt | date:'medium' }}</dd>\n @if (item.Message.CorrelationID) { <dt>Correlation</dt><dd>{{ item.Message.CorrelationID }}</dd> }\n @if (item.LastError) { <dt>Last error</dt><dd><pre class=\"wq-pre wq-pre-error\">{{ item.LastError }}</pre></dd> }\n </dl>\n <h4>Attributes</h4>\n @if (AttributeEntries(item).length === 0) { <p class=\"wq-muted\">none</p> } @else {\n <dl>\n @for (a of AttributeEntries(item); track a.Key) { <dt>{{ a.Key }}</dt><dd>{{ a.Value }}</dd> }\n </dl>\n }\n </div>\n <div class=\"wq-detail-col\">\n <h4>Payload</h4>\n <pre class=\"wq-pre\">{{ PrettyPayload(item) }}</pre>\n </div>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n }\n</div>\n\n<mj-confirm-dialog [Visible]=\"ConfirmReplayVisible\" Title=\"Replay dead letters\" Type=\"warning\" ConfirmText=\"Replay\" Icon=\"fa-solid fa-rotate-left\"\n [Message]=\"SelectedCount + ' dead letter' + (SelectedCount === 1 ? '' : 's') + ' will be queued again on this subscription.'\"\n DetailMessage=\"A replayed delivery keeps its message and runs as a fresh attempt; an Ordered head resumes its key in order.\"\n (Confirmed)=\"ReplaySelected()\" (Cancelled)=\"ConfirmReplayVisible = false\"></mj-confirm-dialog>\n\n<mj-work-queue-discard-dialog [Visible]=\"DiscardVisible\" Title=\"Discard dead letters\" [Message]=\"DiscardMessage\" [Busy]=\"ActionInProgress\"\n (VisibleChange)=\"DiscardVisible = $event\" (Confirmed)=\"DiscardSelected($event)\"></mj-work-queue-discard-dialog>\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Asks for the operator's reason before WorkQueue.DiscardDelivery runs (the operation requires one, and it is
|
|
5
|
+
* stored with the resolution). Shared by the Dead Letters and Partitions tabs.
|
|
6
|
+
*/
|
|
7
|
+
export declare class WorkQueueDiscardDialogComponent {
|
|
8
|
+
Visible: boolean;
|
|
9
|
+
Title: string;
|
|
10
|
+
/** What is about to happen, e.g. "3 dead letters will be discarded" or the blocked-key release warning. */
|
|
11
|
+
Message: string;
|
|
12
|
+
Busy: boolean;
|
|
13
|
+
VisibleChange: EventEmitter<boolean>;
|
|
14
|
+
Confirmed: EventEmitter<string>;
|
|
15
|
+
Reason: string;
|
|
16
|
+
get CanConfirm(): boolean;
|
|
17
|
+
Confirm(): void;
|
|
18
|
+
Cancel(): void;
|
|
19
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<WorkQueueDiscardDialogComponent, never>;
|
|
20
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<WorkQueueDiscardDialogComponent, "mj-work-queue-discard-dialog", never, { "Visible": { "alias": "Visible"; "required": false; }; "Title": { "alias": "Title"; "required": false; }; "Message": { "alias": "Message"; "required": false; }; "Busy": { "alias": "Busy"; "required": false; }; }, { "VisibleChange": "VisibleChange"; "Confirmed": "Confirmed"; }, never, never, false, never>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=work-queue-discard-dialog.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-queue-discard-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/WorkQueue/components/work-queue-discard-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,YAAY,EAAiB,MAAM,eAAe,CAAC;;AAEhG;;;GAGG;AACH,qBAOa,+BAA+B;IAC/B,OAAO,UAAS;IAChB,KAAK,SAAsB;IACpC,2GAA2G;IAClG,OAAO,SAAM;IACb,IAAI,UAAS;IACZ,aAAa,wBAA+B;IAC5C,SAAS,uBAA8B;IAE1C,MAAM,SAAM;IAEnB,IAAW,UAAU,IAAI,OAAO,CAE/B;IAEM,OAAO,IAAI,IAAI;IAMf,MAAM,IAAI,IAAI;yCArBZ,+BAA+B;2CAA/B,+BAA+B;CAyB3C"}
|