@memberjunction/ng-explorer-core 6.2.0-edge.5 → 6.2.0-edge.7

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.
Files changed (76) hide show
  1. package/README.md +7 -2
  2. package/dist/app-routing.module.d.ts.map +1 -1
  3. package/dist/app-routing.module.js +22 -4
  4. package/dist/app-routing.module.js.map +1 -1
  5. package/dist/generated/lazy-feature-config.d.ts +1 -1
  6. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  7. package/dist/generated/lazy-feature-config.js +16 -2
  8. package/dist/generated/lazy-feature-config.js.map +1 -1
  9. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +2 -2
  10. package/dist/lib/office/office-connect.component.d.ts +19 -0
  11. package/dist/lib/office/office-connect.component.d.ts.map +1 -0
  12. package/dist/lib/office/office-connect.component.js +80 -0
  13. package/dist/lib/office/office-connect.component.js.map +1 -0
  14. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +7 -0
  15. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  16. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +20 -8
  17. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  18. package/dist/lib/resource-wrappers/dashboard-class-resolution.d.ts +14 -0
  19. package/dist/lib/resource-wrappers/dashboard-class-resolution.d.ts.map +1 -0
  20. package/dist/lib/resource-wrappers/dashboard-class-resolution.js +21 -0
  21. package/dist/lib/resource-wrappers/dashboard-class-resolution.js.map +1 -0
  22. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  23. package/dist/lib/resource-wrappers/dashboard-resource.component.js +3 -2
  24. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  25. package/dist/lib/resource-wrappers/record-form-mode.d.ts +44 -0
  26. package/dist/lib/resource-wrappers/record-form-mode.d.ts.map +1 -0
  27. package/dist/lib/resource-wrappers/record-form-mode.js +47 -0
  28. package/dist/lib/resource-wrappers/record-form-mode.js.map +1 -0
  29. package/dist/lib/resource-wrappers/record-resource.component.d.ts +56 -1
  30. package/dist/lib/resource-wrappers/record-resource.component.d.ts.map +1 -1
  31. package/dist/lib/resource-wrappers/record-resource.component.js +124 -9
  32. package/dist/lib/resource-wrappers/record-resource.component.js.map +1 -1
  33. package/dist/lib/resource-wrappers/standard-form-create.d.ts +4 -0
  34. package/dist/lib/resource-wrappers/standard-form-create.d.ts.map +1 -0
  35. package/dist/lib/resource-wrappers/standard-form-create.js +6 -0
  36. package/dist/lib/resource-wrappers/standard-form-create.js.map +1 -0
  37. package/dist/lib/resource-wrappers/view-resource.component.d.ts +18 -1
  38. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  39. package/dist/lib/resource-wrappers/view-resource.component.js +105 -39
  40. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  41. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +2 -2
  42. package/dist/lib/shell/components/record-open/record-origin-crumb.component.d.ts.map +1 -1
  43. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +12 -8
  44. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js.map +1 -1
  45. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +6 -0
  46. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  47. package/dist/lib/shell/components/tabs/component-cache-manager.js +18 -3
  48. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  49. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +2 -0
  50. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  51. package/dist/lib/shell/components/tabs/tab-container.component.js +38 -10
  52. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  53. package/dist/lib/shell/shell-chrome-policy.d.ts +6 -0
  54. package/dist/lib/shell/shell-chrome-policy.d.ts.map +1 -1
  55. package/dist/lib/shell/shell-chrome-policy.js +1 -0
  56. package/dist/lib/shell/shell-chrome-policy.js.map +1 -1
  57. package/dist/lib/shell/shell.component.d.ts +23 -0
  58. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  59. package/dist/lib/shell/shell.component.js +283 -71
  60. package/dist/lib/shell/shell.component.js.map +1 -1
  61. package/dist/lib/single-list-detail/single-list-detail.component.js +2 -2
  62. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  63. package/dist/lib/single-record/single-record.component.d.ts +27 -2
  64. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  65. package/dist/lib/single-record/single-record.component.js +54 -8
  66. package/dist/lib/single-record/single-record.component.js.map +1 -1
  67. package/dist/lib/user-notifications/user-notifications.component.d.ts +24 -2
  68. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  69. package/dist/lib/user-notifications/user-notifications.component.js +139 -24
  70. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  71. package/dist/lib/user-profile/user-profile.component.js +2 -2
  72. package/dist/module.d.ts +64 -63
  73. package/dist/module.d.ts.map +1 -1
  74. package/dist/module.js +3 -0
  75. package/dist/module.js.map +1 -1
  76. package/package.json +58 -57
