@memberjunction/ng-dashboards 5.4.1 → 5.6.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 +4 -4
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +5 -4
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +3 -3
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- 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 +8 -7
- package/dist/AI/components/prompts/model-prompt-priority-matrix.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/system/system-configuration.component.js +4 -4
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +3 -2
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +4 -3
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +3 -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/Actions/components/execution-monitoring.component.js +2 -2
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +3 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +3 -2
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +2 -2
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts +6 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +19 -6
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts +4 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +13 -4
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -0
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +13 -9
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +11 -11
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +3 -3
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +13 -9
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +11 -11
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +4 -3
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +4 -3
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +11 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +140 -108
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +4 -1
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +9 -8
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +2 -2
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-application.js +2 -2
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +3 -3
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +1 -0
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +17 -14
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -2
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +1 -0
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +15 -12
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +3 -2
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +8 -7
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +22 -22
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +2 -0
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +14 -10
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +2 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +1 -0
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +22 -18
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +1 -0
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +14 -10
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +6 -6
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +2 -2
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/package.json +38 -38
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home-application.js","sourceRoot":"","sources":["../../src/Home/home-application.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAgE,MAAM,qCAAqC,CAAC;AAEpI,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,sEAAsE;AACtE,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAChD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAyB3C,+CAA+C;AAC/C,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpD;;;;;;;;;;;;;;;;;GAiBG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,eAAe;;IAC1C,MAAM,CAAU,gBAAgB,GAAG,CAAC,CAAC;IAErC,gBAAgB,GAAiC,IAAI,CAAC;IACtD,aAAa,GAAyB,IAAI,CAAC;IAC3C,iBAAiB,GAA6B,EAAE,CAAC;IACjD,mBAAmB,GAAyB,IAAI,CAAC;IAEzD;;;;;;OAMG;IACK,uBAAuB,GAAkB,IAAI,CAAC;IAEtD;;;OAGG;IACI,mBAAmB,CAAC,OAA8B;QACvD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,OAAsB;QAC5C,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACM,KAAK,CAAC,WAAW;QACxB,8DAA8D;QAC9D,iEAAiE;QACjE,qEAAqE;QACrE,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,mBAAmB,CAAC;QACjC,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;QAE9C,sDAAsD;QACtD,6FAA6F;QAC7F,8FAA8F;QAC9F,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,yCAAyC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACjD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACI,oBAAoB,CAAC,IAAa;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,CAC1C,CAAC;QACF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,IAAa;QACzC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;QACxD,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,SAAS,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACxC,IAAI,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;IAClB,2CAA2C;IAE3C;;;OAGG;IACK,WAAW,CAAC,UAA8B,EAAE,gBAAwB;QAC1E,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;YACrD,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;YAC7E,IAAI,YAAY,EAAE,IAAI,EAAE,CAAC;gBACvB,OAAO,YAAY,CAAC,IAAI,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,2CAA2C;IAC3C,0BAA0B;IAC1B,2CAA2C;IAE3C;;;;;;OAMG;IACK,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;QACxD,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,aAAa,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,2EAA2E;QAC3E,wEAAwE;QACxE,MAAM,WAAW,GAAG,GAAG,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,gBAAgB,IAAI,EAAE,EAAE,CAAC;QAC3E,IAAI,WAAW,KAAK,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,uBAAuB,GAAG,WAAW,CAAC;QAE3C,sDAAsD;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,6EAA6E;YAC7E,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,qEAAqE;QACrE,yDAAyD;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAChD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,QAAQ,CAAC,gBAAgB,CACtD,CAAC;QACF,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,iBAAe,CAAC,gBAAgB,EAAE,CAAC;YACrE,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,iBAAe,CAAC,gBAAgB,CAAC;QACnE,CAAC;QAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,sBAAsB,CAAC,GAAiB;QACpD,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,cAAc,CAAuB,CAAC;QAC/E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,+EAA+E;QAC/E,IAAI,YAAY,CAAC,WAAW,EAAE,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yDAAyD;QACzD,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAuB,CAAC;QACvE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAEjG,OAAO;YACL,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,YAAY;YACZ,UAAU;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,aAAa;YACb,aAAa,EAAE,GAAG,CAAC,aAAwC;YAC3D,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAAC,GAAiB;QAClD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9C,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;gBAChF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,2BAA2B;IAC3B,2CAA2C;IAE3C;;;OAGG;IACK,oBAAoB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,QAAgC;QAC3D,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,aAAa;YAC7B,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC;YAClE,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB;YACnC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,CAAC,GAAY,EAAE,EAAE;gBAC9B,MAAM,KAAK,GAAG,GAAmB,CAAC;gBAClC,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;oBAC9B,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,CAAC,gBAAgB,CAAC;gBAC9D,CAAC;gBACD,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,CAAC;YACrC,CAAC;SACF,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,mBAAmB;IACnB,2CAA2C;IAE3C;;;;;;;;;;OAUG;IACK,KAAK,CAAC,kBAAkB,CAAC,UAA8B,EAAE,WAA+B,EAAE,QAAgB;QAChH,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;YAChC,OAAO,QAAQ,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,4CAA4C;QAC5C,MAAM,YAAY,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAChD,YAAY,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAElE,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YAC/F,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,UAAU,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;QAED,uGAAuG;QACvG,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,QAAQ,CAAC;IACvE,CAAC;IAED;;;;;;;;OAQG;IACK,kBAAkB,CAAC,UAAkB,EAAE,GAAiB;QAC9D,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,GAAG,UAAU,SAAS,CAAC;QAChC,CAAC;QAED,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,CAAC;QAED,2DAA2D;QAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChF,OAAO,GAAG,UAAU,KAAK,MAAM,EAAE,CAAC;IACpC,CAAC;IAED;;;OAGG;IACK,SAAS,CAAC,KAAa,EAAE,YAAoB,CAAC;QACpD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IACjD,CAAC;IAED,2CAA2C;IAC3C,sBAAsB;IACtB,2CAA2C;IAE3C;;;OAGG;IACK,kBAAkB;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,6EAA6E;YAC7E,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpD,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;gBACpC,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC,CAAC;YAEJ,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACxF,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;YAClE,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC;YAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,6BAA6B;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,iBAAiB,GAAG,MAAM;iBAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,mBAAmB,CAAC;iBAC3F,KAAK,CAAC,CAAC,EAAE,iBAAe,CAAC,gBAAgB,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;;AAvbU,eAAe;IAD3B,aAAa,CAAC,eAAe,EAAE,iBAAiB,CAAC;GACrC,eAAe,CAwb3B","sourcesContent":["import { RegisterClass } from '@memberjunction/global';\nimport { BaseApplication, DynamicNavItem, NavItem, WorkspaceStateManager, WorkspaceTab } from '@memberjunction/ng-base-application';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, CompositeKey, FieldValueCollection } from '@memberjunction/core';\n\n/** Storage key and category for persisting the recent orphan stack */\nconst STORAGE_KEY = 'HomeApp_RecentOrphanStack';\nconst STORAGE_CATEGORY = 'HomeApplication';\n\n/**\n * Snapshot of an orphan resource tab for the recent navigation stack.\n * Persisted to localStorage (via Provider) so it survives page reloads.\n */\ninterface OrphanResourceSnapshot {\n /** URL-encoded composite key segment — primary dedup key */\n resourceRecordId: string;\n /** Resource type name (e.g., 'record', 'Dashboards') */\n resourceType: string;\n /** Entity name from tab configuration (for record name resolution) */\n entityName?: string;\n /** Tab title at time of capture (fallback label) */\n title: string;\n /** Resolved display label (cached record name). Persisted to avoid async lookups on reload. */\n resolvedLabel: string;\n /** Full tab configuration (passed to DynamicNavItem for re-opening) */\n configuration: Record<string, unknown>;\n /** Tab ID for fallback matching when no resourceRecordId */\n tabId: string;\n /** Timestamp (ms since epoch) when this snapshot was created or last promoted */\n timestamp: number;\n}\n\n/** Max age for persisted snapshots — 7 days */\nconst MAX_SNAPSHOT_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n/**\n * Home Application - Provides dynamic navigation items for orphan resources.\n *\n * Maintains a recency-ordered stack of up to 3 recently visited orphan resources.\n * When the user opens a record/view/dashboard from within the Home app, the resource\n * appears as a dynamic nav item. When they navigate away (e.g., click Home), the\n * nav item persists so they can quickly jump back. Older items drop off as new ones\n * are added.\n *\n * The stack is persisted to localStorage (via Metadata.Provider.LocalStorageProvider)\n * so it survives page reloads. Resolved record labels are stored alongside each\n * snapshot to avoid async lookups when restoring from storage.\n *\n * @example\n * User opens \"John Smith\" contact, then \"Acme Corp\" company:\n * - Nav shows: [Home] [Favorites] | [person] \"Acme Corp\" [building] \"John Smith\"\n * - Clicking \"John Smith\" re-opens that record\n */\n@RegisterClass(BaseApplication, 'HomeApplication')\nexport class HomeApplication extends BaseApplication {\n private static readonly MAX_RECENT_ITEMS = 3;\n\n private workspaceManager: WorkspaceStateManager | null = null;\n private sharedService: SharedService | null = null;\n private recentOrphanStack: OrphanResourceSnapshot[] = [];\n private _storageLoadPromise: Promise<void> | null = null;\n\n /**\n * Fingerprint of the last-processed active tab state (tabId::resourceRecordId).\n * Guards against redundant stack mutations while still detecting content changes.\n * In single-resource mode the tab ID stays constant when navigating between records\n * (OpenTab replaces the temp tab's content but keeps its ID), so we must also\n * include the resourceRecordId to detect when the tab shows a different record.\n */\n private _lastSeenTabFingerprint: string | null = null;\n\n /**\n * Inject WorkspaceStateManager for accessing current tab state.\n * Also triggers loading the persisted stack from storage on first call.\n */\n public SetWorkspaceManager(manager: WorkspaceStateManager): void {\n this.workspaceManager = manager;\n if (!this._storageLoadPromise) {\n this._storageLoadPromise = this.loadStackFromStorage();\n }\n }\n\n /**\n * Inject SharedService for accessing ResourceTypes metadata\n */\n public SetSharedService(service: SharedService): void {\n this.sharedService = service;\n }\n\n /**\n * Returns navigation items including dynamic items for recently visited orphan resources.\n * Static items come from DefaultNavItems in metadata.\n * Dynamic items are generated from the recent orphan stack (up to 3).\n */\n override async GetNavItems(): Promise<NavItem[]> {\n // Ensure persisted stack is loaded before building nav items.\n // On first call after page load, this awaits the IndexedDB read;\n // on subsequent calls the promise is already resolved (no-op await).\n if (this._storageLoadPromise) {\n await this._storageLoadPromise;\n }\n\n const staticItems = await super.GetNavItems();\n\n // Update the recent stack based on current active tab\n // Must await — updateRecentStack is async (calls matchesStaticNavItem → super.GetNavItems())\n // and buildDynamicNavItems reads recentOrphanStack, so the stack must be fully updated first.\n await this.updateRecentStack();\n\n // Build dynamic nav items from the stack\n const dynamicItems = this.buildDynamicNavItems();\n if (dynamicItems.length > 0) {\n return [...staticItems, ...dynamicItems];\n }\n\n return staticItems;\n }\n\n /**\n * Removes a dynamic nav item from the recent stack by RecordID.\n * Called by AppNavComponent when the user clicks the dismiss X button.\n * If the dismissed item is currently active, navigates back to the app's default tab.\n */\n public RemoveDynamicNavItem(item: NavItem): void {\n const index = this.recentOrphanStack.findIndex(\n s => s.resourceRecordId === item.RecordID\n );\n if (index < 0) {\n return;\n }\n\n const wasActive = this.isDismissedItemActive(item);\n this.recentOrphanStack.splice(index, 1);\n this.saveStackToStorage();\n\n if (wasActive) {\n this.navigateToDefault();\n }\n }\n\n /**\n * Checks whether the dismissed nav item matches the currently active tab.\n */\n private isDismissedItemActive(item: NavItem): boolean {\n if (!this.workspaceManager) {\n return false;\n }\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.activeTabId) {\n return false;\n }\n const activeTab = config.tabs.find(t => t.id === config.activeTabId);\n if (!activeTab) {\n return false;\n }\n return activeTab.resourceRecordId === item.RecordID;\n }\n\n /**\n * Navigates back to the app's default tab (first static nav item / Home dashboard).\n */\n private navigateToDefault(): void {\n if (!this.workspaceManager) {\n return;\n }\n this.CreateDefaultTab().then(tabRequest => {\n if (tabRequest && this.workspaceManager) {\n this.workspaceManager.OpenTab(tabRequest, this.GetColor());\n }\n });\n }\n\n // ========================================\n // Icon Resolution\n // ========================================\n\n /**\n * Resolves the best icon for a dynamic nav item.\n * Priority: entity-specific icon from metadata → resource type icon → generic fallback.\n */\n private resolveIcon(entityName: string | undefined, resourceTypeName: string): string {\n if (entityName) {\n const md = new Metadata();\n const entityIcon = md.EntityByName(entityName)?.Icon;\n if (entityIcon) {\n return entityIcon;\n }\n }\n\n if (this.sharedService) {\n const resourceType = this.sharedService.ResourceTypeByName(resourceTypeName);\n if (resourceType?.Icon) {\n return resourceType.Icon;\n }\n }\n\n return 'fa-solid fa-file';\n }\n\n // ========================================\n // Recent Stack Management\n // ========================================\n\n /**\n * Updates the recent orphan stack based on the currently active tab.\n * If the active tab is a new orphan resource (not already in the stack and not\n * matching any static nav item), it gets added to the front. Items already in the\n * stack keep their position to avoid visually jarring reordering when users click\n * between existing dynamic nav items.\n */\n private async updateRecentStack(): Promise<void> {\n if (!this.workspaceManager) {\n return;\n }\n\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.activeTabId) {\n return;\n }\n\n const activeTab = config.tabs.find(t => t.id === config.activeTabId);\n if (!activeTab || activeTab.applicationId !== this.ID) {\n return;\n }\n\n // Build a fingerprint from tab ID + record content. In single-resource mode,\n // OpenTab replaces the temp tab's content but keeps the same tab ID, so we\n // need the resourceRecordId to detect when a different record is shown.\n const fingerprint = `${activeTab.id}::${activeTab.resourceRecordId ?? ''}`;\n if (fingerprint === this._lastSeenTabFingerprint) {\n return;\n }\n this._lastSeenTabFingerprint = fingerprint;\n\n // Check if active tab qualifies as an orphan resource\n const snapshot = await this.createSnapshotIfOrphan(activeTab);\n if (!snapshot) {\n // Active tab is a static resource (Home dashboard, etc.) — leave stack as-is\n return;\n }\n\n // If this item is already in the stack, leave the order unchanged.\n // Reordering on every click is visually jarring — items shift around\n // while the user is clicking between existing nav items.\n const alreadyTracked = this.recentOrphanStack.some(\n s => s.resourceRecordId === snapshot.resourceRecordId\n );\n if (alreadyTracked) {\n return;\n }\n\n // New orphan — push to front (most recent first) and trim oldest if needed\n this.recentOrphanStack.unshift(snapshot);\n if (this.recentOrphanStack.length > HomeApplication.MAX_RECENT_ITEMS) {\n this.recentOrphanStack.length = HomeApplication.MAX_RECENT_ITEMS;\n }\n\n this.saveStackToStorage();\n }\n\n /**\n * Creates an OrphanResourceSnapshot from a tab if it qualifies as an orphan resource.\n * Returns null if the tab is a static nav item, has no resource type, or is an\n * app-level custom dashboard (no record ID).\n */\n private async createSnapshotIfOrphan(tab: WorkspaceTab): Promise<OrphanResourceSnapshot | null> {\n const resourceType = tab.configuration?.['resourceType'] as string | undefined;\n if (!resourceType) {\n return null;\n }\n\n // Skip 'custom' resource type without a specific record (app-level dashboards)\n if (resourceType.toLowerCase() === 'custom' && !tab.resourceRecordId) {\n return null;\n }\n\n // Skip if it matches a static nav item\n if (await this.matchesStaticNavItem(tab)) {\n return null;\n }\n\n // Resolve the label now so it's stored with the snapshot\n const entityName = tab.configuration?.['Entity'] as string | undefined;\n const resolvedLabel = await this.resolveRecordLabel(entityName, tab.resourceRecordId, tab.title);\n\n return {\n resourceRecordId: tab.resourceRecordId,\n resourceType,\n entityName,\n title: tab.title,\n resolvedLabel,\n configuration: tab.configuration as Record<string, unknown>,\n tabId: tab.id,\n timestamp: Date.now()\n };\n }\n\n /**\n * Checks whether a tab matches any static nav item (by label, route, or driver class).\n */\n private async matchesStaticNavItem(tab: WorkspaceTab): Promise<boolean> {\n const staticItems = await super.GetNavItems();\n return staticItems.some(item => {\n if (item.Label === tab.title) {\n return true;\n }\n if (item.Route && tab.configuration?.['route'] === item.Route) {\n return true;\n }\n if (item.DriverClass && tab.configuration?.['driverClass'] === item.DriverClass) {\n return true;\n }\n return false;\n });\n }\n\n // ========================================\n // Dynamic NavItem Building\n // ========================================\n\n /**\n * Creates DynamicNavItem entries for each item in the recent orphan stack.\n * Uses the pre-resolved label from the snapshot (no async needed).\n */\n private buildDynamicNavItems(): DynamicNavItem[] {\n return this.recentOrphanStack.map(snapshot => this.createDynamicNavItem(snapshot));\n }\n\n /**\n * Creates a single DynamicNavItem from an OrphanResourceSnapshot.\n * Uses the snapshot's resolvedLabel directly — no async lookup needed.\n */\n private createDynamicNavItem(snapshot: OrphanResourceSnapshot): DynamicNavItem {\n return {\n Label: snapshot.resolvedLabel,\n Icon: this.resolveIcon(snapshot.entityName, snapshot.resourceType),\n ResourceType: snapshot.resourceType,\n RecordID: snapshot.resourceRecordId,\n Configuration: snapshot.configuration,\n isDynamic: true,\n isActiveMatch: (tab: unknown) => {\n const wsTab = tab as WorkspaceTab;\n if (snapshot.resourceRecordId) {\n return wsTab.resourceRecordId === snapshot.resourceRecordId;\n }\n return wsTab.id === snapshot.tabId;\n }\n };\n }\n\n // ========================================\n // Label Resolution\n // ========================================\n\n /**\n * Resolves the best available display label for an entity record nav item.\n * Priority order:\n * 1. Cached record name (from EntityRecordNameCache, populated by entity Load/Save)\n * 2. Tab title (whatever the workspace assigned when the tab was opened)\n * 3. Generated default (entity name + truncated primary key values)\n *\n * @param entityName - Entity name from tab configuration, may be undefined for non-entity resources\n * @param tabRecordId - URL-encoded composite key segment (e.g. \"ID|abc-123\" or \"Field1|val1||Field2|val2\")\n * @param tabTitle - Fallback title assigned by the workspace when the tab was opened\n */\n private async resolveRecordLabel(entityName: string | undefined, tabRecordId: string | undefined, tabTitle: string): Promise<string> {\n if (!entityName || !tabRecordId) {\n return tabTitle || '';\n }\n\n // Parse the URL segment into a CompositeKey\n const fvCollection = new FieldValueCollection();\n fvCollection.SimpleLoadFromURLSegment(tabRecordId);\n const compositeKey = new CompositeKey(fvCollection.KeyValuePairs);\n\n // Check the cache first\n try {\n const cachedName = await Metadata.Provider.GetCachedRecordName(entityName, compositeKey, true);\n if (cachedName) {\n return cachedName;\n }\n } catch (error) {\n console.warn('Failed to look up cached record name:', error);\n }\n\n // Fall back generated default from the key values, then tabTitle if we have no default label(unlikely)\n return this.createDefaultLabel(entityName, compositeKey) || tabTitle;\n }\n\n /**\n * Generates a fallback label when no cached record name or tab title is available.\n * Format: \"EntityName: <truncated key value(s)>\"\n *\n * @example\n * // Single key: \"Contacts: abc1234...\"\n * // Multi key: \"Order Details: abc1..., 42\"\n * // No key: \"Contacts record\"\n */\n private createDefaultLabel(entityName: string, key: CompositeKey): string {\n if (!key || key.KeyValuePairs.length === 0) {\n return `${entityName} record`;\n }\n\n if (key.KeyValuePairs.length === 1) {\n return `${entityName}: ${this.trimValue(key.KeyValuePairs[0].Value)}`;\n }\n\n // Multiple keys - show each value trimmed, comma-separated\n const values = key.KeyValuePairs.map(kv => this.trimValue(kv.Value)).join(', ');\n return `${entityName}: ${values}`;\n }\n\n /**\n * Truncates a primary key value for display, appending \"...\" if it exceeds maxLength.\n * Returns the value as-is if it's short enough or empty.\n */\n private trimValue(value: string, maxLength: number = 8): string {\n if (!value || value.trim().length === 0) {\n return value;\n }\n\n const trimmed = value.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n\n return trimmed.substring(0, maxLength) + '...';\n }\n\n // ========================================\n // Storage Persistence\n // ========================================\n\n /**\n * Persists the current recentOrphanStack to localStorage via Provider.\n * Fire-and-forget — errors are logged but don't affect the UX.\n */\n private saveStackToStorage(): void {\n try {\n const provider = Metadata.Provider.LocalStorageProvider;\n if (!provider) {\n return;\n }\n\n // Strip non-serializable fields (isActiveMatch closures are rebuilt on load)\n const serializable = this.recentOrphanStack.map(s => ({\n resourceRecordId: s.resourceRecordId,\n resourceType: s.resourceType,\n entityName: s.entityName,\n title: s.title,\n resolvedLabel: s.resolvedLabel,\n configuration: s.configuration,\n tabId: s.tabId,\n timestamp: s.timestamp\n }));\n\n provider.SetItem(STORAGE_KEY, JSON.stringify(serializable), STORAGE_CATEGORY).catch(err => {\n console.warn('Failed to persist recent nav stack:', err);\n });\n } catch (err) {\n console.warn('Failed to persist recent nav stack:', err);\n }\n }\n\n /**\n * Loads the recent orphan stack from localStorage via Provider.\n * Filters out stale entries (older than MAX_SNAPSHOT_AGE_MS).\n */\n private async loadStackFromStorage(): Promise<void> {\n try {\n const provider = Metadata.Provider.LocalStorageProvider;\n if (!provider) {\n return;\n }\n\n const raw = await provider.GetItem(STORAGE_KEY, STORAGE_CATEGORY);\n if (!raw) {\n return;\n }\n\n const parsed = JSON.parse(raw) as OrphanResourceSnapshot[];\n if (!Array.isArray(parsed)) {\n return;\n }\n\n // Filter out stale snapshots\n const now = Date.now();\n this.recentOrphanStack = parsed\n .filter(s => s.resourceRecordId && s.timestamp && (now - s.timestamp) < MAX_SNAPSHOT_AGE_MS)\n .slice(0, HomeApplication.MAX_RECENT_ITEMS);\n } catch (err) {\n console.warn('Failed to load recent nav stack from storage:', err);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"home-application.js","sourceRoot":"","sources":["../../src/Home/home-application.ts"],"names":[],"mappings":"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","sourcesContent":["import { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseApplication, DynamicNavItem, NavItem, WorkspaceStateManager, WorkspaceTab } from '@memberjunction/ng-base-application';\nimport { SharedService } from '@memberjunction/ng-shared';\nimport { Metadata, CompositeKey, FieldValueCollection } from '@memberjunction/core';\n\n/** Storage key and category for persisting the recent orphan stack */\nconst STORAGE_KEY = 'HomeApp_RecentOrphanStack';\nconst STORAGE_CATEGORY = 'HomeApplication';\n\n/**\n * Snapshot of an orphan resource tab for the recent navigation stack.\n * Persisted to localStorage (via Provider) so it survives page reloads.\n */\ninterface OrphanResourceSnapshot {\n /** URL-encoded composite key segment — primary dedup key */\n resourceRecordId: string;\n /** Resource type name (e.g., 'record', 'Dashboards') */\n resourceType: string;\n /** Entity name from tab configuration (for record name resolution) */\n entityName?: string;\n /** Tab title at time of capture (fallback label) */\n title: string;\n /** Resolved display label (cached record name). Persisted to avoid async lookups on reload. */\n resolvedLabel: string;\n /** Full tab configuration (passed to DynamicNavItem for re-opening) */\n configuration: Record<string, unknown>;\n /** Tab ID for fallback matching when no resourceRecordId */\n tabId: string;\n /** Timestamp (ms since epoch) when this snapshot was created or last promoted */\n timestamp: number;\n}\n\n/** Max age for persisted snapshots — 7 days */\nconst MAX_SNAPSHOT_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n/**\n * Home Application - Provides dynamic navigation items for orphan resources.\n *\n * Maintains a recency-ordered stack of up to 3 recently visited orphan resources.\n * When the user opens a record/view/dashboard from within the Home app, the resource\n * appears as a dynamic nav item. When they navigate away (e.g., click Home), the\n * nav item persists so they can quickly jump back. Older items drop off as new ones\n * are added.\n *\n * The stack is persisted to localStorage (via Metadata.Provider.LocalStorageProvider)\n * so it survives page reloads. Resolved record labels are stored alongside each\n * snapshot to avoid async lookups when restoring from storage.\n *\n * @example\n * User opens \"John Smith\" contact, then \"Acme Corp\" company:\n * - Nav shows: [Home] [Favorites] | [person] \"Acme Corp\" [building] \"John Smith\"\n * - Clicking \"John Smith\" re-opens that record\n */\n@RegisterClass(BaseApplication, 'HomeApplication')\nexport class HomeApplication extends BaseApplication {\n private static readonly MAX_RECENT_ITEMS = 3;\n\n private workspaceManager: WorkspaceStateManager | null = null;\n private sharedService: SharedService | null = null;\n private recentOrphanStack: OrphanResourceSnapshot[] = [];\n private _storageLoadPromise: Promise<void> | null = null;\n\n /**\n * Fingerprint of the last-processed active tab state (tabId::resourceRecordId).\n * Guards against redundant stack mutations while still detecting content changes.\n * In single-resource mode the tab ID stays constant when navigating between records\n * (OpenTab replaces the temp tab's content but keeps its ID), so we must also\n * include the resourceRecordId to detect when the tab shows a different record.\n */\n private _lastSeenTabFingerprint: string | null = null;\n\n /**\n * Inject WorkspaceStateManager for accessing current tab state.\n * Also triggers loading the persisted stack from storage on first call.\n */\n public SetWorkspaceManager(manager: WorkspaceStateManager): void {\n this.workspaceManager = manager;\n if (!this._storageLoadPromise) {\n this._storageLoadPromise = this.loadStackFromStorage();\n }\n }\n\n /**\n * Inject SharedService for accessing ResourceTypes metadata\n */\n public SetSharedService(service: SharedService): void {\n this.sharedService = service;\n }\n\n /**\n * Returns navigation items including dynamic items for recently visited orphan resources.\n * Static items come from DefaultNavItems in metadata.\n * Dynamic items are generated from the recent orphan stack (up to 3).\n */\n override async GetNavItems(): Promise<NavItem[]> {\n // Ensure persisted stack is loaded before building nav items.\n // On first call after page load, this awaits the IndexedDB read;\n // on subsequent calls the promise is already resolved (no-op await).\n if (this._storageLoadPromise) {\n await this._storageLoadPromise;\n }\n\n const staticItems = await super.GetNavItems();\n\n // Update the recent stack based on current active tab\n // Must await — updateRecentStack is async (calls matchesStaticNavItem → super.GetNavItems())\n // and buildDynamicNavItems reads recentOrphanStack, so the stack must be fully updated first.\n await this.updateRecentStack();\n\n // Build dynamic nav items from the stack\n const dynamicItems = this.buildDynamicNavItems();\n if (dynamicItems.length > 0) {\n return [...staticItems, ...dynamicItems];\n }\n\n return staticItems;\n }\n\n /**\n * Removes a dynamic nav item from the recent stack by RecordID.\n * Called by AppNavComponent when the user clicks the dismiss X button.\n * If the dismissed item is currently active, navigates back to the app's default tab.\n */\n public RemoveDynamicNavItem(item: NavItem): void {\n const index = this.recentOrphanStack.findIndex(\n s => s.resourceRecordId === item.RecordID\n );\n if (index < 0) {\n return;\n }\n\n const wasActive = this.isDismissedItemActive(item);\n this.recentOrphanStack.splice(index, 1);\n this.saveStackToStorage();\n\n if (wasActive) {\n this.navigateToDefault();\n }\n }\n\n /**\n * Checks whether the dismissed nav item matches the currently active tab.\n */\n private isDismissedItemActive(item: NavItem): boolean {\n if (!this.workspaceManager) {\n return false;\n }\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.activeTabId) {\n return false;\n }\n const activeTab = config.tabs.find(t => t.id === config.activeTabId);\n if (!activeTab) {\n return false;\n }\n return activeTab.resourceRecordId === item.RecordID;\n }\n\n /**\n * Navigates back to the app's default tab (first static nav item / Home dashboard).\n */\n private navigateToDefault(): void {\n if (!this.workspaceManager) {\n return;\n }\n this.CreateDefaultTab().then(tabRequest => {\n if (tabRequest && this.workspaceManager) {\n this.workspaceManager.OpenTab(tabRequest, this.GetColor());\n }\n });\n }\n\n // ========================================\n // Icon Resolution\n // ========================================\n\n /**\n * Resolves the best icon for a dynamic nav item.\n * Priority: entity-specific icon from metadata → resource type icon → generic fallback.\n */\n private resolveIcon(entityName: string | undefined, resourceTypeName: string): string {\n if (entityName) {\n const md = new Metadata();\n const entityIcon = md.EntityByName(entityName)?.Icon;\n if (entityIcon) {\n return entityIcon;\n }\n }\n\n if (this.sharedService) {\n const resourceType = this.sharedService.ResourceTypeByName(resourceTypeName);\n if (resourceType?.Icon) {\n return resourceType.Icon;\n }\n }\n\n return 'fa-solid fa-file';\n }\n\n // ========================================\n // Recent Stack Management\n // ========================================\n\n /**\n * Updates the recent orphan stack based on the currently active tab.\n * If the active tab is a new orphan resource (not already in the stack and not\n * matching any static nav item), it gets added to the front. Items already in the\n * stack keep their position to avoid visually jarring reordering when users click\n * between existing dynamic nav items.\n */\n private async updateRecentStack(): Promise<void> {\n if (!this.workspaceManager) {\n return;\n }\n\n const config = this.workspaceManager.GetConfiguration();\n if (!config?.activeTabId) {\n return;\n }\n\n const activeTab = config.tabs.find(t => t.id === config.activeTabId);\n if (!activeTab || !UUIDsEqual(activeTab.applicationId, this.ID)) {\n return;\n }\n\n // Build a fingerprint from tab ID + record content. In single-resource mode,\n // OpenTab replaces the temp tab's content but keeps the same tab ID, so we\n // need the resourceRecordId to detect when a different record is shown.\n const fingerprint = `${activeTab.id}::${activeTab.resourceRecordId ?? ''}`;\n if (fingerprint === this._lastSeenTabFingerprint) {\n return;\n }\n this._lastSeenTabFingerprint = fingerprint;\n\n // Check if active tab qualifies as an orphan resource\n const snapshot = await this.createSnapshotIfOrphan(activeTab);\n if (!snapshot) {\n // Active tab is a static resource (Home dashboard, etc.) — leave stack as-is\n return;\n }\n\n // If this item is already in the stack, leave the order unchanged.\n // Reordering on every click is visually jarring — items shift around\n // while the user is clicking between existing nav items.\n const alreadyTracked = this.recentOrphanStack.some(\n s => s.resourceRecordId === snapshot.resourceRecordId\n );\n if (alreadyTracked) {\n return;\n }\n\n // New orphan — push to front (most recent first) and trim oldest if needed\n this.recentOrphanStack.unshift(snapshot);\n if (this.recentOrphanStack.length > HomeApplication.MAX_RECENT_ITEMS) {\n this.recentOrphanStack.length = HomeApplication.MAX_RECENT_ITEMS;\n }\n\n this.saveStackToStorage();\n }\n\n /**\n * Creates an OrphanResourceSnapshot from a tab if it qualifies as an orphan resource.\n * Returns null if the tab is a static nav item, has no resource type, or is an\n * app-level custom dashboard (no record ID).\n */\n private async createSnapshotIfOrphan(tab: WorkspaceTab): Promise<OrphanResourceSnapshot | null> {\n const resourceType = tab.configuration?.['resourceType'] as string | undefined;\n if (!resourceType) {\n return null;\n }\n\n // Skip 'custom' resource type without a specific record (app-level dashboards)\n if (resourceType.toLowerCase() === 'custom' && !tab.resourceRecordId) {\n return null;\n }\n\n // Skip if it matches a static nav item\n if (await this.matchesStaticNavItem(tab)) {\n return null;\n }\n\n // Resolve the label now so it's stored with the snapshot\n const entityName = tab.configuration?.['Entity'] as string | undefined;\n const resolvedLabel = await this.resolveRecordLabel(entityName, tab.resourceRecordId, tab.title);\n\n return {\n resourceRecordId: tab.resourceRecordId,\n resourceType,\n entityName,\n title: tab.title,\n resolvedLabel,\n configuration: tab.configuration as Record<string, unknown>,\n tabId: tab.id,\n timestamp: Date.now()\n };\n }\n\n /**\n * Checks whether a tab matches any static nav item (by label, route, or driver class).\n */\n private async matchesStaticNavItem(tab: WorkspaceTab): Promise<boolean> {\n const staticItems = await super.GetNavItems();\n return staticItems.some(item => {\n if (item.Label === tab.title) {\n return true;\n }\n if (item.Route && tab.configuration?.['route'] === item.Route) {\n return true;\n }\n if (item.DriverClass && tab.configuration?.['driverClass'] === item.DriverClass) {\n return true;\n }\n return false;\n });\n }\n\n // ========================================\n // Dynamic NavItem Building\n // ========================================\n\n /**\n * Creates DynamicNavItem entries for each item in the recent orphan stack.\n * Uses the pre-resolved label from the snapshot (no async needed).\n */\n private buildDynamicNavItems(): DynamicNavItem[] {\n return this.recentOrphanStack.map(snapshot => this.createDynamicNavItem(snapshot));\n }\n\n /**\n * Creates a single DynamicNavItem from an OrphanResourceSnapshot.\n * Uses the snapshot's resolvedLabel directly — no async lookup needed.\n */\n private createDynamicNavItem(snapshot: OrphanResourceSnapshot): DynamicNavItem {\n return {\n Label: snapshot.resolvedLabel,\n Icon: this.resolveIcon(snapshot.entityName, snapshot.resourceType),\n ResourceType: snapshot.resourceType,\n RecordID: snapshot.resourceRecordId,\n Configuration: snapshot.configuration,\n isDynamic: true,\n isActiveMatch: (tab: unknown) => {\n const wsTab = tab as WorkspaceTab;\n if (snapshot.resourceRecordId) {\n return wsTab.resourceRecordId === snapshot.resourceRecordId;\n }\n return wsTab.id === snapshot.tabId;\n }\n };\n }\n\n // ========================================\n // Label Resolution\n // ========================================\n\n /**\n * Resolves the best available display label for an entity record nav item.\n * Priority order:\n * 1. Cached record name (from EntityRecordNameCache, populated by entity Load/Save)\n * 2. Tab title (whatever the workspace assigned when the tab was opened)\n * 3. Generated default (entity name + truncated primary key values)\n *\n * @param entityName - Entity name from tab configuration, may be undefined for non-entity resources\n * @param tabRecordId - URL-encoded composite key segment (e.g. \"ID|abc-123\" or \"Field1|val1||Field2|val2\")\n * @param tabTitle - Fallback title assigned by the workspace when the tab was opened\n */\n private async resolveRecordLabel(entityName: string | undefined, tabRecordId: string | undefined, tabTitle: string): Promise<string> {\n if (!entityName || !tabRecordId) {\n return tabTitle || '';\n }\n\n // Parse the URL segment into a CompositeKey\n const fvCollection = new FieldValueCollection();\n fvCollection.SimpleLoadFromURLSegment(tabRecordId);\n const compositeKey = new CompositeKey(fvCollection.KeyValuePairs);\n\n // Check the cache first\n try {\n const cachedName = await Metadata.Provider.GetCachedRecordName(entityName, compositeKey, true);\n if (cachedName) {\n return cachedName;\n }\n } catch (error) {\n console.warn('Failed to look up cached record name:', error);\n }\n\n // Fall back generated default from the key values, then tabTitle if we have no default label(unlikely)\n return this.createDefaultLabel(entityName, compositeKey) || tabTitle;\n }\n\n /**\n * Generates a fallback label when no cached record name or tab title is available.\n * Format: \"EntityName: <truncated key value(s)>\"\n *\n * @example\n * // Single key: \"Contacts: abc1234...\"\n * // Multi key: \"Order Details: abc1..., 42\"\n * // No key: \"Contacts record\"\n */\n private createDefaultLabel(entityName: string, key: CompositeKey): string {\n if (!key || key.KeyValuePairs.length === 0) {\n return `${entityName} record`;\n }\n\n if (key.KeyValuePairs.length === 1) {\n return `${entityName}: ${this.trimValue(key.KeyValuePairs[0].Value)}`;\n }\n\n // Multiple keys - show each value trimmed, comma-separated\n const values = key.KeyValuePairs.map(kv => this.trimValue(kv.Value)).join(', ');\n return `${entityName}: ${values}`;\n }\n\n /**\n * Truncates a primary key value for display, appending \"...\" if it exceeds maxLength.\n * Returns the value as-is if it's short enough or empty.\n */\n private trimValue(value: string, maxLength: number = 8): string {\n if (!value || value.trim().length === 0) {\n return value;\n }\n\n const trimmed = value.trim();\n if (trimmed.length <= maxLength) {\n return trimmed;\n }\n\n return trimmed.substring(0, maxLength) + '...';\n }\n\n // ========================================\n // Storage Persistence\n // ========================================\n\n /**\n * Persists the current recentOrphanStack to localStorage via Provider.\n * Fire-and-forget — errors are logged but don't affect the UX.\n */\n private saveStackToStorage(): void {\n try {\n const provider = Metadata.Provider.LocalStorageProvider;\n if (!provider) {\n return;\n }\n\n // Strip non-serializable fields (isActiveMatch closures are rebuilt on load)\n const serializable = this.recentOrphanStack.map(s => ({\n resourceRecordId: s.resourceRecordId,\n resourceType: s.resourceType,\n entityName: s.entityName,\n title: s.title,\n resolvedLabel: s.resolvedLabel,\n configuration: s.configuration,\n tabId: s.tabId,\n timestamp: s.timestamp\n }));\n\n provider.SetItem(STORAGE_KEY, JSON.stringify(serializable), STORAGE_CATEGORY).catch(err => {\n console.warn('Failed to persist recent nav stack:', err);\n });\n } catch (err) {\n console.warn('Failed to persist recent nav stack:', err);\n }\n }\n\n /**\n * Loads the recent orphan stack from localStorage via Provider.\n * Filters out stale entries (older than MAX_SNAPSHOT_AGE_MS).\n */\n private async loadStackFromStorage(): Promise<void> {\n try {\n const provider = Metadata.Provider.LocalStorageProvider;\n if (!provider) {\n return;\n }\n\n const raw = await provider.GetItem(STORAGE_KEY, STORAGE_CATEGORY);\n if (!raw) {\n return;\n }\n\n const parsed = JSON.parse(raw) as OrphanResourceSnapshot[];\n if (!Array.isArray(parsed)) {\n return;\n }\n\n // Filter out stale snapshots\n const now = Date.now();\n this.recentOrphanStack = parsed\n .filter(s => s.resourceRecordId && s.timestamp && (now - s.timestamp) < MAX_SNAPSHOT_AGE_MS)\n .slice(0, HomeApplication.MAX_RECENT_ITEMS);\n } catch (err) {\n console.warn('Failed to load recent nav stack from storage:', err);\n }\n }\n}\n"]}
|
|
@@ -5,7 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
import { Component, ViewEncapsulation, HostListener } from '@angular/core';
|
|
8
|
-
import { RegisterClass } from '@memberjunction/global';
|
|
8
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
9
9
|
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
10
|
import { Metadata, RunView } from '@memberjunction/core';
|
|
11
11
|
import { Subject } from 'rxjs';
|
|
@@ -947,7 +947,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
947
947
|
itemCount: itemCounts.get(list.ID) || 0,
|
|
948
948
|
entityName,
|
|
949
949
|
ownerName: userMap.get(list.UserID) || 'Unknown',
|
|
950
|
-
isOwner: list.UserID
|
|
950
|
+
isOwner: UUIDsEqual(list.UserID, this.currentUserId)
|
|
951
951
|
};
|
|
952
952
|
});
|
|
953
953
|
// Build entity filter options
|
|
@@ -974,7 +974,7 @@ let ListsBrowseResource = class ListsBrowseResource extends BaseResourceComponen
|
|
|
974
974
|
const processCategory = (cat, level) => {
|
|
975
975
|
const indent = '\u00A0\u00A0'.repeat(level);
|
|
976
976
|
result.push({ ID: cat.ID, displayName: `${indent}${cat.Name}` });
|
|
977
|
-
const children = categories.filter(c => c.ParentID
|
|
977
|
+
const children = categories.filter(c => UUIDsEqual(c.ParentID, cat.ID));
|
|
978
978
|
for (const child of children) {
|
|
979
979
|
processCategory(child, level + 1);
|
|
980
980
|
}
|