@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,37 @@
|
|
|
1
|
+
import { ChangeDetectorRef, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
|
|
2
|
+
import type { IMetadataProvider } from '@memberjunction/core';
|
|
3
|
+
import type { WorkQueueValidateBindingsOutput } from '@memberjunction/core-entities';
|
|
4
|
+
import { WorkQueueOperatorService } from '../services/work-queue-operator.service';
|
|
5
|
+
import type { WorkQueueTransportOption } from '../work-queue-types';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
type BindingIssue = WorkQueueValidateBindingsOutput['issues'][number];
|
|
8
|
+
/**
|
|
9
|
+
* Runs WorkQueue.ValidateBindings for every transport (or one) and lists the issues by severity. Read-only: the
|
|
10
|
+
* fix is always a metadata or infrastructure change, so each issue links back to its subject in words.
|
|
11
|
+
*/
|
|
12
|
+
export declare class WorkQueueBindingsComponent implements OnChanges {
|
|
13
|
+
private readonly operator;
|
|
14
|
+
private readonly cdr;
|
|
15
|
+
Provider: IMetadataProvider;
|
|
16
|
+
Transports: WorkQueueTransportOption[];
|
|
17
|
+
Loaded: EventEmitter<{
|
|
18
|
+
Errors: number;
|
|
19
|
+
Warnings: number;
|
|
20
|
+
}>;
|
|
21
|
+
SelectedTransport: string | null;
|
|
22
|
+
Issues: BindingIssue[];
|
|
23
|
+
IsLoading: boolean;
|
|
24
|
+
HasRun: boolean;
|
|
25
|
+
LoadError: string | null;
|
|
26
|
+
LastRunAt: Date | null;
|
|
27
|
+
constructor(operator: WorkQueueOperatorService, cdr: ChangeDetectorRef);
|
|
28
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
29
|
+
get Errors(): BindingIssue[];
|
|
30
|
+
get Warnings(): BindingIssue[];
|
|
31
|
+
OnTransportChange(name: string): void;
|
|
32
|
+
Refresh(): Promise<void>;
|
|
33
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<WorkQueueBindingsComponent, never>;
|
|
34
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<WorkQueueBindingsComponent, "mj-work-queue-bindings", never, { "Provider": { "alias": "Provider"; "required": false; }; "Transports": { "alias": "Transports"; "required": false; }; }, { "Loaded": "Loaded"; }, never, never, false, never>;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=work-queue-bindings.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-queue-bindings.component.d.ts","sourceRoot":"","sources":["../../../src/WorkQueue/components/work-queue-bindings.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,iBAAiB,EAAa,YAAY,EAAS,SAAS,EAAU,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7I,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;;AAEpE,KAAK,YAAY,GAAG,+BAA+B,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE;;;GAGG;AACH,qBAOa,0BAA2B,YAAW,SAAS;IAY5C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAA4B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAX5E,QAAQ,EAAG,iBAAiB,CAAC;IAC7B,UAAU,EAAE,wBAAwB,EAAE,CAAM;IAC3C,MAAM;gBAA8B,MAAM;kBAAY,MAAM;OAAM;IAErE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,MAAM,EAAE,YAAY,EAAE,CAAM;IAC5B,SAAS,UAAS;IAClB,MAAM,UAAS;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAQ;gBAER,QAAQ,EAAE,wBAAwB,EAAmB,GAAG,EAAE,iBAAiB;IAEjG,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMhD,IAAW,MAAM,IAAI,YAAY,EAAE,CAElC;IAED,IAAW,QAAQ,IAAI,YAAY,EAAE,CAEpC;IAEM,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;yCAjC5B,0BAA0B;2CAA1B,0BAA0B;CAoDtC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../services/work-queue-operator.service";
|
|
4
|
+
import * as i2 from "@angular/forms";
|
|
5
|
+
import * as i3 from "@memberjunction/ng-ui-components";
|
|
6
|
+
import * as i4 from "@memberjunction/ng-shared-generic";
|
|
7
|
+
import * as i5 from "@angular/common";
|
|
8
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
9
|
+
const _forTrack1 = ($index, $item) => $item.Subject + $item.Message;
|
|
10
|
+
function WorkQueueBindingsComponent_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
11
|
+
i0.ɵɵelementStart(0, "option", 5);
|
|
12
|
+
i0.ɵɵtext(1);
|
|
13
|
+
i0.ɵɵelementEnd();
|
|
14
|
+
} if (rf & 2) {
|
|
15
|
+
const t_r1 = ctx.$implicit;
|
|
16
|
+
i0.ɵɵproperty("value", t_r1.Name);
|
|
17
|
+
i0.ɵɵadvance();
|
|
18
|
+
i0.ɵɵtextInterpolate2("", t_r1.Name, " (", t_r1.DriverClass, ")");
|
|
19
|
+
} }
|
|
20
|
+
function WorkQueueBindingsComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelementStart(0, "span", 6);
|
|
22
|
+
i0.ɵɵtext(1);
|
|
23
|
+
i0.ɵɵpipe(2, "date");
|
|
24
|
+
i0.ɵɵelementEnd();
|
|
25
|
+
} if (rf & 2) {
|
|
26
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
27
|
+
i0.ɵɵadvance();
|
|
28
|
+
i0.ɵɵtextInterpolate1("Checked ", i0.ɵɵpipeBind2(2, 1, ctx_r1.LastRunAt, "mediumTime"));
|
|
29
|
+
} }
|
|
30
|
+
function WorkQueueBindingsComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
31
|
+
i0.ɵɵelementStart(0, "div", 7);
|
|
32
|
+
i0.ɵɵelement(1, "mj-loading", 10);
|
|
33
|
+
i0.ɵɵelementEnd();
|
|
34
|
+
} }
|
|
35
|
+
function WorkQueueBindingsComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
+
i0.ɵɵelement(0, "mj-alert", 8);
|
|
37
|
+
} if (rf & 2) {
|
|
38
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
39
|
+
i0.ɵɵproperty("Message", ctx_r1.LoadError);
|
|
40
|
+
} }
|
|
41
|
+
function WorkQueueBindingsComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
+
i0.ɵɵelement(0, "mj-empty-state", 9);
|
|
43
|
+
} if (rf & 2) {
|
|
44
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
45
|
+
i0.ɵɵproperty("Message", "Every topic and subscription" + (ctx_r1.SelectedTransport ? " on " + ctx_r1.SelectedTransport : "") + " resolves to a live transport resource with a compatible driver.");
|
|
46
|
+
} }
|
|
47
|
+
function WorkQueueBindingsComponent_Conditional_13_Conditional_0_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
i0.ɵɵelementStart(0, "div", 15)(1, "span", 16);
|
|
49
|
+
i0.ɵɵtext(2);
|
|
50
|
+
i0.ɵɵelementEnd();
|
|
51
|
+
i0.ɵɵelementStart(3, "span", 17);
|
|
52
|
+
i0.ɵɵtext(4);
|
|
53
|
+
i0.ɵɵelementEnd()();
|
|
54
|
+
} if (rf & 2) {
|
|
55
|
+
const issue_r3 = ctx.$implicit;
|
|
56
|
+
i0.ɵɵadvance(2);
|
|
57
|
+
i0.ɵɵtextInterpolate(issue_r3.Subject);
|
|
58
|
+
i0.ɵɵadvance(2);
|
|
59
|
+
i0.ɵɵtextInterpolate(issue_r3.Message);
|
|
60
|
+
} }
|
|
61
|
+
function WorkQueueBindingsComponent_Conditional_13_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
62
|
+
i0.ɵɵelementStart(0, "section", 11)(1, "h3", 13);
|
|
63
|
+
i0.ɵɵelement(2, "i", 14);
|
|
64
|
+
i0.ɵɵtext(3);
|
|
65
|
+
i0.ɵɵelementEnd();
|
|
66
|
+
i0.ɵɵrepeaterCreate(4, WorkQueueBindingsComponent_Conditional_13_Conditional_0_For_5_Template, 5, 2, "div", 15, _forTrack1);
|
|
67
|
+
i0.ɵɵelementEnd();
|
|
68
|
+
} if (rf & 2) {
|
|
69
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
70
|
+
i0.ɵɵadvance(3);
|
|
71
|
+
i0.ɵɵtextInterpolate2(" ", ctx_r1.Errors.length, " error", ctx_r1.Errors.length === 1 ? "" : "s");
|
|
72
|
+
i0.ɵɵadvance();
|
|
73
|
+
i0.ɵɵrepeater(ctx_r1.Errors);
|
|
74
|
+
} }
|
|
75
|
+
function WorkQueueBindingsComponent_Conditional_13_Conditional_1_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
+
i0.ɵɵelementStart(0, "div", 20)(1, "span", 16);
|
|
77
|
+
i0.ɵɵtext(2);
|
|
78
|
+
i0.ɵɵelementEnd();
|
|
79
|
+
i0.ɵɵelementStart(3, "span", 17);
|
|
80
|
+
i0.ɵɵtext(4);
|
|
81
|
+
i0.ɵɵelementEnd()();
|
|
82
|
+
} if (rf & 2) {
|
|
83
|
+
const issue_r4 = ctx.$implicit;
|
|
84
|
+
i0.ɵɵadvance(2);
|
|
85
|
+
i0.ɵɵtextInterpolate(issue_r4.Subject);
|
|
86
|
+
i0.ɵɵadvance(2);
|
|
87
|
+
i0.ɵɵtextInterpolate(issue_r4.Message);
|
|
88
|
+
} }
|
|
89
|
+
function WorkQueueBindingsComponent_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
90
|
+
i0.ɵɵelementStart(0, "section", 11)(1, "h3", 18);
|
|
91
|
+
i0.ɵɵelement(2, "i", 19);
|
|
92
|
+
i0.ɵɵtext(3);
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
i0.ɵɵrepeaterCreate(4, WorkQueueBindingsComponent_Conditional_13_Conditional_1_For_5_Template, 5, 2, "div", 20, _forTrack1);
|
|
95
|
+
i0.ɵɵelementEnd();
|
|
96
|
+
} if (rf & 2) {
|
|
97
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
98
|
+
i0.ɵɵadvance(3);
|
|
99
|
+
i0.ɵɵtextInterpolate2(" ", ctx_r1.Warnings.length, " warning", ctx_r1.Warnings.length === 1 ? "" : "s");
|
|
100
|
+
i0.ɵɵadvance();
|
|
101
|
+
i0.ɵɵrepeater(ctx_r1.Warnings);
|
|
102
|
+
} }
|
|
103
|
+
function WorkQueueBindingsComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵconditionalCreate(0, WorkQueueBindingsComponent_Conditional_13_Conditional_0_Template, 6, 2, "section", 11);
|
|
105
|
+
i0.ɵɵconditionalCreate(1, WorkQueueBindingsComponent_Conditional_13_Conditional_1_Template, 6, 2, "section", 11);
|
|
106
|
+
i0.ɵɵelementStart(2, "p", 12);
|
|
107
|
+
i0.ɵɵtext(3, "Errors stop a host from starting the affected subscription. Warnings are advisory. Fix them in the topology records or the transport's infrastructure, then re-check.");
|
|
108
|
+
i0.ɵɵelementEnd();
|
|
109
|
+
} if (rf & 2) {
|
|
110
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
111
|
+
i0.ɵɵconditional(ctx_r1.Errors.length > 0 ? 0 : -1);
|
|
112
|
+
i0.ɵɵadvance();
|
|
113
|
+
i0.ɵɵconditional(ctx_r1.Warnings.length > 0 ? 1 : -1);
|
|
114
|
+
} }
|
|
115
|
+
/**
|
|
116
|
+
* Runs WorkQueue.ValidateBindings for every transport (or one) and lists the issues by severity. Read-only: the
|
|
117
|
+
* fix is always a metadata or infrastructure change, so each issue links back to its subject in words.
|
|
118
|
+
*/
|
|
119
|
+
export class WorkQueueBindingsComponent {
|
|
120
|
+
operator;
|
|
121
|
+
cdr;
|
|
122
|
+
Provider;
|
|
123
|
+
Transports = [];
|
|
124
|
+
Loaded = new EventEmitter();
|
|
125
|
+
SelectedTransport = null;
|
|
126
|
+
Issues = [];
|
|
127
|
+
IsLoading = false;
|
|
128
|
+
HasRun = false;
|
|
129
|
+
LoadError = null;
|
|
130
|
+
LastRunAt = null;
|
|
131
|
+
constructor(operator, cdr) {
|
|
132
|
+
this.operator = operator;
|
|
133
|
+
this.cdr = cdr;
|
|
134
|
+
}
|
|
135
|
+
ngOnChanges(changes) {
|
|
136
|
+
if (changes['Provider'] && this.Provider && !this.HasRun) {
|
|
137
|
+
void this.Refresh();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
get Errors() {
|
|
141
|
+
return this.Issues.filter((i) => i.Severity === 'Error');
|
|
142
|
+
}
|
|
143
|
+
get Warnings() {
|
|
144
|
+
return this.Issues.filter((i) => i.Severity === 'Warning');
|
|
145
|
+
}
|
|
146
|
+
OnTransportChange(name) {
|
|
147
|
+
this.SelectedTransport = name === '' ? null : name;
|
|
148
|
+
void this.Refresh();
|
|
149
|
+
}
|
|
150
|
+
async Refresh() {
|
|
151
|
+
if (!this.Provider)
|
|
152
|
+
return;
|
|
153
|
+
this.IsLoading = true;
|
|
154
|
+
this.LoadError = null;
|
|
155
|
+
this.cdr.markForCheck();
|
|
156
|
+
try {
|
|
157
|
+
const output = await this.operator.ValidateBindings(this.Provider, this.SelectedTransport ?? undefined);
|
|
158
|
+
this.Issues = [...output.issues].sort((a, b) => (a.Severity === b.Severity ? a.Subject.localeCompare(b.Subject) : a.Severity === 'Error' ? -1 : 1));
|
|
159
|
+
this.HasRun = true;
|
|
160
|
+
this.LastRunAt = new Date();
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
this.Issues = [];
|
|
164
|
+
this.LoadError = error instanceof Error ? error.message : String(error);
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
this.IsLoading = false;
|
|
168
|
+
this.Loaded.emit({ Errors: this.Errors.length, Warnings: this.Warnings.length });
|
|
169
|
+
this.cdr.markForCheck();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
static ɵfac = function WorkQueueBindingsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || WorkQueueBindingsComponent)(i0.ɵɵdirectiveInject(i1.WorkQueueOperatorService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
173
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WorkQueueBindingsComponent, selectors: [["mj-work-queue-bindings"]], inputs: { Provider: "Provider", Transports: "Transports" }, outputs: { Loaded: "Loaded" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 14, vars: 3, consts: [[1, "wq-panel"], [1, "wq-picker-row"], ["for", "wq-bd-transport", 1, "wq-label"], ["id", "wq-bd-transport", 1, "wq-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], [1, "wq-hint"], [1, "wq-loading"], ["Variant", "error", "Title", "Validation could not run", 3, "Message"], ["Variant", "success", "Icon", "fa-solid fa-circle-check", "Title", "Bindings are consistent", 3, "Message"], ["text", "Validating bindings...", "size", "medium"], [1, "wq-issues"], [1, "wq-footnote"], [1, "wq-issues-title", "wq-issues-error"], [1, "fa-solid", "fa-circle-xmark"], [1, "wq-issue", "wq-issue-error"], [1, "wq-issue-subject"], [1, "wq-issue-message"], [1, "wq-issues-title", "wq-issues-warning"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "wq-issue", "wq-issue-warning"]], template: function WorkQueueBindingsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
174
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "label", 2);
|
|
175
|
+
i0.ɵɵtext(3, "Transport");
|
|
176
|
+
i0.ɵɵelementEnd();
|
|
177
|
+
i0.ɵɵelementStart(4, "select", 3);
|
|
178
|
+
i0.ɵɵlistener("ngModelChange", function WorkQueueBindingsComponent_Template_select_ngModelChange_4_listener($event) { return ctx.OnTransportChange($event); });
|
|
179
|
+
i0.ɵɵelementStart(5, "option", 4);
|
|
180
|
+
i0.ɵɵtext(6, "All transports");
|
|
181
|
+
i0.ɵɵelementEnd();
|
|
182
|
+
i0.ɵɵrepeaterCreate(7, WorkQueueBindingsComponent_For_8_Template, 2, 3, "option", 5, _forTrack0);
|
|
183
|
+
i0.ɵɵelementEnd();
|
|
184
|
+
i0.ɵɵconditionalCreate(9, WorkQueueBindingsComponent_Conditional_9_Template, 3, 4, "span", 6);
|
|
185
|
+
i0.ɵɵelementEnd();
|
|
186
|
+
i0.ɵɵconditionalCreate(10, WorkQueueBindingsComponent_Conditional_10_Template, 2, 0, "div", 7)(11, WorkQueueBindingsComponent_Conditional_11_Template, 1, 1, "mj-alert", 8)(12, WorkQueueBindingsComponent_Conditional_12_Template, 1, 1, "mj-empty-state", 9)(13, WorkQueueBindingsComponent_Conditional_13_Template, 4, 2);
|
|
187
|
+
i0.ɵɵelementEnd();
|
|
188
|
+
} if (rf & 2) {
|
|
189
|
+
i0.ɵɵadvance(4);
|
|
190
|
+
i0.ɵɵproperty("ngModel", ctx.SelectedTransport ?? "");
|
|
191
|
+
i0.ɵɵadvance(3);
|
|
192
|
+
i0.ɵɵrepeater(ctx.Transports);
|
|
193
|
+
i0.ɵɵadvance(2);
|
|
194
|
+
i0.ɵɵconditional(ctx.LastRunAt ? 9 : -1);
|
|
195
|
+
i0.ɵɵadvance();
|
|
196
|
+
i0.ɵɵconditional(ctx.IsLoading ? 10 : ctx.LoadError ? 11 : ctx.HasRun && ctx.Issues.length === 0 ? 12 : ctx.HasRun ? 13 : -1);
|
|
197
|
+
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJAlertComponent, i3.MJEmptyStateComponent, i4.LoadingComponent, i5.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: 280px;\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-issues[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.wq-issues-title[_ngcontent-%COMP%] {\n margin: 0 0 4px;\n font-size: 0.85rem;\n font-weight: 600;\n}\n\n.wq-issues-error[_ngcontent-%COMP%] {\n color: var(--mj-status-error-text);\n}\n\n.wq-issues-warning[_ngcontent-%COMP%] {\n color: var(--mj-status-warning-text);\n}\n\n.wq-issue[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(180px, 1fr) 3fr;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n font-size: 0.85rem;\n}\n\n.wq-issue-error[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-error);\n}\n\n.wq-issue-warning[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.wq-issue-subject[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow-wrap: anywhere;\n}\n\n.wq-issue-message[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.wq-footnote[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 800px) {\n .wq-issue[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .wq-select[_ngcontent-%COMP%] {\n min-width: 0;\n width: 100%;\n }\n}"], changeDetection: 0 });
|
|
198
|
+
}
|
|
199
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WorkQueueBindingsComponent, [{
|
|
200
|
+
type: Component,
|
|
201
|
+
args: [{ standalone: false, selector: 'mj-work-queue-bindings', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"wq-panel\">\n <div class=\"wq-picker-row\">\n <label class=\"wq-label\" for=\"wq-bd-transport\">Transport</label>\n <select id=\"wq-bd-transport\" class=\"wq-select\" [ngModel]=\"SelectedTransport ?? ''\" (ngModelChange)=\"OnTransportChange($event)\">\n <option value=\"\">All transports</option>\n @for (t of Transports; track t.ID) {\n <option [value]=\"t.Name\">{{ t.Name }} ({{ t.DriverClass }})</option>\n }\n </select>\n @if (LastRunAt) {\n <span class=\"wq-hint\">Checked {{ LastRunAt | date:'mediumTime' }}</span>\n }\n </div>\n\n @if (IsLoading) {\n <div class=\"wq-loading\"><mj-loading text=\"Validating bindings...\" size=\"medium\"></mj-loading></div>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\" Title=\"Validation could not run\" [Message]=\"LoadError\"></mj-alert>\n } @else if (HasRun && Issues.length === 0) {\n <mj-empty-state Variant=\"success\" Icon=\"fa-solid fa-circle-check\" Title=\"Bindings are consistent\"\n [Message]=\"'Every topic and subscription' + (SelectedTransport ? ' on ' + SelectedTransport : '') + ' resolves to a live transport resource with a compatible driver.'\" />\n } @else if (HasRun) {\n @if (Errors.length > 0) {\n <section class=\"wq-issues\">\n <h3 class=\"wq-issues-title wq-issues-error\"><i class=\"fa-solid fa-circle-xmark\"></i> {{ Errors.length }} error{{ Errors.length === 1 ? '' : 's' }}</h3>\n @for (issue of Errors; track issue.Subject + issue.Message) {\n <div class=\"wq-issue wq-issue-error\">\n <span class=\"wq-issue-subject\">{{ issue.Subject }}</span>\n <span class=\"wq-issue-message\">{{ issue.Message }}</span>\n </div>\n }\n </section>\n }\n @if (Warnings.length > 0) {\n <section class=\"wq-issues\">\n <h3 class=\"wq-issues-title wq-issues-warning\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ Warnings.length }} warning{{ Warnings.length === 1 ? '' : 's' }}</h3>\n @for (issue of Warnings; track issue.Subject + issue.Message) {\n <div class=\"wq-issue wq-issue-warning\">\n <span class=\"wq-issue-subject\">{{ issue.Subject }}</span>\n <span class=\"wq-issue-message\">{{ issue.Message }}</span>\n </div>\n }\n </section>\n }\n <p class=\"wq-footnote\">Errors stop a host from starting the affected subscription. Warnings are advisory. Fix them in the topology records or the transport's infrastructure, then re-check.</p>\n }\n</div>\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: 280px;\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-issues {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.wq-issues-title {\n margin: 0 0 4px;\n font-size: 0.85rem;\n font-weight: 600;\n}\n\n.wq-issues-error {\n color: var(--mj-status-error-text);\n}\n\n.wq-issues-warning {\n color: var(--mj-status-warning-text);\n}\n\n.wq-issue {\n display: grid;\n grid-template-columns: minmax(180px, 1fr) 3fr;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n font-size: 0.85rem;\n}\n\n.wq-issue-error {\n border-left: 3px solid var(--mj-status-error);\n}\n\n.wq-issue-warning {\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.wq-issue-subject {\n font-weight: 600;\n color: var(--mj-text-primary);\n overflow-wrap: anywhere;\n}\n\n.wq-issue-message {\n color: var(--mj-text-secondary);\n}\n\n.wq-footnote {\n margin: 0;\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n@media (max-width: 800px) {\n .wq-issue {\n grid-template-columns: 1fr;\n }\n .wq-select {\n min-width: 0;\n width: 100%;\n }\n}\n"] }]
|
|
202
|
+
}], () => [{ type: i1.WorkQueueOperatorService }, { type: i0.ChangeDetectorRef }], { Provider: [{
|
|
203
|
+
type: Input
|
|
204
|
+
}], Transports: [{
|
|
205
|
+
type: Input
|
|
206
|
+
}], Loaded: [{
|
|
207
|
+
type: Output
|
|
208
|
+
}] }); })();
|
|
209
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WorkQueueBindingsComponent, { className: "WorkQueueBindingsComponent", filePath: "src/WorkQueue/components/work-queue-bindings.component.ts", lineNumber: 20 }); })();
|
|
210
|
+
//# sourceMappingURL=work-queue-bindings.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-queue-bindings.component.js","sourceRoot":"","sources":["../../../src/WorkQueue/components/work-queue-bindings.component.ts","../../../src/WorkQueue/components/work-queue-bindings.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 { WorkQueueValidateBindingsOutput } from '@memberjunction/core-entities';\nimport { WorkQueueOperatorService } from '../services/work-queue-operator.service';\nimport type { WorkQueueTransportOption } from '../work-queue-types';\n\ntype BindingIssue = WorkQueueValidateBindingsOutput['issues'][number];\n\n/**\n * Runs WorkQueue.ValidateBindings for every transport (or one) and lists the issues by severity. Read-only: the\n * fix is always a metadata or infrastructure change, so each issue links back to its subject in words.\n */\n@Component({\n standalone: false,\n selector: 'mj-work-queue-bindings',\n templateUrl: './work-queue-bindings.component.html',\n styleUrls: ['./work-queue-bindings.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class WorkQueueBindingsComponent implements OnChanges {\n @Input() Provider!: IMetadataProvider;\n @Input() Transports: WorkQueueTransportOption[] = [];\n @Output() Loaded = new EventEmitter<{ Errors: number; Warnings: number }>();\n\n public SelectedTransport: string | null = null;\n public Issues: BindingIssue[] = [];\n public IsLoading = false;\n public HasRun = false;\n public LoadError: string | null = null;\n public LastRunAt: Date | null = null;\n\n constructor(private readonly operator: WorkQueueOperatorService, private readonly cdr: ChangeDetectorRef) {}\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (changes['Provider'] && this.Provider && !this.HasRun) {\n void this.Refresh();\n }\n }\n\n public get Errors(): BindingIssue[] {\n return this.Issues.filter((i) => i.Severity === 'Error');\n }\n\n public get Warnings(): BindingIssue[] {\n return this.Issues.filter((i) => i.Severity === 'Warning');\n }\n\n public OnTransportChange(name: string): void {\n this.SelectedTransport = name === '' ? null : name;\n void this.Refresh();\n }\n\n public async Refresh(): Promise<void> {\n if (!this.Provider) return;\n this.IsLoading = true;\n this.LoadError = null;\n this.cdr.markForCheck();\n try {\n const output = await this.operator.ValidateBindings(this.Provider, this.SelectedTransport ?? undefined);\n this.Issues = [...output.issues].sort((a, b) => (a.Severity === b.Severity ? a.Subject.localeCompare(b.Subject) : a.Severity === 'Error' ? -1 : 1));\n this.HasRun = true;\n this.LastRunAt = new Date();\n } catch (error) {\n this.Issues = [];\n this.LoadError = error instanceof Error ? error.message : String(error);\n } finally {\n this.IsLoading = false;\n this.Loaded.emit({ Errors: this.Errors.length, Warnings: this.Warnings.length });\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"wq-panel\">\n <div class=\"wq-picker-row\">\n <label class=\"wq-label\" for=\"wq-bd-transport\">Transport</label>\n <select id=\"wq-bd-transport\" class=\"wq-select\" [ngModel]=\"SelectedTransport ?? ''\" (ngModelChange)=\"OnTransportChange($event)\">\n <option value=\"\">All transports</option>\n @for (t of Transports; track t.ID) {\n <option [value]=\"t.Name\">{{ t.Name }} ({{ t.DriverClass }})</option>\n }\n </select>\n @if (LastRunAt) {\n <span class=\"wq-hint\">Checked {{ LastRunAt | date:'mediumTime' }}</span>\n }\n </div>\n\n @if (IsLoading) {\n <div class=\"wq-loading\"><mj-loading text=\"Validating bindings...\" size=\"medium\"></mj-loading></div>\n } @else if (LoadError) {\n <mj-alert Variant=\"error\" Title=\"Validation could not run\" [Message]=\"LoadError\"></mj-alert>\n } @else if (HasRun && Issues.length === 0) {\n <mj-empty-state Variant=\"success\" Icon=\"fa-solid fa-circle-check\" Title=\"Bindings are consistent\"\n [Message]=\"'Every topic and subscription' + (SelectedTransport ? ' on ' + SelectedTransport : '') + ' resolves to a live transport resource with a compatible driver.'\" />\n } @else if (HasRun) {\n @if (Errors.length > 0) {\n <section class=\"wq-issues\">\n <h3 class=\"wq-issues-title wq-issues-error\"><i class=\"fa-solid fa-circle-xmark\"></i> {{ Errors.length }} error{{ Errors.length === 1 ? '' : 's' }}</h3>\n @for (issue of Errors; track issue.Subject + issue.Message) {\n <div class=\"wq-issue wq-issue-error\">\n <span class=\"wq-issue-subject\">{{ issue.Subject }}</span>\n <span class=\"wq-issue-message\">{{ issue.Message }}</span>\n </div>\n }\n </section>\n }\n @if (Warnings.length > 0) {\n <section class=\"wq-issues\">\n <h3 class=\"wq-issues-title wq-issues-warning\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ Warnings.length }} warning{{ Warnings.length === 1 ? '' : 's' }}</h3>\n @for (issue of Warnings; track issue.Subject + issue.Message) {\n <div class=\"wq-issue wq-issue-warning\">\n <span class=\"wq-issue-subject\">{{ issue.Subject }}</span>\n <span class=\"wq-issue-message\">{{ issue.Message }}</span>\n </div>\n }\n </section>\n }\n <p class=\"wq-footnote\">Errors stop a host from starting the affected subscription. Warnings are advisory. Fix them in the topology records or the transport's infrastructure, then re-check.</p>\n }\n</div>\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ChangeDetectorRef, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
|
|
2
|
+
import type { IMetadataProvider } from '@memberjunction/core';
|
|
3
|
+
import type { WorkQueueDeadLetterRow } from '@memberjunction/core-entities';
|
|
4
|
+
import { WorkQueueOperatorService } from '../services/work-queue-operator.service';
|
|
5
|
+
import type { WorkQueueSubscriptionOption } from '../work-queue-types';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/** One per-item outcome of a bulk replay or discard, shown until the next action. */
|
|
8
|
+
export interface WorkQueueActionOutcome {
|
|
9
|
+
DeliveryID: string;
|
|
10
|
+
Ok: boolean;
|
|
11
|
+
Message: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Dead-letter browser for one subscription: list (best-effort scan on cloud transports), envelope viewer, and the
|
|
15
|
+
* replay / discard actions, which loop the single-item operations client-side and report per-item results.
|
|
16
|
+
*/
|
|
17
|
+
export declare class WorkQueueDeadLettersComponent implements OnChanges {
|
|
18
|
+
private readonly operator;
|
|
19
|
+
private readonly cdr;
|
|
20
|
+
Provider: IMetadataProvider;
|
|
21
|
+
Subscriptions: WorkQueueSubscriptionOption[];
|
|
22
|
+
SelectedSubscription: string | null;
|
|
23
|
+
/** Update on MJ: Work Queue Subscriptions — replay and discard are disabled without it. */
|
|
24
|
+
CanOperate: boolean;
|
|
25
|
+
SelectedSubscriptionChange: EventEmitter<string | null>;
|
|
26
|
+
/** Emitted after a replay or discard changed something, so the dashboard refreshes stats. */
|
|
27
|
+
Changed: EventEmitter<void>;
|
|
28
|
+
Loaded: EventEmitter<{
|
|
29
|
+
Count: number;
|
|
30
|
+
Selected: number;
|
|
31
|
+
}>;
|
|
32
|
+
Items: WorkQueueDeadLetterRow[];
|
|
33
|
+
Supported: boolean;
|
|
34
|
+
IsLoading: boolean;
|
|
35
|
+
LoadError: string | null;
|
|
36
|
+
ExpandedID: string | null;
|
|
37
|
+
Selected: Set<string>;
|
|
38
|
+
ConfirmReplayVisible: boolean;
|
|
39
|
+
DiscardVisible: boolean;
|
|
40
|
+
ActionInProgress: boolean;
|
|
41
|
+
Outcomes: WorkQueueActionOutcome[];
|
|
42
|
+
constructor(operator: WorkQueueOperatorService, cdr: ChangeDetectorRef);
|
|
43
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
44
|
+
get Current(): WorkQueueSubscriptionOption | undefined;
|
|
45
|
+
get IsBestEffort(): boolean;
|
|
46
|
+
get SelectedCount(): number;
|
|
47
|
+
get AllSelected(): boolean;
|
|
48
|
+
OnSubscriptionChange(name: string): void;
|
|
49
|
+
Refresh(): Promise<void>;
|
|
50
|
+
ToggleExpanded(id: string): void;
|
|
51
|
+
ToggleSelected(id: string, event: Event): void;
|
|
52
|
+
ToggleAll(): void;
|
|
53
|
+
Age(seconds: number | null | undefined): string;
|
|
54
|
+
PrettyPayload(item: WorkQueueDeadLetterRow): string;
|
|
55
|
+
AttributeEntries(item: WorkQueueDeadLetterRow): {
|
|
56
|
+
Key: string;
|
|
57
|
+
Value: string;
|
|
58
|
+
}[];
|
|
59
|
+
/** How many waiting items a discard of the selected blocking heads would release, for the confirmation text. */
|
|
60
|
+
get DiscardMessage(): string;
|
|
61
|
+
RequestReplay(): void;
|
|
62
|
+
RequestDiscard(): void;
|
|
63
|
+
ReplaySelected(): Promise<void>;
|
|
64
|
+
DiscardSelected(reason: string): Promise<void>;
|
|
65
|
+
private runForSelected;
|
|
66
|
+
private emitLoaded;
|
|
67
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<WorkQueueDeadLettersComponent, never>;
|
|
68
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<WorkQueueDeadLettersComponent, "mj-work-queue-dead-letters", never, { "Provider": { "alias": "Provider"; "required": false; }; "Subscriptions": { "alias": "Subscriptions"; "required": false; }; "SelectedSubscription": { "alias": "SelectedSubscription"; "required": false; }; "CanOperate": { "alias": "CanOperate"; "required": false; }; }, { "SelectedSubscriptionChange": "SelectedSubscriptionChange"; "Changed": "Changed"; "Loaded": "Loaded"; }, never, never, false, never>;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=work-queue-dead-letters.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-queue-dead-letters.component.d.ts","sourceRoot":"","sources":["../../../src/WorkQueue/components/work-queue-dead-letters.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,iBAAiB,EAAa,YAAY,EAAS,SAAS,EAAU,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7I,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AAEnF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;;AAEvE,qFAAqF;AACrF,MAAM,WAAW,sBAAsB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAOa,6BAA8B,YAAW,SAAS;IAsB/C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAA4B,OAAO,CAAC,QAAQ,CAAC,GAAG;IArB5E,QAAQ,EAAG,iBAAiB,CAAC;IAC7B,aAAa,EAAE,2BAA2B,EAAE,CAAM;IAClD,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACpD,2FAA2F;IAClF,UAAU,UAAS;IAClB,0BAA0B,8BAAqC;IACzE,6FAA6F;IACnF,OAAO,qBAA4B;IACnC,MAAM;eAA6B,MAAM;kBAAY,MAAM;OAAM;IAEpE,KAAK,EAAE,sBAAsB,EAAE,CAAM;IACrC,SAAS,UAAQ;IACjB,SAAS,UAAS;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IACjC,QAAQ,cAAqB;IAC7B,oBAAoB,UAAS;IAC7B,cAAc,UAAS;IACvB,gBAAgB,UAAS;IACzB,QAAQ,EAAE,sBAAsB,EAAE,CAAM;gBAElB,QAAQ,EAAE,wBAAwB,EAAmB,GAAG,EAAE,iBAAiB;IAEjG,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMhD,IAAW,OAAO,IAAI,2BAA2B,GAAG,SAAS,CAE5D;IAED,IAAW,YAAY,IAAI,OAAO,CAEjC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAEM,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B9B,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIhC,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAM9C,SAAS,IAAI,IAAI;IAKjB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;IAI/C,aAAa,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM;IAYnD,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;IAIvF,gHAAgH;IAChH,IAAW,cAAc,IAAI,MAAM,CAIlC;IAEM,aAAa,IAAI,IAAI;IAIrB,cAAc,IAAI,IAAI;IAIhB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAO7C,cAAc;IAoB5B,OAAO,CAAC,UAAU;yCA/JT,6BAA6B;2CAA7B,6BAA6B;CAkKzC"}
|