@@ -1,7 +1,7 @@
1
1
  import { Component, ViewChild, runInInjectionContext, createComponent, ViewEncapsulation, HostListener, Output, EventEmitter, inject } from '@angular/core';
2
2
  import { GoldenLayoutManager, FlattenLayoutToSingleStack, TabService } from '@memberjunction/ng-base-application';
3
3
  import { MJGlobal } from '@memberjunction/global';
4
- import { BaseResourceComponent, HomeAppPinService, NavigationService, IsRecordTabsStyle, IsRecordsTabConfiguration, IsRecordsRegionTab, IsRecordDockedToWorkspace, RECORD_DOCKED_TO_WORKSPACE_KEY, GetRecordSourceContext, SafeDetectChanges, ExplorerBreakpointService, ResolveRecordTypeIcon, GetDeletedRecordFromEvent, RecordTabShowsRecord, RemoveDeletedRecordFromOrigin, OriginToTabConfiguration, OriginHasReturnTarget, NormalizeRecordIdForMatch } from '@memberjunction/ng-shared';
4
+ import { BaseResourceComponent, HomeAppPinService, NavigationService, IsRecordTabsStyle, IsRecordsTabConfiguration, IsRecordsRegionTab, IsRecordDockedToWorkspace, RECORD_DOCKED_TO_WORKSPACE_KEY, GetRecordSourceContext, SafeDetectChanges, ExplorerBreakpointService, ResolveRecordTypeIcon, ResolveRecordTabDisplayTitle, GetDeletedRecordFromEvent, RecordTabShowsRecord, RemoveDeletedRecordFromOrigin, OriginToTabConfiguration, OriginHasReturnTarget, NormalizeRecordIdForMatch } from '@memberjunction/ng-shared';
5
5
  import { ResourceData, ResourcePermissionEngine } from '@memberjunction/core-entities';
6
6
  import { RecordOriginCrumbComponent } from '../record-open/record-origin-crumb.component';
7
7
  import { RecordSwitcherService } from '../record-open/record-switcher.service';
