@memberjunction/ng-dashboards 5.35.0 → 5.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.js +3 -3
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +157 -137
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +4 -4
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +329 -371
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +137 -142
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +111 -116
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +13 -65
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +13 -65
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +13 -65
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/Admin/base-admin-container.component.d.ts +9 -7
- package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
- package/dist/Admin/base-admin-container.component.js +26 -17
- package/dist/Admin/base-admin-container.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
- package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-new-message-resource.component.js +661 -0
- package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
- package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
- package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
- package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +46 -72
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -100
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +158 -168
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +257 -264
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts +5 -0
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +46 -64
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +75 -84
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +76 -85
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +97 -99
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +842 -855
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +78 -89
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
- package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +1 -0
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +1 -0
- package/dist/Lists/index.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +236 -10
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +19 -19
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +543 -629
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +50 -49
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +1 -1
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +16 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +9 -7
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +13 -4
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +16 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +10 -9
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +13 -2
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +1 -1
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +13 -1
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +53 -52
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication-new-message-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-new-message-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAMlE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;;;;;;;;IAkDlD,wBAA2C;IAAC,kCAC9C;;;IACE,wBAA+B;IAAC,kCAClC;;;IAOE,wBAA2C;IAAC,+BAC9C;;;IACE,wBAAuC;IAAC,sBAC1C;;;IAcE,iCAAiE;;;IAS7D,kCAAyB;IAAA,YAAY;IAAA,iBAAS;;;IAAtC,iCAAgB;IAAC,cAAY;IAAZ,+BAAY;;;IASnC,kCAA0B;IAAA,YAAa;IAAA,iBAAS;;;IAAxC,kCAAiB;IAAC,cAAa;IAAb,gCAAa;;;;IAJ3C,iCAA2B;IAAA,4BAAY;IAAA,iBAAQ;IAC/C,kCAAuE;IAApC,mWAAmC;IACpE,kCAAyB;IAAA,2CAAsB;IAAA,iBAAS;IACxD,oIAEC;IACH,iBAAS;;;IAL0B,eAAmC;IAAnC,4DAAmC;IAC5D,cAAgB;IAAhB,8BAAgB;IACxB,eAEC;IAFD,0CAEC;;;;IAjBL,iCAA2B;IAAA,uBAAO;IAAA,iBAAQ;IAC1C,kCAGuC;IADrC,8UAAgC;IAChC,qNAAiB,yBAAkB,KAAC;IACpC,kCAAyB;IAAA,sCAAiB;IAAA,iBAAS;IACnD,sHAEC;IACH,iBAAS;IAET,uGAAuC;IAUvC,iCAA2B;IAAA,oBAAI;IAAA,iBAAQ;IACvC,kCAIqC;IADnC,gUAAyB;IAH3B,iBAIqC;IAErC,kCAA2B;IAAA,wBAAO;IAAA,iBAAQ;IAC1C,kCAIkC;IADhC,wTAAqB;IAHvB,iBAIkC;IAElC,kCAA2B;IAAA,qBAAI;IAAA,iBAAQ;IACvC,qCAI6C;IAF3C,qTAAkB;IAEyB,iBAAW;;;IArCtD,eAAgC;IAAhC,yDAAgC;IAExB,cAAgB;IAAhB,8BAAgB;IACxB,eAEC;IAFD,+BAEC;IAGH,eAQC;IARD,iEAQC;IAMC,eAAyB;IAAzB,kDAAyB;IAOzB,eAAqB;IAArB,8CAAqB;IAQrB,eAA0C;IAA1C,6BAAA,iDAA0C,CAAA;IAF1C,2CAAkB;;;;IAqBpB,iCAA+C;IAAA,+BAAe;IAAA,iBAAQ;IACtE,iCAI6B;IAD3B,qUAA4B;IAH9B,iBAI6B;IAC7B,6BAAsB;IACpB,uHAEF;IAAA,iBAAI;;;IALF,eAA4B;IAA5B,qDAA4B;;;IAoBxB,AADF,+BAA8C,eAChB;IAAA,YAAqD;IAAA,iBAAO;IACxF,gCAA4B;IAAA,YAAkC;IAChE,AADgE,iBAAO,EACjE;;;IAFwB,eAAqD;IAArD,qFAAqD;IACrD,eAAkC;IAAlC,yDAAkC;;;IAVhE,AADF,AADF,+BAA+F,cACpE,eACK;IAAA,8BAAc;IAAA,iBAAO;IACjD,gCAA4B;IAAA,YAAuC;IACrE,AADqE,iBAAO,EACtE;IAEJ,AADF,+BAAmD,eACrB;IAAA,4BAAY;IAAA,iBAAO;IAC/C,gCAA4B;IAAA,aAAsC;IACpE,AADoE,iBAAO,EACrE;IACN,oHAAwC;IAOtC,AADF,gCAA6C,gBACf;IAAA,uBAAM;IAAA,iBAAO;IACzC,iCAA4B;IAAA,aAAgC;IAEhE,AADE,AAD8D,iBAAO,EAC/D,EACF;;;IAnBqB,mFAAmE;IAG9D,eAAuC;IAAvC,8DAAuC;IAIvC,eAAsC;IAAtC,6DAAsC;IAEpE,cAKC;IALD,mEAKC;IAG6B,eAAgC;IAAhC,uDAAgC;;AAqIvE,IAAM,gCAAgC,GAAtC,MAAM,gCAAiC,SAAQ,qBAAqB;IAgC/D;IACA;IAhCV,wEAAwE;IACxE,wEAAwE;IACxE,4BAA4B;IAC5B,oDAAoD;IAEpD,gBAAgB;IACT,gBAAgB,GAAG,IAAI,CAAC;IACxB,SAAS,GAAoC,EAAE,CAAC;IAChD,YAAY,GAA+C,EAAE,CAAC;IAC9D,kBAAkB,GAAkB,IAAI,CAAC;IACzC,qBAAqB,GAAkB,IAAI,CAAC;IAEnD,gBAAgB;IACT,WAAW,GAAG,EAAE,CAAC;IACjB,OAAO,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,EAAE,CAAC;IAEjB,iBAAiB;IACV,cAAc,GAA0B,IAAI,CAAC;IAC7C,cAAc,GAAG,EAAE,CAAC;IACpB,eAAe,GAA2B,IAAI,CAAC;IAEtD,uEAAuE;IACvE,8CAA8C;IACtC,uBAAuB,GAAkB,IAAI,CAAC;IAC9C,sBAAsB,GAAkB,IAAI,CAAC;IAE9C,mBAAmB,GAAG,KAAK,CAAC;IAC5B,SAAS,GAAG,KAAK,CAAC;IAEzB,YACU,GAAsB,EACtB,mBAA0C;QAElD,KAAK,EAAE,CAAC;QAHA,QAAG,GAAH,GAAG,CAAmB;QACtB,wBAAmB,GAAnB,mBAAmB,CAAuB;IAGpD,CAAC;IAEQ,KAAK,CAAC,QAAQ;QACrB,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEQ,WAAW;QAClB,KAAK,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;IAED,IAAW,oBAAoB;QAC7B,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,uBAAuB,KAAK,IAAI,CAAC,kBAAkB,CAC/D,CAAC;IACJ,CAAC;IAED,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,IAAI,CAAC;IACvF,CAAC;IAED,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,IAAI,IAAI,CAAC;IAC/F,CAAC;IAED,IAAW,UAAU;QACnB,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,UAAU;eACjB,CAAC,CAAC,IAAI,CAAC,kBAAkB;eACzB,CAAC,CAAC,IAAI,CAAC,qBAAqB;eAC5B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1C,CAAC;IAEM,gBAAgB;QACrB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACpC,CAAC;IAEM,sBAAsB,CAAC,MAA6B;QACzD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,iBAAiB;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,0EAA0E,EAC1E,OAAO,EAAE,IAAI,CACd,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;gBAC/C,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAe,CAAC;gBAC5C,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;gBAC1C,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,SAAS;gBACtD,uBAAuB,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,SAAS;gBACpE,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,eAAe;gBACzC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,MAAM;aACpB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,eAAe,GAAG;gBACrB,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBAC/D,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC7D,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACrD,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE;aAChF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,mBAAmB,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACjG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,0EAA0E,EAC1E,OAAO,EAAE,IAAI,CACd,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;gBAC/C,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAe,CAAC;gBAC5C,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;gBAC1C,YAAY,EAAE,IAAI,CAAC,gBAAiB,CAAC,IAAI;gBACzC,uBAAuB,EAAE,IAAI,CAAC,mBAAoB,CAAC,IAAI;gBACvD,IAAI,EAAE,IAAI,CAAC,WAAW;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,OAAO;aACrB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAClG,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACxD,MAAM,SAAS,GAAI,MAAM,CAAC,OAAmB,KAAK,IAAI,IAAI,MAAM,KAAK,CAAC,CAAC;YACvE,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAC/C,SAAS;gBACP,CAAC,CAAC,QAAQ,IAAI,cAAc,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE;gBACxE,CAAC,CAAC,qBAAqB,IAAI,UAAU,MAAM,YAAY,OAAO,UAAU,EAC1E,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACjC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CACxB,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,gBAAgB,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,YAAY;IACZ,oEAAoE;IAEpE;;;;OAIG;IACK,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC;gBAC9D;oBACE,UAAU,EAAE,6BAA6B;oBACzC,WAAW,EAAE,iBAAiB;oBAC9B,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;iBACrB;gBACD;oBACE,UAAU,EAAE,0CAA0C;oBACtD,WAAW,EAAE,iBAAiB;oBAC9B,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;iBACrB;aACF,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAoC,CAAC;YACnH,IAAI,CAAC,YAAY,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAA+C,CAAC;QACzI,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,mBAAmB,CAAC,wBAAwB,CAAC,4BAA4B,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1G,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,yBAAyB;QACrC,IAAI,IAAI,CAAC,sBAAsB;YAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC;QACpE,gEAAgE;QAChE,gEAAgE;QAChE,kEAAkE;QAClE,kDAAkD;QAClD,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC;QACzC,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QACzE,IAAI,CAAC,sBAAsB,GAAG,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC;QAChD,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,YAAY,CACxB,QAAgB,EAChB,MAA8B;QAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAA+C,CAAC;QACtE,MAAM,KAAK,GAAG;;;;;;;;;KASb,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAClE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ;SAC5B,CAAC,CAAC,CAAC;QACJ,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,CAAC;QAChG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,SAAS,CAAC,SAAS,CAAC;IAC7B,CAAC;IAEO,eAAe,CAAC,MAA+B;QACrD,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7C,kEAAkE;YAClE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAA4B,EAAE,CAAC;gBACxC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;oBAC1B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;wBAC1E,GAAG,CAAC,MAAM,CAAE,IAA0B,CAAC,IAAI,CAAC,CAAC,GAAI,IAA2B,CAAC,KAAK,CAAC;oBACrF,CAAC;gBACH,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;YACD,OAAO,MAAiC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,CAAU;QAC7B,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAC5E,OAAO,CAAC,CAAC;IACX,CAAC;IAEO,cAAc,CAAC,CAAiB;QACtC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;YAC3B,KAAK,MAAM,CAAC,CAAC,OAAO,WAAW,CAAC;YAChC,KAAK,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;QACpC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,KAAmB,IAAqB,OAAO,mBAAmB,CAAC,CAAC,CAAC;IAClG,KAAK,CAAC,oBAAoB,CAAC,KAAmB,IAAqB,OAAO,2BAA2B,CAAC,CAAC,CAAC;0HApS7F,gCAAgC;6DAAhC,gCAAgC;YArQrC,AADF,AADF,8BAAkC,aACP,aACE;YACvB,uBAAmC;YACnC,0BAAI;YAAA,iCAAiB;YACvB,AADuB,iBAAK,EACtB;YAEJ,AADF,8BAA4B,gBAIqC;YAD7D,6GAAS,uBAAmB,IAAC;YAI3B,AAFF,wFAA2B,kEAElB;YAGX,iBAAS;YACT,kCAG4D;YAD1D,8GAAS,YAAQ,IAAC;YAIhB,AAFF,0FAAiB,oEAER;YAKf,AADE,AADE,iBAAS,EACL,EACF;YAKF,AADF,AAFF,+BAAyB,cAEJ,cACS;YACxB,yBAAoC;YACpC,2BAAI;YAAA,wBAAO;YACb,AADa,iBAAK,EACZ;YACN,gCAAwB;YAGpB,AAFF,4GAAwB,qEAEf;YA4Cb,AADE,iBAAM,EACF;YAIJ,AADF,+BAAmB,cACS;YACxB,yBAAoC;YACpC,2BAAI;YAAA,yBAAQ;YACd,AADc,iBAAK,EACb;YAEJ,AADF,gCAAwB,qCAI4B;YAAhD,qJAAgB,kCAA8B,IAAC;YACjD,iBAA4B;YAE5B,0FAAsB;YAatB,sGAAuB;YAyB/B,AADE,AADE,AADE,iBAAM,EACF,EACF,EACF;;YA/HE,eAA4D;YAA5D,sFAA4D;YAC5D,cAIC;YAJD,iDAIC;YAKD,eAAyD;YAAzD,mFAAyD;YACzD,cAIC;YAJD,yCAIC;YAaD,eA4CC;YA5CD,gDA4CC;YAYC,eAAqB;YACrB,AADA,uCAAqB,8BACI;YAI3B,cAWC;YAXD,8CAWC;YAED,cAqBC;YArBD,+CAqBC;;;AAkIA,gCAAgC;IA5Q5C,aAAa,CAAC,qBAAqB,EAAE,kCAAkC,CAAC;GA4Q5D,gCAAgC,CAqS5C;;iFArSY,gCAAgC;cA3Q5C,SAAS;6BACI,KAAK,YACP,wCAAwC,YACxC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2IT;;kFA6HU,gCAAgC;AAuS7C,8BAA8B;AAC9B,MAAM,UAAU,oCAAoC,KAAI,CAAC","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport {\n ResourceData,\n MJCommunicationProviderEntity,\n MJCommunicationProviderMessageTypeEntity,\n} from '@memberjunction/core-entities';\nimport { RunView } from '@memberjunction/core';\nimport { ActionEngineBase } from '@memberjunction/actions-base';\nimport type { AudienceSource } from '@memberjunction/lists-base';\nimport type { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\n/**\n * \"New Communication\" — implements mockup 21. Composes an outbound\n * message against an `AudienceSource` (List / View / ad-hoc filter):\n *\n * - Channel = MJ Communication Provider + Provider Message Type\n * - Audience = picked via `<mj-audience-source-picker>`\n * - Field mapping = which entity field carries the recipient address\n *\n * Server work happens via two existing Actions (no new GraphQL endpoint\n * needed):\n *\n * - \"Resolve Audience\" — used by the \"Preview\" panel to show counts\n * (TotalAudienceSize / WillReceive / Skipped) before sending.\n * - \"Send To Audience\" — actually sends. Supports `PreviewOnly: true`\n * to re-resolve + report counts with field-mapping applied without\n * dispatching.\n *\n * Action invocation goes through the `RunAction` mutation (same path the\n * Action Test Harness uses).\n */\n\ninterface AudienceSummary {\n TotalAudienceSize: number;\n WillReceiveCount: number;\n SkippedCount: number;\n EntityName: string;\n}\n\n@RegisterClass(BaseResourceComponent, 'CommunicationsNewMessageResource')\n@Component({\n standalone: false,\n selector: 'mj-communications-new-message-resource',\n template: `\n <div class=\"new-message-resource\">\n <div class=\"page-header\">\n <div class=\"title-block\">\n <i class=\"fa-solid fa-message\"></i>\n <h2>New Communication</h2>\n </div>\n <div class=\"header-actions\">\n <button\n class=\"action-btn\"\n (click)=\"onPreviewAudience()\"\n [disabled]=\"!canPreview || isResolvingAudience || isSending\">\n @if (isResolvingAudience) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Previewing…\n } @else {\n <i class=\"fa-solid fa-eye\"></i> Preview Audience\n }\n </button>\n <button\n class=\"action-btn action-btn--primary\"\n (click)=\"onSend()\"\n [disabled]=\"!canSend || isResolvingAudience || isSending\">\n @if (isSending) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Sending…\n } @else {\n <i class=\"fa-solid fa-paper-plane\"></i> Send\n }\n </button>\n </div>\n </div>\n\n <div class=\"layout-grid\">\n <!-- Message panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <i class=\"fa-solid fa-envelope\"></i>\n <h3>Message</h3>\n </div>\n <div class=\"panel-body\">\n @if (loadingProviders) {\n <mj-loading text=\"Loading channels...\" size=\"small\"></mj-loading>\n } @else {\n <label class=\"field-label\">Channel</label>\n <select\n class=\"mj-input mj-select\"\n [(ngModel)]=\"selectedProviderID\"\n (ngModelChange)=\"onProviderChange()\">\n <option [ngValue]=\"null\">Select a channel…</option>\n @for (p of providers; track p.ID) {\n <option [ngValue]=\"p.ID\">{{ p.Name }}</option>\n }\n </select>\n\n @if (filteredMessageTypes.length > 0) {\n <label class=\"field-label\">Message type</label>\n <select class=\"mj-input mj-select\" [(ngModel)]=\"selectedMessageTypeID\">\n <option [ngValue]=\"null\">Select a message type…</option>\n @for (mt of filteredMessageTypes; track mt.ID) {\n <option [ngValue]=\"mt.ID\">{{ mt.Name }}</option>\n }\n </select>\n }\n\n <label class=\"field-label\">From</label>\n <input\n class=\"mj-input\"\n type=\"text\"\n [(ngModel)]=\"fromAddress\"\n placeholder=\"sender@example.com\" />\n\n <label class=\"field-label\">Subject</label>\n <input\n class=\"mj-input\"\n type=\"text\"\n [(ngModel)]=\"subject\"\n placeholder=\"Message subject\" />\n\n <label class=\"field-label\">Body</label>\n <textarea\n class=\"mj-input mj-textarea\"\n [(ngModel)]=\"body\"\n rows=\"10\"\n placeholder=\"Hi {{ '{{FirstName}}' }},...\"></textarea>\n }\n </div>\n </div>\n\n <!-- Audience panel -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <i class=\"fa-solid fa-bullseye\"></i>\n <h3>Audience</h3>\n </div>\n <div class=\"panel-body\">\n <mj-audience-source-picker\n [Provider]=\"Provider\"\n [Source]=\"audienceSource\"\n (SourceChange)=\"onAudienceSourceChange($event)\">\n </mj-audience-source-picker>\n\n @if (audienceSource) {\n <label class=\"field-label field-label--spaced\">Recipient field</label>\n <input\n class=\"mj-input\"\n type=\"text\"\n [(ngModel)]=\"recipientField\"\n placeholder=\"e.g. Email\" />\n <p class=\"field-hint\">\n Field on the audience entity that holds the recipient address.\n Records with no value will be skipped.\n </p>\n }\n\n @if (audienceSummary) {\n <div class=\"summary-block\" [class.summary-block--has-skips]=\"audienceSummary.SkippedCount > 0\">\n <div class=\"summary-row\">\n <span class=\"summary-label\">Total audience</span>\n <span class=\"summary-value\">{{ audienceSummary.TotalAudienceSize }}</span>\n </div>\n <div class=\"summary-row summary-row--will-receive\">\n <span class=\"summary-label\">Will receive</span>\n <span class=\"summary-value\">{{ audienceSummary.WillReceiveCount }}</span>\n </div>\n @if (audienceSummary.SkippedCount > 0) {\n <div class=\"summary-row summary-row--skipped\">\n <span class=\"summary-label\">Skipped (missing {{ recipientField || 'recipient' }})</span>\n <span class=\"summary-value\">{{ audienceSummary.SkippedCount }}</span>\n </div>\n }\n <div class=\"summary-row summary-row--entity\">\n <span class=\"summary-label\">Entity</span>\n <span class=\"summary-value\">{{ audienceSummary.EntityName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .new-message-resource {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 16px 24px;\n height: 100%;\n overflow: auto;\n }\n .page-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n }\n .title-block { display: flex; align-items: center; gap: 12px; }\n .title-block i { font-size: 20px; color: var(--mj-brand-primary); }\n .title-block h2 { margin: 0; font-size: 18px; font-weight: 600; color: var(--mj-text-primary); }\n .header-actions { display: flex; gap: 8px; }\n .action-btn {\n padding: 8px 14px;\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .action-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n }\n .action-btn:disabled { opacity: 0.55; cursor: not-allowed; }\n .action-btn--primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse, white);\n }\n .action-btn--primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n .layout-grid {\n display: grid;\n grid-template-columns: 1fr 380px;\n gap: 16px;\n align-items: start;\n }\n @media (max-width: 1024px) {\n .layout-grid { grid-template-columns: 1fr; }\n }\n\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n }\n .panel-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n }\n .panel-header i { color: var(--mj-text-secondary); }\n .panel-header h3 {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .panel-body { padding: 16px; }\n\n .field-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin: 12px 0 6px;\n text-transform: uppercase;\n letter-spacing: 0.4px;\n }\n .field-label--spaced { margin-top: 20px; }\n .field-hint {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin: 6px 0 0;\n }\n\n .summary-block {\n margin-top: 20px;\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n .summary-block--has-skips {\n border-color: var(--mj-status-warning);\n background: color-mix(in srgb, var(--mj-status-warning) 6%, var(--mj-bg-surface-card));\n }\n .summary-row {\n display: flex;\n justify-content: space-between;\n gap: 16px;\n font-size: 13px;\n padding: 4px 0;\n }\n .summary-row + .summary-row { border-top: 1px solid var(--mj-border-subtle); }\n .summary-label { color: var(--mj-text-secondary); }\n .summary-value { font-weight: 600; color: var(--mj-text-primary); }\n .summary-row--will-receive .summary-value { color: var(--mj-status-success); }\n .summary-row--skipped .summary-value { color: var(--mj-status-warning); }\n .summary-row--entity .summary-label,\n .summary-row--entity .summary-value {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n `],\n})\nexport class CommunicationsNewMessageResource extends BaseResourceComponent implements OnInit, OnDestroy {\n // BaseResourceComponent already exposes a protected `destroy$` Subject.\n // Don't re-declare it here — the import is kept only for the rxjs type.\n // (See base class comment.)\n // Local lifecycle goes through super.ngOnDestroy().\n\n // Channel state\n public loadingProviders = true;\n public providers: MJCommunicationProviderEntity[] = [];\n public messageTypes: MJCommunicationProviderMessageTypeEntity[] = [];\n public selectedProviderID: string | null = null;\n public selectedMessageTypeID: string | null = null;\n\n // Message state\n public fromAddress = '';\n public subject = '';\n public body = '';\n\n // Audience state\n public audienceSource: AudienceSource | null = null;\n public recipientField = '';\n public audienceSummary: AudienceSummary | null = null;\n\n // Action IDs — looked up lazily on first use to avoid an extra RunView\n // on every page open. Cached for the session.\n private resolveAudienceActionID: string | null = null;\n private sendToAudienceActionID: string | null = null;\n\n public isResolvingAudience = false;\n public isSending = false;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private notificationService: MJNotificationService,\n ) {\n super();\n }\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadChannelMetadata();\n this.NotifyLoadComplete();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n public get filteredMessageTypes(): MJCommunicationProviderMessageTypeEntity[] {\n if (!this.selectedProviderID) return [];\n return this.messageTypes.filter(\n (mt) => mt.CommunicationProviderID === this.selectedProviderID,\n );\n }\n\n public get selectedProvider(): MJCommunicationProviderEntity | null {\n return this.providers.find((p) => UUIDsEqual(p.ID, this.selectedProviderID)) ?? null;\n }\n\n public get selectedMessageType(): MJCommunicationProviderMessageTypeEntity | null {\n return this.messageTypes.find((mt) => UUIDsEqual(mt.ID, this.selectedMessageTypeID)) ?? null;\n }\n\n public get canPreview(): boolean {\n return !!this.audienceSource && this.recipientField.trim().length > 0;\n }\n\n public get canSend(): boolean {\n return this.canPreview\n && !!this.selectedProviderID\n && !!this.selectedMessageTypeID\n && this.fromAddress.trim().length > 0;\n }\n\n public onProviderChange(): void {\n this.selectedMessageTypeID = null;\n }\n\n public onAudienceSourceChange(source: AudienceSource | null): void {\n this.audienceSource = source;\n this.audienceSummary = null;\n }\n\n /**\n * Preview the audience without sending — calls \"Send To Audience\" with\n * PreviewOnly=true. Surfaces the same total/will-receive/skipped tile\n * mockup 21 shows. Cheaper than `Resolve Audience` for our purposes\n * because it also evaluates the recipient-field skip rule.\n */\n public async onPreviewAudience(): Promise<void> {\n if (!this.canPreview) return;\n this.isResolvingAudience = true;\n this.audienceSummary = null;\n this.cdr.detectChanges();\n try {\n const actionID = await this.getSendToAudienceActionID();\n if (!actionID) {\n this.notificationService.CreateSimpleNotification(\n \"Couldn't find the 'Send To Audience' action — make sure CodeGen has run.\",\n 'error', 5000,\n );\n return;\n }\n const result = await this.invokeAction(actionID, {\n Source: JSON.stringify(this.audienceSource!),\n RecipientField: this.recipientField.trim(),\n ProviderName: this.selectedProvider?.Name ?? 'Preview',\n ProviderMessageTypeName: this.selectedMessageType?.Name ?? 'Preview',\n From: this.fromAddress || 'preview@local',\n Subject: this.subject,\n Body: this.body,\n PreviewOnly: 'true',\n });\n\n const data = this.parseResultData(result);\n this.audienceSummary = {\n TotalAudienceSize: this.coerceNumber(data['TotalAudienceSize']),\n WillReceiveCount: this.coerceNumber(data['WillReceiveCount']),\n SkippedCount: this.coerceNumber(data['SkippedCount']),\n EntityName: this.audienceSource ? this.describeSource(this.audienceSource) : '',\n };\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Preview failed: ${message}`, 'error', 5000);\n } finally {\n this.isResolvingAudience = false;\n this.cdr.detectChanges();\n }\n }\n\n public async onSend(): Promise<void> {\n if (!this.canSend) return;\n this.isSending = true;\n this.cdr.detectChanges();\n try {\n const actionID = await this.getSendToAudienceActionID();\n if (!actionID) {\n this.notificationService.CreateSimpleNotification(\n \"Couldn't find the 'Send To Audience' action — make sure CodeGen has run.\",\n 'error', 5000,\n );\n return;\n }\n const result = await this.invokeAction(actionID, {\n Source: JSON.stringify(this.audienceSource!),\n RecipientField: this.recipientField.trim(),\n ProviderName: this.selectedProvider!.Name,\n ProviderMessageTypeName: this.selectedMessageType!.Name,\n From: this.fromAddress,\n Subject: this.subject,\n Body: this.body,\n PreviewOnly: 'false',\n });\n\n const data = this.parseResultData(result);\n const sent = this.coerceNumber(data['WillReceiveCount']) - this.coerceNumber(data['FailedCount']);\n const failed = this.coerceNumber(data['FailedCount']);\n const skipped = this.coerceNumber(data['SkippedCount']);\n const okOverall = (result.Success as boolean) === true && failed === 0;\n this.notificationService.CreateSimpleNotification(\n okOverall\n ? `Sent ${sent} message(s)${skipped > 0 ? ` (${skipped} skipped)` : ''}`\n : `Sent with errors: ${sent} sent, ${failed} failed, ${skipped} skipped`,\n okOverall ? 'success' : 'warning',\n okOverall ? 3000 : 7000,\n );\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Send failed: ${message}`, 'error', 5000);\n } finally {\n this.isSending = false;\n this.cdr.detectChanges();\n }\n }\n\n // -----------------------------------------------------------------\n // Internals\n // -----------------------------------------------------------------\n\n /**\n * One RunView pair on init: providers + their message types. Cached on\n * the component for the session — we don't go back to the DB on every\n * channel selection. Use RunViews (plural) so it's a single round trip.\n */\n private async loadChannelMetadata(): Promise<void> {\n this.loadingProviders = true;\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [providersResult, messageTypesResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Communication Providers',\n ExtraFilter: \"Status='Active'\",\n OrderBy: 'Name',\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: Communication Provider Message Types',\n ExtraFilter: \"Status='Active'\",\n OrderBy: 'Name',\n ResultType: 'simple',\n },\n ]);\n this.providers = (providersResult.Success ? providersResult.Results ?? [] : []) as MJCommunicationProviderEntity[];\n this.messageTypes = (messageTypesResult.Success ? messageTypesResult.Results ?? [] : []) as MJCommunicationProviderMessageTypeEntity[];\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.notificationService.CreateSimpleNotification(`Failed to load channels: ${message}`, 'error', 5000);\n } finally {\n this.loadingProviders = false;\n this.cdr.detectChanges();\n }\n }\n\n private async getSendToAudienceActionID(): Promise<string | null> {\n if (this.sendToAudienceActionID) return this.sendToAudienceActionID;\n // Read from the cached ActionEngineBase singleton rather than a\n // fresh RunView. Config() is idempotent — short-circuits if the\n // engine has already loaded — so calling it on every Preview/Send\n // is effectively free after the first invocation.\n const engine = ActionEngineBase.Instance;\n await engine.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse);\n const match = engine.Actions?.find((a) => a.Name === 'Send To Audience');\n this.sendToAudienceActionID = match?.ID ?? null;\n return this.sendToAudienceActionID;\n }\n\n /**\n * Invoke an Action via the RunAction GraphQL mutation. Same pattern as\n * the Action Test Harness — kept inline here so the resource component\n * stays self-contained.\n */\n private async invokeAction(\n actionID: string,\n params: Record<string, string>,\n ): Promise<{ Success: boolean; Message: string; ResultCode: string; ResultData?: string }> {\n const provider = this.ProviderToUse as unknown as GraphQLDataProvider;\n const query = `\n mutation RunAction($input: RunActionInput!) {\n RunAction(input: $input) {\n Success\n Message\n ResultCode\n ResultData\n }\n }\n `;\n const actionParams = Object.entries(params).map(([Name, Value]) => ({\n Name, Value, Type: 'string',\n }));\n const variables = { input: { ActionID: actionID, Params: actionParams, SkipActionLog: false } };\n const gqlResult = await provider.ExecuteGQL(query, variables);\n if (!gqlResult?.RunAction) {\n throw new Error('RunAction returned no result');\n }\n return gqlResult.RunAction;\n }\n\n private parseResultData(result: { ResultData?: string }): Record<string, unknown> {\n if (!result.ResultData) return {};\n try {\n const parsed = JSON.parse(result.ResultData);\n // RunAction returns either an object or an array of {Name,Value}.\n if (Array.isArray(parsed)) {\n const out: Record<string, unknown> = {};\n for (const item of parsed) {\n if (item && typeof item === 'object' && 'Name' in item && 'Value' in item) {\n out[String((item as { Name: unknown }).Name)] = (item as { Value: unknown }).Value;\n }\n }\n return out;\n }\n return parsed as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n private coerceNumber(v: unknown): number {\n if (typeof v === 'number') return v;\n if (typeof v === 'string') { const n = Number(v); return isNaN(n) ? 0 : n; }\n return 0;\n }\n\n private describeSource(s: AudienceSource): string {\n switch (s.kind) {\n case 'list': return 'List';\n case 'view': return 'User View';\n case 'adhoc': return s.entityName;\n }\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> { return 'New Communication'; }\n async GetResourceIconClass(_data: ResourceData): Promise<string> { return 'fa-solid fa-pen-to-square'; }\n}\n\n/** Tree-shaking prevention */\nexport function LoadCommunicationsNewMessageResource() {}\n"]}
|