@memberjunction/ng-explorer-core 4.0.0 → 4.2.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/README.md +117 -726
- package/dist/lib/resource-wrappers/record-resource.component.d.ts.map +1 -1
- package/dist/lib/resource-wrappers/record-resource.component.js +11 -29
- package/dist/lib/resource-wrappers/record-resource.component.js.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.d.ts +71 -14
- package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
- package/dist/lib/shell/components/header/app-nav.component.js +195 -54
- package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
- package/dist/lib/shell/components/tabs/component-cache-manager.js +0 -6
- package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
- package/dist/lib/shell/shell.component.d.ts +5 -1
- package/dist/lib/shell/shell.component.d.ts.map +1 -1
- package/dist/lib/shell/shell.component.js +28 -17
- package/dist/lib/shell/shell.component.js.map +1 -1
- package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +1 -1
- package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +1 -1
- package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +1 -1
- package/dist/lib/single-record/single-record.component.d.ts +9 -0
- package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
- package/dist/lib/single-record/single-record.component.js +43 -2
- package/dist/lib/single-record/single-record.component.js.map +1 -1
- package/dist/lib/user-menu/base-user-menu.d.ts.map +1 -1
- package/dist/lib/user-menu/base-user-menu.js +2 -13
- package/dist/lib/user-menu/base-user-menu.js.map +1 -1
- package/package.json +35 -35
- package/dist/generic/Events.types.d.ts +0 -174
- package/dist/generic/Events.types.d.ts.map +0 -1
- package/dist/generic/Events.types.js +0 -220
- package/dist/generic/Events.types.js.map +0 -1
- package/dist/lib/app-view/application-view.component.d.ts +0 -65
- package/dist/lib/app-view/application-view.component.d.ts.map +0 -1
- package/dist/lib/app-view/application-view.component.js +0 -611
- package/dist/lib/app-view/application-view.component.js.map +0 -1
- package/dist/lib/auth-button/auth-button.component.d.ts +0 -13
- package/dist/lib/auth-button/auth-button.component.d.ts.map +0 -1
- package/dist/lib/auth-button/auth-button.component.js +0 -36
- package/dist/lib/auth-button/auth-button.component.js.map +0 -1
- package/dist/lib/base-browser-component/base-browser-component.d.ts +0 -44
- package/dist/lib/base-browser-component/base-browser-component.d.ts.map +0 -1
- package/dist/lib/base-browser-component/base-browser-component.js +0 -195
- package/dist/lib/base-browser-component/base-browser-component.js.map +0 -1
- package/dist/lib/chat-wrapper/chat-wrapper.component.d.ts +0 -54
- package/dist/lib/chat-wrapper/chat-wrapper.component.d.ts.map +0 -1
- package/dist/lib/chat-wrapper/chat-wrapper.component.js +0 -257
- package/dist/lib/chat-wrapper/chat-wrapper.component.js.map +0 -1
- package/dist/lib/dashboard-browser-component/dashboard-browser.component.d.ts +0 -32
- package/dist/lib/dashboard-browser-component/dashboard-browser.component.d.ts.map +0 -1
- package/dist/lib/dashboard-browser-component/dashboard-browser.component.js +0 -244
- package/dist/lib/dashboard-browser-component/dashboard-browser.component.js.map +0 -1
- package/dist/lib/data-browser-component/data-browser.component.d.ts +0 -23
- package/dist/lib/data-browser-component/data-browser.component.d.ts.map +0 -1
- package/dist/lib/data-browser-component/data-browser.component.js +0 -267
- package/dist/lib/data-browser-component/data-browser.component.js.map +0 -1
- package/dist/lib/expansion-panel-component/expansion-panel-component.d.ts +0 -21
- package/dist/lib/expansion-panel-component/expansion-panel-component.d.ts.map +0 -1
- package/dist/lib/expansion-panel-component/expansion-panel-component.js +0 -158
- package/dist/lib/expansion-panel-component/expansion-panel-component.js.map +0 -1
- package/dist/lib/favorites/favorites.component.d.ts +0 -15
- package/dist/lib/favorites/favorites.component.d.ts.map +0 -1
- package/dist/lib/favorites/favorites.component.js +0 -135
- package/dist/lib/favorites/favorites.component.js.map +0 -1
- package/dist/lib/files/files.component.d.ts +0 -10
- package/dist/lib/files/files.component.d.ts.map +0 -1
- package/dist/lib/files/files.component.js +0 -41
- package/dist/lib/files/files.component.js.map +0 -1
- package/dist/lib/generic-browse-list/generic-browse-list.component.d.ts +0 -30
- package/dist/lib/generic-browse-list/generic-browse-list.component.d.ts.map +0 -1
- package/dist/lib/generic-browse-list/generic-browse-list.component.js +0 -171
- package/dist/lib/generic-browse-list/generic-browse-list.component.js.map +0 -1
- package/dist/lib/generic-browser-list/generic-browser-list.component.d.ts +0 -120
- package/dist/lib/generic-browser-list/generic-browser-list.component.d.ts.map +0 -1
- package/dist/lib/generic-browser-list/generic-browser-list.component.js +0 -1093
- package/dist/lib/generic-browser-list/generic-browser-list.component.js.map +0 -1
- package/dist/lib/header/MSFT_UserImageService.d.ts +0 -12
- package/dist/lib/header/MSFT_UserImageService.d.ts.map +0 -1
- package/dist/lib/header/MSFT_UserImageService.js +0 -25
- package/dist/lib/header/MSFT_UserImageService.js.map +0 -1
- package/dist/lib/header/header.component.d.ts +0 -69
- package/dist/lib/header/header.component.d.ts.map +0 -1
- package/dist/lib/header/header.component.js +0 -342
- package/dist/lib/header/header.component.js.map +0 -1
- package/dist/lib/home-component/home.component.d.ts +0 -22
- package/dist/lib/home-component/home.component.d.ts.map +0 -1
- package/dist/lib/home-component/home.component.js +0 -194
- package/dist/lib/home-component/home.component.js.map +0 -1
- package/dist/lib/home-wrapper/home-wrapper.component.d.ts +0 -7
- package/dist/lib/home-wrapper/home-wrapper.component.d.ts.map +0 -1
- package/dist/lib/home-wrapper/home-wrapper.component.js +0 -30
- package/dist/lib/home-wrapper/home-wrapper.component.js.map +0 -1
- package/dist/lib/list-view/list-view.component.d.ts +0 -45
- package/dist/lib/list-view/list-view.component.d.ts.map +0 -1
- package/dist/lib/list-view/list-view.component.js +0 -329
- package/dist/lib/list-view/list-view.component.js.map +0 -1
- package/dist/lib/navigation/navigation.component.d.ts +0 -142
- package/dist/lib/navigation/navigation.component.d.ts.map +0 -1
- package/dist/lib/navigation/navigation.component.js +0 -1212
- package/dist/lib/navigation/navigation.component.js.map +0 -1
- package/dist/lib/query-browser-component/query-browser.component.d.ts +0 -75
- package/dist/lib/query-browser-component/query-browser.component.d.ts.map +0 -1
- package/dist/lib/query-browser-component/query-browser.component.js +0 -908
- package/dist/lib/query-browser-component/query-browser.component.js.map +0 -1
- package/dist/lib/report-browser-component/report-browser.component.d.ts +0 -22
- package/dist/lib/report-browser-component/report-browser.component.d.ts.map +0 -1
- package/dist/lib/report-browser-component/report-browser.component.js +0 -80
- package/dist/lib/report-browser-component/report-browser.component.js.map +0 -1
- package/dist/lib/resource-browser/resource-browser.component.d.ts +0 -178
- package/dist/lib/resource-browser/resource-browser.component.d.ts.map +0 -1
- package/dist/lib/resource-browser/resource-browser.component.js +0 -1012
- package/dist/lib/resource-browser/resource-browser.component.js.map +0 -1
- package/dist/lib/resource-wrappers/report-resource.component.d.ts +0 -13
- package/dist/lib/resource-wrappers/report-resource.component.d.ts.map +0 -1
- package/dist/lib/resource-wrappers/report-resource.component.js +0 -49
- package/dist/lib/resource-wrappers/report-resource.component.js.map +0 -1
- package/dist/lib/shared/custom-icon/custom-icon.component.d.ts +0 -11
- package/dist/lib/shared/custom-icon/custom-icon.component.d.ts.map +0 -1
- package/dist/lib/shared/custom-icon/custom-icon.component.js +0 -44
- package/dist/lib/shared/custom-icon/custom-icon.component.js.map +0 -1
- package/dist/lib/single-application/single-application.component.d.ts +0 -24
- package/dist/lib/single-application/single-application.component.d.ts.map +0 -1
- package/dist/lib/single-application/single-application.component.js +0 -122
- package/dist/lib/single-application/single-application.component.js.map +0 -1
- package/dist/lib/single-entity/single-entity.component.d.ts +0 -34
- package/dist/lib/single-entity/single-entity.component.d.ts.map +0 -1
- package/dist/lib/single-entity/single-entity.component.js +0 -245
- package/dist/lib/single-entity/single-entity.component.js.map +0 -1
- package/dist/lib/single-report/single-report.component.d.ts +0 -17
- package/dist/lib/single-report/single-report.component.d.ts.map +0 -1
- package/dist/lib/single-report/single-report.component.js +0 -55
- package/dist/lib/single-report/single-report.component.js.map +0 -1
- package/dist/lib/single-view/single-view.component.d.ts +0 -43
- package/dist/lib/single-view/single-view.component.d.ts.map +0 -1
- package/dist/lib/single-view/single-view.component.js +0 -207
- package/dist/lib/single-view/single-view.component.js.map +0 -1
- package/dist/lib/style-guide-test/style-guide-test.component.d.ts +0 -70
- package/dist/lib/style-guide-test/style-guide-test.component.d.ts.map +0 -1
- package/dist/lib/style-guide-test/style-guide-test.component.js +0 -1024
- package/dist/lib/style-guide-test/style-guide-test.component.js.map +0 -1
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.d.ts +0 -46
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.d.ts.map +0 -1
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js +0 -547
- package/dist/lib/tabbed-dashboard/tabbed-dashboard.component.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;;AAC9D,qBAMa,oBAAqB,SAAQ,qBAAqB;IAC3D,IAAW,UAAU,IAAI,YAAY,CAEpC;WAEa,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY;IAYvD,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"record-resource.component.d.ts","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;;AAC9D,qBAMa,oBAAqB,SAAQ,qBAAqB;IAC3D,IAAW,UAAU,IAAI,YAAY,CAEpC;WAEa,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY;IAYvD,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCArCtD,oBAAoB;2CAApB,oBAAoB;CAkDhC"}
|
|
@@ -27,39 +27,21 @@ let EntityRecordResource = class EntityRecordResource extends BaseResourceCompon
|
|
|
27
27
|
return compositeKey;
|
|
28
28
|
}
|
|
29
29
|
async GetResourceDisplayName(data) {
|
|
30
|
-
// console.log('[RecordResource.GetResourceDisplayName] Called with data:', {
|
|
31
|
-
// entity: data.Configuration?.Entity,
|
|
32
|
-
// resourceRecordID: data.ResourceRecordID,
|
|
33
|
-
// configuration: data.Configuration
|
|
34
|
-
// });
|
|
35
30
|
if (!data.Configuration.Entity) {
|
|
36
31
|
return '';
|
|
37
32
|
}
|
|
33
|
+
const md = new Metadata();
|
|
34
|
+
const e = md.EntityByName(data.Configuration.Entity);
|
|
35
|
+
if (!e) {
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
const pk = EntityRecordResource_1.GetPrimaryKey(data);
|
|
39
|
+
if (pk.HasValue) {
|
|
40
|
+
const name = await md.GetEntityRecordName(data.Configuration.Entity, pk);
|
|
41
|
+
return name ? name : e.DisplayNameOrName;
|
|
42
|
+
}
|
|
38
43
|
else {
|
|
39
|
-
|
|
40
|
-
const e = md.Entities.find(e => e.Name.trim().toLowerCase() === data.Configuration.Entity.trim().toLowerCase());
|
|
41
|
-
if (!e) {
|
|
42
|
-
console.warn(`[RecordResource.GetResourceDisplayName] Entity ${data.Configuration.Entity} not found in metadata`);
|
|
43
|
-
return '';
|
|
44
|
-
}
|
|
45
|
-
let pk = EntityRecordResource_1.GetPrimaryKey(data);
|
|
46
|
-
// console.log('[RecordResource.GetResourceDisplayName] Got primary key:', {
|
|
47
|
-
// hasValue: pk.HasValue,
|
|
48
|
-
// keyValuePairs: pk.KeyValuePairs
|
|
49
|
-
// });
|
|
50
|
-
if (pk.HasValue) {
|
|
51
|
-
const name = await md.GetEntityRecordName(data.Configuration.Entity, pk);
|
|
52
|
-
// console.log('[RecordResource.GetResourceDisplayName] Got record name from metadata:', {
|
|
53
|
-
// name,
|
|
54
|
-
// entityDisplayName: e.DisplayNameOrName,
|
|
55
|
-
// willReturn: name ? name : e.DisplayNameOrName
|
|
56
|
-
// });
|
|
57
|
-
//const displayId = pk.KeyValuePairs.length > 1 ? pk.Values() : pk.GetValueByIndex(0);
|
|
58
|
-
return (name ? name : e.DisplayNameOrName); // + ` (${displayId})`;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
return `New ${e.DisplayNameOrName} Record`;
|
|
62
|
-
}
|
|
44
|
+
return `New ${e.DisplayNameOrName} Record`;
|
|
63
45
|
}
|
|
64
46
|
}
|
|
65
47
|
async GetResourceIconClass(data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;;;AAOvD,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,qBAAqB;;IAC3D,IAAW,UAAU;QACjB,OAAO,sBAAoB,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,IAAkB;QAC1C,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAChH,IAAI,CAAC,CAAC,EAAC,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,aAAa,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,YAAY,GAAiB,IAAI,YAAY,EAAE,CAAC;QACpD,YAAY,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1D,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,
|
|
1
|
+
{"version":3,"file":"record-resource.component.js","sourceRoot":"","sources":["../../../src/lib/resource-wrappers/record-resource.component.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;;;AAOvD,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,qBAAqB;;IAC3D,IAAW,UAAU;QACjB,OAAO,sBAAoB,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,IAAkB;QAC1C,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAChH,IAAI,CAAC,CAAC,EAAC,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,CAAC,aAAa,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,YAAY,GAAiB,IAAI,YAAY,EAAE,CAAC;QACpD,YAAY,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1D,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,EAAE,GAAiB,sBAAoB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,OAAO,OAAO,CAAC,CAAC,iBAAiB,SAAS,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACzC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAC,CAAC;YAC5B,OAAO,EAAE,CAAA;QACb,CAAC;aACI,CAAC;YACF,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAChH,IAAI,CAAC;gBACD,OAAO,CAAC,EAAE,IAAI,CAAC;;gBAEf,OAAO,EAAE,CAAC;QAClB,CAAC;IACL,CAAC;6PAjDQ,oBAAoB,yBAApB,oBAAoB;6DAApB,oBAAoB;YAFlB,2CAAoO;YAA7C,AAAtC,yHAAgB,wBAAoB,IAAC,gHAAgB,+BAA2B,IAAC;YAAE,iBAAmB;;YAA7J,AAAzC,AAA/B,2CAA8B,6CAAyC,2DAAuD;;;AAElJ,oBAAoB;IANhC,aAAa,CAAC,qBAAqB,EAAE,gBAAgB,CAAC;GAM1C,oBAAoB,CAkDhC;;iFAlDY,oBAAoB;cALhC,SAAS;eAAC;gBACT,UAAU,EAAE,KAAK;gBACf,QAAQ,EAAE,oBAAoB;gBAC9B,QAAQ,EAAE,yPAAyP;aACtQ;;kFACY,oBAAoB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EventEmitter, OnInit,
|
|
1
|
+
import { EventEmitter, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
2
|
import { BaseApplication, NavItem, WorkspaceStateManager } from '@memberjunction/ng-base-application';
|
|
3
3
|
import { SharedService } from '@memberjunction/ng-shared';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
@@ -12,38 +12,95 @@ export interface NavItemClickEvent {
|
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* Horizontal navigation items for the current app.
|
|
15
|
+
* Uses OnPush change detection and reactive state management for optimal performance.
|
|
15
16
|
*/
|
|
16
|
-
export declare class AppNavComponent implements OnInit,
|
|
17
|
+
export declare class AppNavComponent implements OnInit, OnDestroy {
|
|
17
18
|
private workspaceManager;
|
|
18
19
|
private sharedService;
|
|
19
|
-
|
|
20
|
+
private cdr;
|
|
21
|
+
private destroy$;
|
|
22
|
+
private _app;
|
|
23
|
+
private _cachedNavItems;
|
|
24
|
+
private _cachedAppColor;
|
|
25
|
+
private _servicesInjected;
|
|
26
|
+
/**
|
|
27
|
+
* Monotonically increasing counter used to detect and discard stale async results.
|
|
28
|
+
*
|
|
29
|
+
* Because GetNavItems() is async (HomeApplication does a DB lookup for record names),
|
|
30
|
+
* and RxJS subscribe() does NOT serialize async callbacks, multiple calls to
|
|
31
|
+
* updateCachedData() can overlap. Without this guard, a slow call (e.g., Home app
|
|
32
|
+
* doing a DB lookup) that started BEFORE a fast call (e.g., switching to App B)
|
|
33
|
+
* could resolve AFTER the fast call and overwrite the correct nav items with stale ones.
|
|
34
|
+
*
|
|
35
|
+
* How it works:
|
|
36
|
+
* 1. Each updateCachedData() call increments this counter and captures it as `gen`
|
|
37
|
+
* 2. After the await, it checks: does `gen` still match `_updateGeneration`?
|
|
38
|
+
* 3. If not, a newer call started while we were waiting — discard our stale results
|
|
39
|
+
*/
|
|
40
|
+
private _updateGeneration;
|
|
41
|
+
private activeStateMap;
|
|
20
42
|
navItemClick: EventEmitter<NavItemClickEvent>;
|
|
21
|
-
|
|
43
|
+
navItemDismiss: EventEmitter<NavItem>;
|
|
44
|
+
constructor(workspaceManager: WorkspaceStateManager, sharedService: SharedService, cdr: ChangeDetectorRef);
|
|
45
|
+
/**
|
|
46
|
+
* Input setter for app - triggers cache update when app changes
|
|
47
|
+
*/
|
|
48
|
+
set app(value: BaseApplication | null);
|
|
49
|
+
get app(): BaseApplication | null;
|
|
22
50
|
ngOnInit(): void;
|
|
23
|
-
|
|
51
|
+
ngOnDestroy(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Update cached nav items and app color when app changes
|
|
54
|
+
*/
|
|
55
|
+
private updateCachedData;
|
|
56
|
+
/**
|
|
57
|
+
* Update active state map based on current workspace configuration
|
|
58
|
+
*/
|
|
59
|
+
private updateActiveStates;
|
|
60
|
+
/**
|
|
61
|
+
* Get unique key for nav item (used for tracking and active state).
|
|
62
|
+
* Prefers RecordID for dynamic items to avoid label collisions.
|
|
63
|
+
*/
|
|
64
|
+
private getItemKey;
|
|
65
|
+
/**
|
|
66
|
+
* Check if a nav item is dynamic (generated from recent orphan resources)
|
|
67
|
+
*/
|
|
68
|
+
isDynamic(item: NavItem): boolean;
|
|
24
69
|
/**
|
|
25
|
-
*
|
|
26
|
-
|
|
27
|
-
|
|
70
|
+
* Compute if nav item is active based on active tab
|
|
71
|
+
*/
|
|
72
|
+
private computeIsActive;
|
|
73
|
+
/**
|
|
74
|
+
* Get cached navigation items (no computation in getter)
|
|
28
75
|
*/
|
|
29
76
|
get navItems(): NavItem[];
|
|
30
77
|
/**
|
|
31
|
-
* Get app color
|
|
78
|
+
* Get cached app color (no computation in getter)
|
|
32
79
|
*/
|
|
33
80
|
get appColor(): string;
|
|
81
|
+
/**
|
|
82
|
+
* Check if nav item is active (uses cached state from Map)
|
|
83
|
+
*/
|
|
84
|
+
isActive(item: NavItem): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Track function for @for to optimize rendering
|
|
87
|
+
*/
|
|
88
|
+
trackByNavItem(_index: number, item: NavItem): string;
|
|
34
89
|
/**
|
|
35
90
|
* Handle nav item click
|
|
36
91
|
*/
|
|
37
92
|
onNavClick(item: NavItem, event?: MouseEvent): void;
|
|
38
93
|
/**
|
|
39
|
-
* Handle
|
|
94
|
+
* Handle dismiss click on a dynamic nav item.
|
|
95
|
+
* Removes from the app's recent stack and refreshes nav items immediately.
|
|
96
|
+
* Stops propagation so the nav click handler doesn't fire.
|
|
40
97
|
*/
|
|
41
|
-
|
|
98
|
+
onDismiss(item: NavItem, event: MouseEvent): void;
|
|
42
99
|
/**
|
|
43
|
-
*
|
|
100
|
+
* Handle nav item double-click (opens in new tab)
|
|
44
101
|
*/
|
|
45
|
-
|
|
102
|
+
onNavDblClick(item: NavItem, event?: MouseEvent): void;
|
|
46
103
|
static ɵfac: i0.ɵɵFactoryDeclaration<AppNavComponent, never>;
|
|
47
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<AppNavComponent, "mj-app-nav", never, { "app": { "alias": "app"; "required": false; }; }, { "navItemClick": "navItemClick"; }, never, never, false, never>;
|
|
104
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AppNavComponent, "mj-app-nav", never, { "app": { "alias": "app"; "required": false; }; }, { "navItemClick": "navItemClick"; "navItemDismiss": "navItemDismiss"; }, never, never, false, never>;
|
|
48
105
|
}
|
|
49
106
|
//# sourceMappingURL=app-nav.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-nav.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-nav.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"app-nav.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-nav.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAA2B,MAAM,eAAe,CAAC;AACtI,OAAO,EAAE,eAAe,EAAkB,OAAO,EAAE,qBAAqB,EAA0B,MAAM,qCAAqC,CAAC;AAC9I,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;AAG1D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,qBAOa,eAAgB,YAAW,MAAM,EAAE,SAAS;IA8BrD,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,GAAG;IA/Bb,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,iBAAiB,CAAS;IAElC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAG9B,OAAO,CAAC,cAAc,CAA8B;IAE1C,YAAY,kCAAyC;IACrD,cAAc,wBAA+B;gBAG7C,gBAAgB,EAAE,qBAAqB,EACvC,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,iBAAiB;IAGhC;;OAEG;IACH,IACI,GAAG,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,EASpC;IAED,IAAI,GAAG,IAAI,eAAe,GAAG,IAAI,CAEhC;IAED,QAAQ,IAAI,IAAI;IAahB,WAAW,IAAI,IAAI;IAKnB;;OAEG;YACW,gBAAgB;IA6C9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAIjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,IAAI,QAAQ,IAAI,OAAO,EAAE,CAExB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAKhC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM;IAIrD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;IAQnD;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAiBjD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;yCA9O3C,eAAe;2CAAf,eAAe;CAsP3B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
import * as i1 from "@memberjunction/ng-base-application";
|
|
4
5
|
import * as i2 from "@memberjunction/ng-shared";
|
|
@@ -17,6 +18,13 @@ function AppNavComponent_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
|
17
18
|
i0.ɵɵadvance();
|
|
18
19
|
i0.ɵɵtextInterpolate(item_r2.Badge);
|
|
19
20
|
} }
|
|
21
|
+
function AppNavComponent_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
23
|
+
i0.ɵɵelementStart(0, "button", 6);
|
|
24
|
+
i0.ɵɵlistener("click", function AppNavComponent_For_2_Conditional_5_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const item_r2 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDismiss(item_r2, $event)); });
|
|
25
|
+
i0.ɵɵelement(1, "i", 7);
|
|
26
|
+
i0.ɵɵelementEnd();
|
|
27
|
+
} }
|
|
20
28
|
function AppNavComponent_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
21
29
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
22
30
|
i0.ɵɵelementStart(0, "div", 2);
|
|
@@ -26,62 +34,197 @@ function AppNavComponent_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
|
26
34
|
i0.ɵɵtext(3);
|
|
27
35
|
i0.ɵɵelementEnd();
|
|
28
36
|
i0.ɵɵconditionalCreate(4, AppNavComponent_For_2_Conditional_4_Template, 2, 1, "span", 4);
|
|
37
|
+
i0.ɵɵconditionalCreate(5, AppNavComponent_For_2_Conditional_5_Template, 2, 0, "button", 5);
|
|
29
38
|
i0.ɵɵelementEnd();
|
|
30
39
|
} if (rf & 2) {
|
|
31
40
|
const item_r2 = ctx.$implicit;
|
|
32
41
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
33
|
-
i0.ɵɵclassProp("active", ctx_r2.isActive(item_r2))("no-icon", !item_r2.Icon);
|
|
42
|
+
i0.ɵɵclassProp("active", ctx_r2.isActive(item_r2))("dynamic", ctx_r2.isDynamic(item_r2))("no-icon", !item_r2.Icon);
|
|
34
43
|
i0.ɵɵadvance();
|
|
35
44
|
i0.ɵɵconditional(item_r2.Icon ? 1 : -1);
|
|
36
45
|
i0.ɵɵadvance(2);
|
|
37
46
|
i0.ɵɵtextInterpolate(item_r2.Label);
|
|
38
47
|
i0.ɵɵadvance();
|
|
39
48
|
i0.ɵɵconditional(item_r2.Badge ? 4 : -1);
|
|
49
|
+
i0.ɵɵadvance();
|
|
50
|
+
i0.ɵɵconditional(ctx_r2.isDynamic(item_r2) ? 5 : -1);
|
|
40
51
|
} }
|
|
41
52
|
/**
|
|
42
53
|
* Horizontal navigation items for the current app.
|
|
54
|
+
* Uses OnPush change detection and reactive state management for optimal performance.
|
|
43
55
|
*/
|
|
44
56
|
export class AppNavComponent {
|
|
45
57
|
workspaceManager;
|
|
46
58
|
sharedService;
|
|
47
|
-
|
|
59
|
+
cdr;
|
|
60
|
+
destroy$ = new Subject();
|
|
61
|
+
_app = null;
|
|
62
|
+
_cachedNavItems = [];
|
|
63
|
+
_cachedAppColor = '#1976d2';
|
|
64
|
+
_servicesInjected = false;
|
|
65
|
+
/**
|
|
66
|
+
* Monotonically increasing counter used to detect and discard stale async results.
|
|
67
|
+
*
|
|
68
|
+
* Because GetNavItems() is async (HomeApplication does a DB lookup for record names),
|
|
69
|
+
* and RxJS subscribe() does NOT serialize async callbacks, multiple calls to
|
|
70
|
+
* updateCachedData() can overlap. Without this guard, a slow call (e.g., Home app
|
|
71
|
+
* doing a DB lookup) that started BEFORE a fast call (e.g., switching to App B)
|
|
72
|
+
* could resolve AFTER the fast call and overwrite the correct nav items with stale ones.
|
|
73
|
+
*
|
|
74
|
+
* How it works:
|
|
75
|
+
* 1. Each updateCachedData() call increments this counter and captures it as `gen`
|
|
76
|
+
* 2. After the await, it checks: does `gen` still match `_updateGeneration`?
|
|
77
|
+
* 3. If not, a newer call started while we were waiting — discard our stale results
|
|
78
|
+
*/
|
|
79
|
+
_updateGeneration = 0;
|
|
80
|
+
// Map of nav item key (Route or Label) to active state
|
|
81
|
+
activeStateMap = new Map();
|
|
48
82
|
navItemClick = new EventEmitter();
|
|
49
|
-
|
|
83
|
+
navItemDismiss = new EventEmitter();
|
|
84
|
+
constructor(workspaceManager, sharedService, cdr) {
|
|
50
85
|
this.workspaceManager = workspaceManager;
|
|
51
86
|
this.sharedService = sharedService;
|
|
87
|
+
this.cdr = cdr;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Input setter for app - triggers cache update when app changes
|
|
91
|
+
*/
|
|
92
|
+
set app(value) {
|
|
93
|
+
if (this._app !== value) {
|
|
94
|
+
this._app = value;
|
|
95
|
+
this._cachedNavItems = []; // Clear stale items immediately so previous app's items don't flash
|
|
96
|
+
this.activeStateMap.clear();
|
|
97
|
+
this._servicesInjected = false; // Reset injection flag
|
|
98
|
+
this.updateCachedData();
|
|
99
|
+
this.cdr.markForCheck();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
get app() {
|
|
103
|
+
return this._app;
|
|
52
104
|
}
|
|
53
105
|
ngOnInit() {
|
|
106
|
+
// Subscribe to workspace configuration changes.
|
|
107
|
+
// Must rebuild nav items (not just active states) because dynamic nav items
|
|
108
|
+
// are generated based on the currently active tab - when a user navigates
|
|
109
|
+
// from one record to another (e.g., via OpenEntityRecord), the active tab
|
|
110
|
+
// changes and the dynamic nav item needs to reflect the new record.
|
|
111
|
+
this.workspaceManager.Configuration
|
|
112
|
+
.pipe(takeUntil(this.destroy$))
|
|
113
|
+
.subscribe(async () => {
|
|
114
|
+
await this.updateCachedData();
|
|
115
|
+
});
|
|
54
116
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
117
|
+
ngOnDestroy() {
|
|
118
|
+
this.destroy$.next();
|
|
119
|
+
this.destroy$.complete();
|
|
58
120
|
}
|
|
59
121
|
/**
|
|
60
|
-
*
|
|
61
|
-
* Filters out items that are not Active (Pending or Disabled).
|
|
62
|
-
* For HomeApplication, also injects required services for dynamic nav items.
|
|
122
|
+
* Update cached nav items and app color when app changes
|
|
63
123
|
*/
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
124
|
+
async updateCachedData() {
|
|
125
|
+
// Capture the current generation before any async work.
|
|
126
|
+
// See _updateGeneration JSDoc for full explanation of the race condition this prevents.
|
|
127
|
+
const gen = ++this._updateGeneration;
|
|
128
|
+
if (this._app) {
|
|
129
|
+
// Inject services once for apps that need them (e.g., HomeApplication for dynamic nav items)
|
|
130
|
+
if (!this._servicesInjected) {
|
|
131
|
+
const appWithServices = this._app;
|
|
132
|
+
if (typeof appWithServices.SetWorkspaceManager === 'function') {
|
|
133
|
+
appWithServices.SetWorkspaceManager(this.workspaceManager);
|
|
134
|
+
}
|
|
135
|
+
if (typeof appWithServices.SetSharedService === 'function') {
|
|
136
|
+
appWithServices.SetSharedService(this.sharedService);
|
|
137
|
+
}
|
|
138
|
+
this._servicesInjected = true;
|
|
71
139
|
}
|
|
72
|
-
|
|
73
|
-
|
|
140
|
+
const items = await this._app.GetNavItems() || [];
|
|
141
|
+
// If a newer call started while we were awaiting, our results are stale — bail out
|
|
142
|
+
// so we don't overwrite the newer call's (correct) results.
|
|
143
|
+
if (gen !== this._updateGeneration) {
|
|
144
|
+
return;
|
|
74
145
|
}
|
|
146
|
+
// Only show items with Status 'Active' or undefined (default to Active)
|
|
147
|
+
this._cachedNavItems = items.filter(item => !item.Status || item.Status === 'Active');
|
|
148
|
+
this._cachedAppColor = this._app.GetColor() || '#1976d2';
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
this._cachedNavItems = [];
|
|
152
|
+
this._cachedAppColor = '#1976d2';
|
|
153
|
+
}
|
|
154
|
+
// Update active states after nav items change
|
|
155
|
+
const config = this.workspaceManager.GetConfiguration();
|
|
156
|
+
this.updateActiveStates(config);
|
|
157
|
+
this.cdr.markForCheck();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Update active state map based on current workspace configuration
|
|
161
|
+
*/
|
|
162
|
+
updateActiveStates(config) {
|
|
163
|
+
this.activeStateMap.clear();
|
|
164
|
+
if (!config || !this._app) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const activeTab = config.tabs.find(t => t.id === config.activeTabId);
|
|
168
|
+
if (!activeTab || activeTab.applicationId !== this._app.ID) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// Compute active state for each nav item once
|
|
172
|
+
for (const item of this._cachedNavItems) {
|
|
173
|
+
const key = this.getItemKey(item);
|
|
174
|
+
const isActive = this.computeIsActive(item, activeTab);
|
|
175
|
+
this.activeStateMap.set(key, isActive);
|
|
75
176
|
}
|
|
76
|
-
const items = this.app?.GetNavItems() || [];
|
|
77
|
-
// Only show items with Status 'Active' or undefined (default to Active)
|
|
78
|
-
return items.filter(item => !item.Status || item.Status === 'Active');
|
|
79
177
|
}
|
|
80
178
|
/**
|
|
81
|
-
* Get
|
|
179
|
+
* Get unique key for nav item (used for tracking and active state).
|
|
180
|
+
* Prefers RecordID for dynamic items to avoid label collisions.
|
|
181
|
+
*/
|
|
182
|
+
getItemKey(item) {
|
|
183
|
+
return item.RecordID || item.Route || item.Label || '';
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Check if a nav item is dynamic (generated from recent orphan resources)
|
|
187
|
+
*/
|
|
188
|
+
isDynamic(item) {
|
|
189
|
+
return item.isDynamic === true;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Compute if nav item is active based on active tab
|
|
193
|
+
*/
|
|
194
|
+
computeIsActive(item, activeTab) {
|
|
195
|
+
// Check if nav item has a custom matching function (for dynamic items)
|
|
196
|
+
const dynamicItem = item;
|
|
197
|
+
if (dynamicItem.isActiveMatch && typeof dynamicItem.isActiveMatch === 'function') {
|
|
198
|
+
return dynamicItem.isActiveMatch(activeTab);
|
|
199
|
+
}
|
|
200
|
+
// Standard matching: route or label
|
|
201
|
+
return (item.Route && activeTab.configuration['route'] === item.Route) ||
|
|
202
|
+
activeTab.title === item.Label;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get cached navigation items (no computation in getter)
|
|
206
|
+
*/
|
|
207
|
+
get navItems() {
|
|
208
|
+
return this._cachedNavItems;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get cached app color (no computation in getter)
|
|
82
212
|
*/
|
|
83
213
|
get appColor() {
|
|
84
|
-
return this.
|
|
214
|
+
return this._cachedAppColor;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Check if nav item is active (uses cached state from Map)
|
|
218
|
+
*/
|
|
219
|
+
isActive(item) {
|
|
220
|
+
const key = this.getItemKey(item);
|
|
221
|
+
return this.activeStateMap.get(key) || false;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Track function for @for to optimize rendering
|
|
225
|
+
*/
|
|
226
|
+
trackByNavItem(_index, item) {
|
|
227
|
+
return this.getItemKey(item);
|
|
85
228
|
}
|
|
86
229
|
/**
|
|
87
230
|
* Handle nav item click
|
|
@@ -93,6 +236,23 @@ export class AppNavComponent {
|
|
|
93
236
|
dblClick: false
|
|
94
237
|
});
|
|
95
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Handle dismiss click on a dynamic nav item.
|
|
241
|
+
* Removes from the app's recent stack and refreshes nav items immediately.
|
|
242
|
+
* Stops propagation so the nav click handler doesn't fire.
|
|
243
|
+
*/
|
|
244
|
+
onDismiss(item, event) {
|
|
245
|
+
event.stopPropagation();
|
|
246
|
+
// Remove from the app's recent stack directly so we can refresh immediately
|
|
247
|
+
if (this._app) {
|
|
248
|
+
const appWithRemove = this._app;
|
|
249
|
+
if (typeof appWithRemove.RemoveDynamicNavItem === 'function') {
|
|
250
|
+
appWithRemove.RemoveDynamicNavItem(item);
|
|
251
|
+
this.updateCachedData();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
this.navItemDismiss.emit(item);
|
|
255
|
+
}
|
|
96
256
|
/**
|
|
97
257
|
* Handle nav item double-click (opens in new tab)
|
|
98
258
|
*/
|
|
@@ -104,45 +264,26 @@ export class AppNavComponent {
|
|
|
104
264
|
dblClick: true
|
|
105
265
|
});
|
|
106
266
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
*/
|
|
110
|
-
isActive(item) {
|
|
111
|
-
const config = this.workspaceManager.GetConfiguration();
|
|
112
|
-
if (!config || !this.app)
|
|
113
|
-
return false;
|
|
114
|
-
// Check if active tab matches this nav item
|
|
115
|
-
const activeTab = config.tabs.find(t => t.id === config.activeTabId);
|
|
116
|
-
if (activeTab && activeTab.applicationId === this.app.ID) {
|
|
117
|
-
// Check if nav item has a custom matching function (for dynamic items)
|
|
118
|
-
const dynamicItem = item;
|
|
119
|
-
if (dynamicItem.isActiveMatch && typeof dynamicItem.isActiveMatch === 'function') {
|
|
120
|
-
return dynamicItem.isActiveMatch(activeTab);
|
|
121
|
-
}
|
|
122
|
-
// Standard matching: route or label
|
|
123
|
-
return (item.Route && activeTab.configuration['route'] === item.Route) ||
|
|
124
|
-
activeTab.title === item.Label;
|
|
125
|
-
}
|
|
126
|
-
return false;
|
|
127
|
-
}
|
|
128
|
-
static ɵfac = function AppNavComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AppNavComponent)(i0.ɵɵdirectiveInject(i1.WorkspaceStateManager), i0.ɵɵdirectiveInject(i2.SharedService)); };
|
|
129
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppNavComponent, selectors: [["mj-app-nav"]], inputs: { app: "app" }, outputs: { navItemClick: "navItemClick" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 3, vars: 2, consts: [[1, "nav-list"], [1, "nav-item", 3, "active", "no-icon"], [1, "nav-item", 3, "click", "dblclick"], [3, "class"], [1, "badge"]], template: function AppNavComponent_Template(rf, ctx) { if (rf & 1) {
|
|
267
|
+
static ɵfac = function AppNavComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AppNavComponent)(i0.ɵɵdirectiveInject(i1.WorkspaceStateManager), i0.ɵɵdirectiveInject(i2.SharedService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
268
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppNavComponent, selectors: [["mj-app-nav"]], inputs: { app: "app" }, outputs: { navItemClick: "navItemClick", navItemDismiss: "navItemDismiss" }, standalone: false, decls: 3, vars: 2, consts: [[1, "nav-list"], [1, "nav-item", 3, "active", "dynamic", "no-icon"], [1, "nav-item", 3, "click", "dblclick"], [3, "class"], [1, "badge"], ["title", "Remove", 1, "dismiss-btn"], ["title", "Remove", 1, "dismiss-btn", 3, "click"], [1, "fa-solid", "fa-xmark"]], template: function AppNavComponent_Template(rf, ctx) { if (rf & 1) {
|
|
130
269
|
i0.ɵɵelementStart(0, "nav", 0);
|
|
131
|
-
i0.ɵɵrepeaterCreate(1, AppNavComponent_For_2_Template,
|
|
270
|
+
i0.ɵɵrepeaterCreate(1, AppNavComponent_For_2_Template, 6, 10, "div", 1, ctx.trackByNavItem, true);
|
|
132
271
|
i0.ɵɵelementEnd();
|
|
133
272
|
} if (rf & 2) {
|
|
134
273
|
i0.ɵɵstyleProp("--app-color", ctx.appColor);
|
|
135
274
|
i0.ɵɵadvance();
|
|
136
275
|
i0.ɵɵrepeater(ctx.navItems);
|
|
137
|
-
} }, styles: [".nav-list[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 6px;\n text-decoration: none;\n color: #616161;\n font-weight: 500;\n font-size: 14px;\n transition: all 0.15s;\n position: relative;\n cursor: pointer;\n user-select: none;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n color: #424242;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--app-color, #1976d2) 12%, white);\n color: var(--app-color, #1976d2);\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--app-color, #1976d2);\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.no-icon[_ngcontent-%COMP%] {\n padding-left: 12px;\n padding-right: 12px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n}\n\n\n\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 2px;\n padding: 0 12px;\n}\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-radius: 8px;\n}\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n}"] });
|
|
276
|
+
} }, styles: [".nav-list[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 6px;\n text-decoration: none;\n color: #616161;\n font-weight: 500;\n font-size: 14px;\n transition: all 0.15s;\n position: relative;\n cursor: pointer;\n user-select: none;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n color: #424242;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--app-color, #1976d2) 12%, white);\n color: var(--app-color, #1976d2);\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--app-color, #1976d2);\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.no-icon[_ngcontent-%COMP%] {\n padding-left: 12px;\n padding-right: 12px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .badge[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n}\n\n\n\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%]:not(.dynamic) + .nav-item.dynamic[_ngcontent-%COMP%] {\n margin-left: 4px;\n padding-left: 16px;\n border-left: 1px solid #e0e0e0;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.dynamic[_ngcontent-%COMP%]:not(.active) {\n opacity: 0.7;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.dynamic[_ngcontent-%COMP%]:not(.active):hover {\n opacity: 1;\n}\n\n\n\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .dismiss-btn[_ngcontent-%COMP%] {\n display: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: #9e9e9e;\n font-size: 10px;\n cursor: pointer;\n transition: all 0.15s;\n margin-left: -2px;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item.dynamic[_ngcontent-%COMP%]:hover .dismiss-btn[_ngcontent-%COMP%] {\n display: flex;\n}\n.nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] .dismiss-btn[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #616161;\n}\n\n\n\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 2px;\n padding: 0 12px;\n}\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-radius: 8px;\n}\n.mobile-nav-content[_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%], .mobile-nav-content [_nghost-%COMP%] .nav-list[_ngcontent-%COMP%] .nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n}"], changeDetection: 0 });
|
|
138
277
|
}
|
|
139
278
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AppNavComponent, [{
|
|
140
279
|
type: Component,
|
|
141
|
-
args: [{ standalone: false, selector: 'mj-app-nav', template: "<nav class=\"nav-list\" [style.--app-color]=\"appColor\">\n @for (item of navItems; track item) {\n <div\n class=\"nav-item\"\n [class.active]=\"isActive(item)\"\n [class.no-icon]=\"!item.Icon\"\n (click)=\"onNavClick(item, $event)\"\n (dblclick)=\"onNavDblClick(item, $event)\">\n @if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n <span>{{ item.Label }}</span>\n @if (item.Badge) {\n <span class=\"badge\">{{ item.Badge }}</span>\n }\n </div>\n }\n</nav>\n", styles: [".nav-list {\n display: flex;\n gap: 4px;\n}\n.nav-list .nav-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 6px;\n text-decoration: none;\n color: #616161;\n font-weight: 500;\n font-size: 14px;\n transition: all 0.15s;\n position: relative;\n cursor: pointer;\n user-select: none;\n}\n.nav-list .nav-item:hover {\n background: #f5f5f5;\n color: #424242;\n}\n.nav-list .nav-item.active {\n background: color-mix(in srgb, var(--app-color, #1976d2) 12%, white);\n color: var(--app-color, #1976d2);\n}\n.nav-list .nav-item.active i {\n color: var(--app-color, #1976d2);\n}\n.nav-list .nav-item i {\n font-size: 16px;\n}\n.nav-list .nav-item.no-icon {\n padding-left: 12px;\n padding-right: 12px;\n}\n.nav-list .nav-item .badge {\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n}\n\n/* Mobile drawer vertical layout */\n:host-context(.mobile-nav-content) .nav-list {\n flex-direction: column;\n gap: 2px;\n padding: 0 12px;\n}\n:host-context(.mobile-nav-content) .nav-list .nav-item {\n padding: 12px 16px;\n border-radius: 8px;\n}\n:host-context(.mobile-nav-content) .nav-list .nav-item i {\n width: 20px;\n text-align: center;\n}\n"] }]
|
|
142
|
-
}], () => [{ type: i1.WorkspaceStateManager }, { type: i2.SharedService }], {
|
|
143
|
-
type:
|
|
144
|
-
}],
|
|
280
|
+
args: [{ standalone: false, selector: 'mj-app-nav', changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav class=\"nav-list\" [style.--app-color]=\"appColor\">\n @for (item of navItems; track trackByNavItem($index, item)) {\n <div\n class=\"nav-item\"\n [class.active]=\"isActive(item)\"\n [class.dynamic]=\"isDynamic(item)\"\n [class.no-icon]=\"!item.Icon\"\n (click)=\"onNavClick(item, $event)\"\n (dblclick)=\"onNavDblClick(item, $event)\">\n @if (item.Icon) {\n <i [class]=\"item.Icon\"></i>\n }\n <span>{{ item.Label }}</span>\n @if (item.Badge) {\n <span class=\"badge\">{{ item.Badge }}</span>\n }\n @if (isDynamic(item)) {\n <button class=\"dismiss-btn\" title=\"Remove\" (click)=\"onDismiss(item, $event)\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n</nav>\n", styles: [".nav-list {\n display: flex;\n gap: 4px;\n}\n.nav-list .nav-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border-radius: 6px;\n text-decoration: none;\n color: #616161;\n font-weight: 500;\n font-size: 14px;\n transition: all 0.15s;\n position: relative;\n cursor: pointer;\n user-select: none;\n}\n.nav-list .nav-item:hover {\n background: #f5f5f5;\n color: #424242;\n}\n.nav-list .nav-item.active {\n background: color-mix(in srgb, var(--app-color, #1976d2) 12%, white);\n color: var(--app-color, #1976d2);\n}\n.nav-list .nav-item.active i {\n color: var(--app-color, #1976d2);\n}\n.nav-list .nav-item i {\n font-size: 16px;\n}\n.nav-list .nav-item.no-icon {\n padding-left: 12px;\n padding-right: 12px;\n}\n.nav-list .nav-item .badge {\n background: #f44336;\n color: white;\n border-radius: 10px;\n padding: 2px 6px;\n font-size: 11px;\n font-weight: 600;\n min-width: 18px;\n text-align: center;\n}\n\n/* Dynamic nav items (recent orphan resources) \u2014 separator and dimming */\n.nav-list .nav-item:not(.dynamic) + .nav-item.dynamic {\n margin-left: 4px;\n padding-left: 16px;\n border-left: 1px solid #e0e0e0;\n}\n.nav-list .nav-item.dynamic:not(.active) {\n opacity: 0.7;\n}\n.nav-list .nav-item.dynamic:not(.active):hover {\n opacity: 1;\n}\n\n/* Dismiss button for dynamic nav items */\n.nav-list .nav-item .dismiss-btn {\n display: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n border-radius: 50%;\n background: transparent;\n color: #9e9e9e;\n font-size: 10px;\n cursor: pointer;\n transition: all 0.15s;\n margin-left: -2px;\n}\n.nav-list .nav-item.dynamic:hover .dismiss-btn {\n display: flex;\n}\n.nav-list .nav-item .dismiss-btn:hover {\n background: rgba(0, 0, 0, 0.1);\n color: #616161;\n}\n\n/* Mobile drawer vertical layout */\n:host-context(.mobile-nav-content) .nav-list {\n flex-direction: column;\n gap: 2px;\n padding: 0 12px;\n}\n:host-context(.mobile-nav-content) .nav-list .nav-item {\n padding: 12px 16px;\n border-radius: 8px;\n}\n:host-context(.mobile-nav-content) .nav-list .nav-item i {\n width: 20px;\n text-align: center;\n}\n"] }]
|
|
281
|
+
}], () => [{ type: i1.WorkspaceStateManager }, { type: i2.SharedService }, { type: i0.ChangeDetectorRef }], { navItemClick: [{
|
|
282
|
+
type: Output
|
|
283
|
+
}], navItemDismiss: [{
|
|
145
284
|
type: Output
|
|
285
|
+
}], app: [{
|
|
286
|
+
type: Input
|
|
146
287
|
}] }); })();
|
|
147
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AppNavComponent, { className: "AppNavComponent", filePath: "src/lib/shell/components/header/app-nav.component.ts", lineNumber:
|
|
288
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AppNavComponent, { className: "AppNavComponent", filePath: "src/lib/shell/components/header/app-nav.component.ts", lineNumber: 26 }); })();
|
|
148
289
|
//# sourceMappingURL=app-nav.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-nav.component.js","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-nav.component.ts","../../../../../src/lib/shell/components/header/app-nav.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"app-nav.component.js","sourceRoot":"","sources":["../../../../../src/lib/shell/components/header/app-nav.component.ts","../../../../../src/lib/shell/components/header/app-nav.component.html"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-cache-manager.d.ts","sourceRoot":"","sources":["../../../../../src/lib/shell/components/tabs/component-cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAElC,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC;IAGlD,cAAc,EAAE,WAAW,CAAC;IAG5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/B,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAGhB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,KAAK,CAA0C;gBAEnC,MAAM,EAAE,cAAc;IAE1C;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAMrF;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAgBrG;;OAEG;IACH,cAAc,CACZ,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,EACjD,cAAc,EAAE,WAAW,EAC3B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,GACZ,IAAI;
|
|
1
|
+
{"version":3,"file":"component-cache-manager.d.ts","sourceRoot":"","sources":["../../../../../src/lib/shell/components/tabs/component-cache-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAElC,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,CAAC;IAGlD,cAAc,EAAE,WAAW,CAAC;IAG5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/B,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAGhB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,qBAAa,qBAAqB;IAGpB,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,KAAK,CAA0C;gBAEnC,MAAM,EAAE,cAAc;IAE1C;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAMrF;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAgBrG;;OAEG;IACH,cAAc,CACZ,YAAY,EAAE,YAAY,CAAC,qBAAqB,CAAC,EACjD,cAAc,EAAE,WAAW,EAC3B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,GACZ,IAAI;IAuBP;;OAEG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAW1F;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAiBzD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAO9D;;OAEG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiB7E;;OAEG;IACH,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAmB5C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAYlB;;OAEG;IACH,aAAa,IAAI;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC;CAqBF"}
|
|
@@ -62,7 +62,6 @@ export class ComponentCacheManager {
|
|
|
62
62
|
resourceData
|
|
63
63
|
};
|
|
64
64
|
this.cache.set(key, info);
|
|
65
|
-
console.log(`💾 Cached component: ${resourceData.ResourceType} (key: ${key})`);
|
|
66
65
|
}
|
|
67
66
|
/**
|
|
68
67
|
* Mark a component as attached to a tab
|
|
@@ -74,7 +73,6 @@ export class ComponentCacheManager {
|
|
|
74
73
|
info.isAttached = true;
|
|
75
74
|
info.attachedToTabId = tabId;
|
|
76
75
|
info.lastUsed = new Date();
|
|
77
|
-
console.log(`📌 Attached component: ${resourceType} to tab ${tabId}`);
|
|
78
76
|
}
|
|
79
77
|
}
|
|
80
78
|
/**
|
|
@@ -91,7 +89,6 @@ export class ComponentCacheManager {
|
|
|
91
89
|
info.isAttached = false;
|
|
92
90
|
info.attachedToTabId = null;
|
|
93
91
|
info.lastUsed = new Date();
|
|
94
|
-
console.log(`📎 Detached component: ${info.resourceType} from tab ${tabId}`);
|
|
95
92
|
return info;
|
|
96
93
|
}
|
|
97
94
|
/**
|
|
@@ -116,7 +113,6 @@ export class ComponentCacheManager {
|
|
|
116
113
|
info.componentRef.destroy();
|
|
117
114
|
// Remove from cache
|
|
118
115
|
this.cache.delete(key);
|
|
119
|
-
console.log(`🗑️ Destroyed component: ${resourceType}`);
|
|
120
116
|
}
|
|
121
117
|
/**
|
|
122
118
|
* Remove and destroy component by tab ID
|
|
@@ -133,14 +129,12 @@ export class ComponentCacheManager {
|
|
|
133
129
|
info.componentRef.destroy();
|
|
134
130
|
// Remove from cache
|
|
135
131
|
this.cache.delete(key);
|
|
136
|
-
console.log(`🗑️ Destroyed component by tab ID: ${tabId}`);
|
|
137
132
|
}
|
|
138
133
|
/**
|
|
139
134
|
* Clear the entire cache, destroying all components
|
|
140
135
|
* Call this manually when needed (e.g., user logout, app shutdown)
|
|
141
136
|
*/
|
|
142
137
|
clearCache() {
|
|
143
|
-
console.log(`🧹 Clearing component cache (${this.cache.size} components)`);
|
|
144
138
|
// Destroy all components
|
|
145
139
|
this.cache.forEach(info => {
|
|
146
140
|
this.appRef.detachView(info.componentRef.hostView);
|