@@ -419,7 +419,7 @@ export class TabContainerComponent extends BaseAngularComponent {
419
419
  const activeTab = config.tabs.find(t => t.id === config.activeTabId);
420
420
  if (activeTab && this.isRecordTab(activeTab)) {
421
421
  const app = this.appManager.GetAppById(activeTab.applicationId);
422
- this.RecordBarTitle = activeTab.title;
422
+ this.RecordBarTitle = this.resolveTabTitle(activeTab);
423
423
  this.RecordBarIcon = ResolveRecordTypeIcon(activeTab.configuration, this.ProviderToUse);
424
424
  this.RecordBarColor = app?.GetColor() || DEFAULT_APP_COLOR;
425
425
  }
@@ -446,13 +446,16 @@ export class TabContainerComponent extends BaseAngularComponent {
446
446
  : null;
447
447
  return {
448
448
  TabId: tab.id,
449
- Title: tab.title,
449
+ Title: this.resolveTabTitle(tab),
450
450
  Icon: ResolveRecordTypeIcon(tab.configuration, this.ProviderToUse),
451
451
  Color: app?.GetColor() || DEFAULT_APP_COLOR,
452
452
  OriginLabel: originLabel,
453
453
  IsActive: tab.id === activeTabId
454
454
  };
455
455
  }
456
+ resolveTabTitle(tab) {
457
+ return ResolveRecordTabDisplayTitle(tab, this.ProviderToUse) || tab.title;
458
+ }
456
459
  /** True while the RECORDS region is the visible surface (active tab is a record) */
457
460
  ShowRecordsRegion = false;
458
461
  /**
@@ -549,7 +552,7 @@ export class TabContainerComponent extends BaseAngularComponent {
549
552
  const app = this.appManager.GetAppById(tab.applicationId);
550
553
  this.recordsLayoutManager.UpdateTabStyle(tab.id, {
551
554
  isPinned: tab.isPinned,
552
- title: tab.title,
555
+ title: this.resolveTabTitle(tab),
553
556
  appColor: app?.GetColor() || DEFAULT_APP_COLOR,
554
557
  typeIcon: this.resolveTabTypeIcon(tab)
555
558
  });
@@ -842,7 +845,7 @@ export class TabContainerComponent extends BaseAngularComponent {
842
845
  tabId: tab.id,
843
846
  appId: tab.applicationId,
844
847
  appColor: app?.GetColor() || DEFAULT_APP_COLOR,
845
- title: tab.title,
848
+ title: this.resolveTabTitle(tab),
846
849
  route: tab.configuration['route'] || '',
847
850
  isPinned: tab.isPinned,
848
851
  isLoaded: false,
@@ -1465,7 +1468,7 @@ export class TabContainerComponent extends BaseAngularComponent {
1465
1468
  const driverClass = resourceData.Configuration?.resourceTypeDriverClass || resourceData.ResourceType;
1466
1469
  // Entity name discriminates between "new record" tabs of different entities (all
1467
1470
  // have empty ResourceRecordID otherwise). For non-Records resources this is undefined.
1468
- const cacheDiscriminator = resourceData.Configuration?.Entity;
1471
+ const cacheDiscriminator = this.resolveCacheDiscriminator(resourceData.Configuration);
1469
1472
  // **OPTIMIZATION: Check cache first to reuse existing loaded component**
1470
1473
  const cached = this.cacheManager.getCachedComponent(driverClass, resourceData.ResourceRecordID || '', activeTab.applicationId, cacheDiscriminator);
1471
1474
  if (cached) {
@@ -1893,13 +1896,15 @@ export class TabContainerComponent extends BaseAngularComponent {
1893
1896
  // IMPORTANT: Check both resourceRecordId AND configuration.recordId
1894
1897
  // because for nav items, the recordId is stored in configuration, not resourceRecordId
1895
1898
  const effectiveRecordId = tab.resourceRecordId || tab.configuration?.recordId || '';
1899
+ const effectiveAbv = tab.configuration?.['AlternateBaseView'] || tab.configuration?.['alternateBaseView'] || '';
1896
1900
  const parts = [
1897
1901
  tab.applicationId,
1898
1902
  tab.configuration?.resourceType || '',
1899
1903
  tab.configuration?.driverClass || '',
1900
1904
  tab.configuration?.Entity || '', // Include Entity name for Records resource type
1901
1905
  effectiveRecordId,
1902
- tab.configuration?.route || ''
1906
+ tab.configuration?.route || '',
1907
+ effectiveAbv
1903
1908
  ];
1904
1909
  return parts.join('|');
1905
1910
  }
@@ -1913,7 +1918,7 @@ export class TabContainerComponent extends BaseAngularComponent {
1913
1918
  tabId: tab.id,
1914
1919
  appId: tab.applicationId,
1915
1920
  appColor,
1916
- title: tab.title,
1921
+ title: this.resolveTabTitle(tab),
1917
1922
  route: tab.configuration['route'] || '',
1918
1923
  isPinned: tab.isPinned,
1919
1924
  isLoaded: false,
@@ -2018,7 +2023,7 @@ export class TabContainerComponent extends BaseAngularComponent {
2018
2023
  const driverClass = resourceData.Configuration?.resourceTypeDriverClass || resourceData.ResourceType;
2019
2024
  // Discriminate distinct "new record" tabs of different entities (all have empty
2020
2025
  // ResourceRecordID otherwise — would silently collide in the cache).
2021
- const cacheDiscriminator = resourceData.Configuration?.Entity;
2026
+ const cacheDiscriminator = this.resolveCacheDiscriminator(resourceData.Configuration);
2022
2027
  // Check if we have a cached component for this resource
2023
2028
  const cached = this.cacheManager.getCachedComponent(driverClass, resourceData.ResourceRecordID || '', tab.applicationId, cacheDiscriminator);
2024
2029
  if (cached) {
@@ -2513,6 +2518,8 @@ export class TabContainerComponent extends BaseAngularComponent {
2513
2518
  // reload from being handed back the component it just detached.
2514
2519
  const existingEntity = existingResourceData?.Configuration?.Entity;
2515
2520
  const newEntity = tab.configuration['Entity'];
2521
+ const existingAbv = (existingResourceData?.Configuration?.['AlternateBaseView'] ?? existingResourceData?.Configuration?.['alternateBaseView']) || '';
2522
+ const newAbv = (tab.configuration['AlternateBaseView'] ?? tab.configuration['alternateBaseView']) || '';
2516
2523
  // The record id comparison accepts the URL-segment form ResourceRecordSaved writes into
2517
2524
  // the component's Data ('ID|<uuid>' for a tab that keeps '<uuid>'). An exact comparison
2518
2525
  // reloads the same cached component on every configuration emission, and each reload
@@ -2521,6 +2528,7 @@ export class TabContainerComponent extends BaseAngularComponent {
2521
2528
  existingResourceData?.Configuration?.applicationId !== tab.applicationId ||
2522
2529
  !TabContainerComponent.IsSameRecordId(existingRecordId, newRecordId) ||
2523
2530
  existingEntity !== newEntity ||
2531
+ existingAbv !== newAbv ||
2524
2532
  (tab.configuration['resourceType'] === 'Custom' && existingDriverClass !== newDriverClass);
2525
2533
  if (needsReload) {
2526
2534
  // Clean up old component
@@ -2548,7 +2556,7 @@ export class TabContainerComponent extends BaseAngularComponent {
2548
2556
  const app = this.appManager.GetAppById(tab.applicationId);
2549
2557
  const styleUpdate = {
2550
2558
  isPinned: tab.isPinned,
2551
- title: tab.title,
2559
+ title: this.resolveTabTitle(tab),
2552
2560
  appColor: app?.GetColor() || DEFAULT_APP_COLOR
2553
2561
  };
2554
2562
  if (IsRecordsTabConfiguration(tab.configuration)) {
@@ -3032,6 +3040,26 @@ export class TabContainerComponent extends BaseAngularComponent {
3032
3040
  // Unblock the shell's first-load gate so the loading overlay clears.
3033
3041
  this.emitFirstLoadCompleteOnce();
3034
3042
  }
3043
+ resolveCacheDiscriminator(configuration) {
3044
+ if (typeof ComponentCacheManager.GetCacheDiscriminator === 'function') {
3045
+ return ComponentCacheManager.GetCacheDiscriminator(configuration);
3046
+ }
3047
+ if (!configuration) {
3048
+ return undefined;
3049
+ }
3050
+ const entity = typeof configuration['Entity'] === 'string' && configuration['Entity'].trim().length > 0
3051
+ ? configuration['Entity'].trim()
3052
+ : '';
3053
+ const rawAbv = configuration['AlternateBaseView'];
3054
+ const abv = typeof rawAbv === 'string' && rawAbv.trim().length > 0 ? rawAbv.trim() : '';
3055
+ if (!entity && !abv) {
3056
+ return undefined;
3057
+ }
3058
+ if (entity && abv) {
3059
+ return `${entity}|abv:${abv}`;
3060
+ }
3061
+ return entity || `abv:${abv}`;
3062
+ }
3035
3063
  static ɵfac = function TabContainerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TabContainerComponent)(i0.ɵɵdirectiveInject(i1.GoldenLayoutManager), i0.ɵɵdirectiveInject(i1.WorkspaceStateManager), i0.ɵɵdirectiveInject(i1.ApplicationManager), i0.ɵɵdirectiveInject(i0.ApplicationRef), i0.ɵɵdirectiveInject(i0.EnvironmentInjector), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
3036
3064
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TabContainerComponent, selectors: [["mj-tab-container"]], viewQuery: function TabContainerComponent_Query(rf, ctx) { if (rf & 1) {
3037
3065
  i0.ɵɵviewQuery(_c0, 5)(_c1, 5)(_c2, 5);