@memberjunction/ng-explorer-core 5.39.0 → 5.40.1

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 (31) hide show
  1. package/dist/app-routing.module.d.ts.map +1 -1
  2. package/dist/app-routing.module.js +13 -13
  3. package/dist/app-routing.module.js.map +1 -1
  4. package/dist/generated/lazy-feature-config.d.ts +1 -1
  5. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  6. package/dist/generated/lazy-feature-config.js +3 -2
  7. package/dist/generated/lazy-feature-config.js.map +1 -1
  8. package/dist/lib/guards/app-lock-guard.service.d.ts +26 -0
  9. package/dist/lib/guards/app-lock-guard.service.d.ts.map +1 -0
  10. package/dist/lib/guards/app-lock-guard.service.js +55 -0
  11. package/dist/lib/guards/app-lock-guard.service.js.map +1 -0
  12. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  13. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +40 -27
  14. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  15. package/dist/lib/resource-wrappers/view-resource.component.d.ts +6 -5
  16. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  17. package/dist/lib/resource-wrappers/view-resource.component.js +19 -24
  18. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  19. package/dist/lib/shell/shell.component.d.ts +19 -2
  20. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  21. package/dist/lib/shell/shell.component.js +342 -184
  22. package/dist/lib/shell/shell.component.js.map +1 -1
  23. package/dist/lib/single-search-result/single-search-result.component.d.ts +3 -8
  24. package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
  25. package/dist/lib/single-search-result/single-search-result.component.js +19 -68
  26. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  27. package/dist/public-api.d.ts +1 -0
  28. package/dist/public-api.d.ts.map +1 -1
  29. package/dist/public-api.js +1 -0
  30. package/dist/public-api.js.map +1 -1
  31. package/package.json +46 -46
@@ -1,7 +1,7 @@
1
1
  import { EventEmitter, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { EntityInfo } from '@memberjunction/core';
3
3
  import { NavigationService } from '@memberjunction/ng-shared';
4
- import { DataLoadedEvent, RecordOpenedEvent, EntityViewerConfig, EntityViewMode, GridToolbarConfig } from '@memberjunction/ng-entity-viewer';
4
+ import { DataLoadedEvent, RecordOpenedEvent, EntityViewerConfig, ViewRelatedRecordNavigation } from '@memberjunction/ng-entity-viewer';
5
5
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
6
6
  import * as i0 from "@angular/core";
7
7
  type SearchState = 'loading' | 'no-results' | 'single-result' | 'viewer';
@@ -15,15 +15,10 @@ export declare class SingleSearchResultComponent extends BaseAngularComponent im
15
15
  SearchState: SearchState;
16
16
  ResultCount: number;
17
17
  EntityInfo: EntityInfo | null;
18
- CurrentViewMode: EntityViewMode;
19
- /** Whether the current entity has date fields (enables timeline view toggle) */
20
- get HasDateFields(): boolean;
21
18
  /** Resolved icon class for the entity, matching Data Explorer's format */
22
19
  get EntityIcon(): string;
23
20
  /** Configuration for the entity-viewer — matches the Data Explorer's setup */
24
21
  ViewerConfig: Partial<EntityViewerConfig>;
25
- /** Grid toolbar config — minimal action bar (no search, no column chooser) */
26
- GridToolbarConfig: Partial<GridToolbarConfig>;
27
22
  constructor(navigationService: NavigationService, cdr: ChangeDetectorRef);
28
23
  ngOnChanges(changes: SimpleChanges): void;
29
24
  /**
@@ -35,11 +30,11 @@ export declare class SingleSearchResultComponent extends BaseAngularComponent im
35
30
  private runPreQuery;
36
31
  private setNoResults;
37
32
  private navigateToSingleResult;
38
- SetViewMode(mode: EntityViewMode): void;
39
- OnViewModeChanged(mode: EntityViewMode): void;
40
33
  OnCreateNewRecord(): void;
41
34
  OnDataLoaded(event: DataLoadedEvent): void;
42
35
  OnRecordOpened(event: RecordOpenedEvent): void;
36
+ /** Navigate to a related record requested from within a view-type renderer (e.g. a foreign-key cell). */
37
+ OnOpenRelatedRecord(nav: ViewRelatedRecordNavigation): void;
43
38
  /** Format entity icon to ensure proper Font Awesome class format */
44
39
  private formatEntityIcon;
45
40
  static ɵfac: i0.ɵɵFactoryDeclaration<SingleSearchResultComponent, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"single-search-result.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-search-result/single-search-result.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAyB,UAAU,EAA+B,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE7I,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,KAAK,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEzE,qBAMa,2BAA4B,SAAQ,oBAAqB,YAAW,SAAS;IAiDtF,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAjDG,MAAM,EAAE,MAAM,CAAM;IACpB,WAAW,EAAE,MAAM,CAAM;IACxB,YAAY,wBAA+B;IAC3C,WAAW,wBAA+B;IAEpD,WAAW,EAAE,WAAW,CAAa;IACrC,WAAW,SAAK;IAChB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IACrC,eAAe,EAAE,cAAc,CAAU;IAEhD,gFAAgF;IAChF,IAAW,aAAa,IAAI,OAAO,CAGlC;IAED,0EAA0E;IAC1E,IAAW,UAAU,IAAI,MAAM,CAK9B;IAED,8EAA8E;IACvE,YAAY,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAQ9C;IAEF,8EAA8E;IACvE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CASlD;gBAGQ,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,iBAAiB;IAIhC,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC;;;OAGG;YACW,aAAa;IAgC3B,OAAO,CAAC,cAAc;YAOR,WAAW;IAazB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,sBAAsB;IAavB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKvC,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAK7C,iBAAiB,IAAI,IAAI;IAQzB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAM1C,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIrD,oEAAoE;IACpE,OAAO,CAAC,gBAAgB;yCArKb,2BAA2B;2CAA3B,2BAA2B;CAmLvC"}
1
+ {"version":3,"file":"single-search-result.component.d.ts","sourceRoot":"","sources":["../../../src/lib/single-search-result/single-search-result.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAyB,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAEvI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,KAAK,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEzE,qBAMa,2BAA4B,SAAQ,oBAAqB,YAAW,SAAS;IA8BtF,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IA9BG,MAAM,EAAE,MAAM,CAAM;IACpB,WAAW,EAAE,MAAM,CAAM;IACxB,YAAY,wBAA+B;IAC3C,WAAW,wBAA+B;IAEpD,WAAW,EAAE,WAAW,CAAa;IACrC,WAAW,SAAK;IAChB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;IAE5C,0EAA0E;IAC1E,IAAW,UAAU,IAAI,MAAM,CAK9B;IAED,8EAA8E;IACvE,YAAY,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAQ9C;gBAGQ,iBAAiB,EAAE,iBAAiB,EACpC,GAAG,EAAE,iBAAiB;IAIhC,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC;;;OAGG;YACW,aAAa;IA+B3B,OAAO,CAAC,cAAc;YAOR,WAAW;IAazB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,sBAAsB;IAavB,iBAAiB,IAAI,IAAI;IAQzB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAM1C,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIrD,yGAAyG;IAClG,mBAAmB,CAAC,GAAG,EAAE,2BAA2B,GAAG,IAAI;IAMlE,oEAAoE;IACpE,OAAO,CAAC,gBAAgB;yCA9Ib,2BAA2B;2CAA3B,2BAA2B;CA4JvC"}
@@ -1,5 +1,5 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { RunView, CompositeKey, EntityFieldTSType } from '@memberjunction/core';
2
+ import { RunView, CompositeKey } from '@memberjunction/core';
3
3
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@memberjunction/ng-shared";
@@ -34,49 +34,21 @@ function SingleSearchResultComponent_Conditional_8_Template(rf, ctx) { if (rf &
34
34
  i0.ɵɵadvance();
35
35
  i0.ɵɵtextInterpolate3("", i0.ɵɵpipeBind1(2, 3, ctx_r0.ResultCount), " ", ctx_r0.ResultCount === 1 ? "result" : "results", " for \"", ctx_r0.searchInput, "\"");
36
36
  } }
37
- function SingleSearchResultComponent_Conditional_9_Conditional_8_Template(rf, ctx) { if (rf & 1) {
38
- const _r3 = i0.ɵɵgetCurrentView();
39
- i0.ɵɵelementStart(0, "button", 19);
40
- i0.ɵɵlistener("click", function SingleSearchResultComponent_Conditional_9_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SetViewMode("timeline")); });
41
- i0.ɵɵelement(1, "i", 20);
42
- i0.ɵɵelementEnd();
43
- } if (rf & 2) {
44
- const ctx_r0 = i0.ɵɵnextContext(2);
45
- i0.ɵɵclassProp("active", ctx_r0.CurrentViewMode === "timeline");
46
- } }
47
37
  function SingleSearchResultComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
48
38
  const _r2 = i0.ɵɵgetCurrentView();
49
39
  i0.ɵɵelementStart(0, "div", 6)(1, "button", 11);
50
40
  i0.ɵɵlistener("click", function SingleSearchResultComponent_Conditional_9_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnCreateNewRecord()); });
51
41
  i0.ɵɵelement(2, "i", 12);
52
- i0.ɵɵelementEnd();
53
- i0.ɵɵelementStart(3, "div", 13)(4, "button", 14);
54
- i0.ɵɵlistener("click", function SingleSearchResultComponent_Conditional_9_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.SetViewMode("grid")); });
55
- i0.ɵɵelement(5, "i", 15);
56
- i0.ɵɵelementEnd();
57
- i0.ɵɵelementStart(6, "button", 16);
58
- i0.ɵɵlistener("click", function SingleSearchResultComponent_Conditional_9_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.SetViewMode("cards")); });
59
- i0.ɵɵelement(7, "i", 17);
60
- i0.ɵɵelementEnd();
61
- i0.ɵɵconditionalCreate(8, SingleSearchResultComponent_Conditional_9_Conditional_8_Template, 2, 2, "button", 18);
62
42
  i0.ɵɵelementEnd()();
63
- } if (rf & 2) {
64
- const ctx_r0 = i0.ɵɵnextContext();
65
- i0.ɵɵadvance(4);
66
- i0.ɵɵclassProp("active", ctx_r0.CurrentViewMode === "grid");
67
- i0.ɵɵadvance(2);
68
- i0.ɵɵclassProp("active", ctx_r0.CurrentViewMode === "cards");
69
- i0.ɵɵadvance(2);
70
- i0.ɵɵconditional(ctx_r0.HasDateFields ? 8 : -1);
71
43
  } }
72
44
  function SingleSearchResultComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
73
45
  i0.ɵɵelementStart(0, "div", 7);
74
- i0.ɵɵelement(1, "mj-loading", 21);
46
+ i0.ɵɵelement(1, "mj-loading", 13);
75
47
  i0.ɵɵelementEnd();
76
48
  } }
77
49
  function SingleSearchResultComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
78
50
  i0.ɵɵelementStart(0, "div", 8);
79
- i0.ɵɵelement(1, "i", 22);
51
+ i0.ɵɵelement(1, "i", 14);
80
52
  i0.ɵɵelementStart(2, "p");
81
53
  i0.ɵɵtext(3, "No results found for \"");
82
54
  i0.ɵɵelementStart(4, "strong");
@@ -84,7 +56,7 @@ function SingleSearchResultComponent_Conditional_11_Template(rf, ctx) { if (rf &
84
56
  i0.ɵɵelementEnd();
85
57
  i0.ɵɵtext(6);
86
58
  i0.ɵɵelementEnd();
87
- i0.ɵɵelementStart(7, "p", 23);
59
+ i0.ɵɵelementStart(7, "p", 15);
88
60
  i0.ɵɵtext(8, "Try a different search term or entity");
89
61
  i0.ɵɵelementEnd()();
90
62
  } if (rf & 2) {
@@ -96,20 +68,20 @@ function SingleSearchResultComponent_Conditional_11_Template(rf, ctx) { if (rf &
96
68
  } }
97
69
  function SingleSearchResultComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
98
70
  i0.ɵɵelementStart(0, "div", 9);
99
- i0.ɵɵelement(1, "i", 24);
71
+ i0.ɵɵelement(1, "i", 16);
100
72
  i0.ɵɵelementStart(2, "p");
101
73
  i0.ɵɵtext(3, "Found 1 result \u2014 opening record...");
102
74
  i0.ɵɵelementEnd()();
103
75
  } }
104
76
  function SingleSearchResultComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
105
- const _r4 = i0.ɵɵgetCurrentView();
106
- i0.ɵɵelementStart(0, "div", 10)(1, "mj-entity-viewer", 25);
107
- i0.ɵɵlistener("viewModeChange", function SingleSearchResultComponent_Conditional_13_Template_mj_entity_viewer_viewModeChange_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnViewModeChanged($event)); })("dataLoaded", function SingleSearchResultComponent_Conditional_13_Template_mj_entity_viewer_dataLoaded_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnDataLoaded($event)); })("recordOpened", function SingleSearchResultComponent_Conditional_13_Template_mj_entity_viewer_recordOpened_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnRecordOpened($event)); })("addRequested", function SingleSearchResultComponent_Conditional_13_Template_mj_entity_viewer_addRequested_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnCreateNewRecord()); });
77
+ const _r3 = i0.ɵɵgetCurrentView();
78
+ i0.ɵɵelementStart(0, "div", 10)(1, "mj-entity-viewer", 17);
79
+ i0.ɵɵlistener("DataLoaded", function SingleSearchResultComponent_Conditional_13_Template_mj_entity_viewer_DataLoaded_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnDataLoaded($event)); })("RecordOpened", function SingleSearchResultComponent_Conditional_13_Template_mj_entity_viewer_RecordOpened_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnRecordOpened($event)); })("OpenRelatedRecordRequested", function SingleSearchResultComponent_Conditional_13_Template_mj_entity_viewer_OpenRelatedRecordRequested_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnOpenRelatedRecord($event)); })("CreateRecordRequested", function SingleSearchResultComponent_Conditional_13_Template_mj_entity_viewer_CreateRecordRequested_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnCreateNewRecord()); });
108
80
  i0.ɵɵelementEnd()();
109
81
  } if (rf & 2) {
110
82
  const ctx_r0 = i0.ɵɵnextContext();
111
83
  i0.ɵɵadvance();
112
- i0.ɵɵproperty("entity", ctx_r0.EntityInfo)("viewMode", ctx_r0.CurrentViewMode)("filterText", ctx_r0.searchInput)("config", ctx_r0.ViewerConfig)("showGridToolbar", true)("gridToolbarConfig", ctx_r0.GridToolbarConfig);
84
+ i0.ɵɵproperty("Entity", ctx_r0.EntityInfo)("Provider", ctx_r0.Provider)("FilterText", ctx_r0.searchInput)("Config", ctx_r0.ViewerConfig);
113
85
  } }
114
86
  export class SingleSearchResultComponent extends BaseAngularComponent {
115
87
  navigationService;
@@ -121,13 +93,6 @@ export class SingleSearchResultComponent extends BaseAngularComponent {
121
93
  SearchState = 'loading';
122
94
  ResultCount = 0;
123
95
  EntityInfo = null;
124
- CurrentViewMode = 'grid';
125
- /** Whether the current entity has date fields (enables timeline view toggle) */
126
- get HasDateFields() {
127
- if (!this.EntityInfo)
128
- return false;
129
- return this.EntityInfo.Fields.some(f => f.TSType === EntityFieldTSType.Date);
130
- }
131
96
  /** Resolved icon class for the entity, matching Data Explorer's format */
132
97
  get EntityIcon() {
133
98
  if (this.EntityInfo?.Icon) {
@@ -145,17 +110,6 @@ export class SingleSearchResultComponent extends BaseAngularComponent {
145
110
  serverSideSorting: true,
146
111
  height: '100%'
147
112
  };
148
- /** Grid toolbar config — minimal action bar (no search, no column chooser) */
149
- GridToolbarConfig = {
150
- showSearch: false,
151
- showRefresh: true,
152
- showAdd: true,
153
- showExport: true,
154
- showDelete: false,
155
- showColumnChooser: false,
156
- showRowCount: false,
157
- showSelectionCount: false
158
- };
159
113
  constructor(navigationService, cdr) {
160
114
  super();
161
115
  this.navigationService = navigationService;
@@ -173,7 +127,6 @@ export class SingleSearchResultComponent extends BaseAngularComponent {
173
127
  async ExecuteSearch() {
174
128
  this.SearchState = 'loading';
175
129
  this.ResultCount = 0;
176
- this.CurrentViewMode = 'grid';
177
130
  this.loadStarted.emit(true);
178
131
  // Resolve EntityInfo early so the header can show icon + display name during loading
179
132
  const entityInfo = this.findEntityInfo();
@@ -228,14 +181,6 @@ export class SingleSearchResultComponent extends BaseAngularComponent {
228
181
  this.loadComplete.emit(true);
229
182
  }
230
183
  // ── Header action handlers ──
231
- SetViewMode(mode) {
232
- this.CurrentViewMode = mode;
233
- this.cdr.detectChanges();
234
- }
235
- OnViewModeChanged(mode) {
236
- this.CurrentViewMode = mode;
237
- this.cdr.detectChanges();
238
- }
239
184
  OnCreateNewRecord() {
240
185
  if (this.EntityInfo) {
241
186
  this.navigationService.OpenNewEntityRecord(this.EntityInfo.Name);
@@ -250,6 +195,12 @@ export class SingleSearchResultComponent extends BaseAngularComponent {
250
195
  OnRecordOpened(event) {
251
196
  this.navigationService.OpenEntityRecord(event.entity.Name, event.compositeKey);
252
197
  }
198
+ /** Navigate to a related record requested from within a view-type renderer (e.g. a foreign-key cell). */
199
+ OnOpenRelatedRecord(nav) {
200
+ if (nav?.entityName && nav.recordKey != null) {
201
+ this.navigationService.OpenEntityRecord(nav.entityName, CompositeKey.FromID(String(nav.recordKey)));
202
+ }
203
+ }
253
204
  /** Format entity icon to ensure proper Font Awesome class format */
254
205
  formatEntityIcon(icon) {
255
206
  if (!icon) {
@@ -266,7 +217,7 @@ export class SingleSearchResultComponent extends BaseAngularComponent {
266
217
  return `fa-solid fa-${icon}`;
267
218
  }
268
219
  static ɵfac = function SingleSearchResultComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SingleSearchResultComponent)(i0.ɵɵdirectiveInject(i1.NavigationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
269
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SingleSearchResultComponent, selectors: [["mj-single-search-result"]], inputs: { entity: "entity", searchInput: "searchInput" }, outputs: { loadComplete: "loadComplete", loadStarted: "loadStarted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 14, vars: 9, consts: [[1, "search-result-container"], [1, "content-header"], [1, "header-left"], [1, "entity-icon"], [1, "entity-title"], [1, "record-count"], [1, "header-right"], [1, "loading-container"], [1, "empty-state"], [1, "single-result-state"], [1, "viewer-container"], ["title", "New Record", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "view-mode-toggle"], ["title", "Grid View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["title", "Cards View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["title", "Timeline View", 1, "toggle-btn", 3, "active"], ["title", "Timeline View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-timeline"], ["text", "Searching..."], [1, "fa-solid", "fa-magnifying-glass", "empty-icon"], [1, "empty-hint"], [1, "fa-solid", "fa-arrow-right", "redirect-icon"], [3, "viewModeChange", "dataLoaded", "recordOpened", "addRequested", "entity", "viewMode", "filterText", "config", "showGridToolbar", "gridToolbarConfig"]], template: function SingleSearchResultComponent_Template(rf, ctx) { if (rf & 1) {
220
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SingleSearchResultComponent, selectors: [["mj-single-search-result"]], inputs: { entity: "entity", searchInput: "searchInput" }, outputs: { loadComplete: "loadComplete", loadStarted: "loadStarted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 14, vars: 9, consts: [[1, "search-result-container"], [1, "content-header"], [1, "header-left"], [1, "entity-icon"], [1, "entity-title"], [1, "record-count"], [1, "header-right"], [1, "loading-container"], [1, "empty-state"], [1, "single-result-state"], [1, "viewer-container"], ["title", "New Record", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["text", "Searching..."], [1, "fa-solid", "fa-magnifying-glass", "empty-icon"], [1, "empty-hint"], [1, "fa-solid", "fa-arrow-right", "redirect-icon"], [3, "DataLoaded", "RecordOpened", "OpenRelatedRecordRequested", "CreateRecordRequested", "Entity", "Provider", "FilterText", "Config"]], template: function SingleSearchResultComponent_Template(rf, ctx) { if (rf & 1) {
270
221
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
271
222
  i0.ɵɵelement(3, "i", 3);
272
223
  i0.ɵɵelementStart(4, "h2", 4);
@@ -274,12 +225,12 @@ export class SingleSearchResultComponent extends BaseAngularComponent {
274
225
  i0.ɵɵelementEnd();
275
226
  i0.ɵɵconditionalCreate(6, SingleSearchResultComponent_Conditional_6_Template, 2, 1, "span", 5)(7, SingleSearchResultComponent_Conditional_7_Template, 2, 1, "span", 5)(8, SingleSearchResultComponent_Conditional_8_Template, 3, 5, "span", 5);
276
227
  i0.ɵɵelementEnd();
277
- i0.ɵɵconditionalCreate(9, SingleSearchResultComponent_Conditional_9_Template, 9, 5, "div", 6);
228
+ i0.ɵɵconditionalCreate(9, SingleSearchResultComponent_Conditional_9_Template, 3, 0, "div", 6);
278
229
  i0.ɵɵelementEnd();
279
230
  i0.ɵɵconditionalCreate(10, SingleSearchResultComponent_Conditional_10_Template, 2, 0, "div", 7);
280
231
  i0.ɵɵconditionalCreate(11, SingleSearchResultComponent_Conditional_11_Template, 9, 2, "div", 8);
281
232
  i0.ɵɵconditionalCreate(12, SingleSearchResultComponent_Conditional_12_Template, 4, 0, "div", 9);
282
- i0.ɵɵconditionalCreate(13, SingleSearchResultComponent_Conditional_13_Template, 2, 6, "div", 10);
233
+ i0.ɵɵconditionalCreate(13, SingleSearchResultComponent_Conditional_13_Template, 2, 4, "div", 10);
283
234
  i0.ɵɵelementEnd();
284
235
  } if (rf & 2) {
285
236
  i0.ɵɵadvance(3);
@@ -302,7 +253,7 @@ export class SingleSearchResultComponent extends BaseAngularComponent {
302
253
  }
303
254
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SingleSearchResultComponent, [{
304
255
  type: Component,
305
- args: [{ standalone: false, selector: 'mj-single-search-result', template: "<div class=\"search-result-container\">\n <!-- Content Header \u2014 matches Data Explorer layout -->\n <div class=\"content-header\">\n <div class=\"header-left\">\n <i [class]=\"EntityIcon\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ EntityInfo?.DisplayNameOrName || entity }}</h2>\n @if (SearchState === 'loading') {\n <span class=\"record-count\">Searching for \"{{ searchInput }}\"...</span>\n } @else if (SearchState === 'no-results') {\n <span class=\"record-count\">No results for \"{{ searchInput }}\"</span>\n } @else if (ResultCount > 0) {\n <span class=\"record-count\">{{ ResultCount | number }} {{ ResultCount === 1 ? 'result' : 'results' }} for \"{{ searchInput }}\"</span>\n }\n </div>\n\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"header-right\">\n <!-- New Record -->\n <button\n class=\"header-action-btn\"\n (click)=\"OnCreateNewRecord()\"\n title=\"New Record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- View Mode Toggle -->\n <div class=\"view-mode-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'grid'\"\n (click)=\"SetViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'cards'\"\n (click)=\"SetViewMode('cards')\"\n title=\"Cards View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n @if (HasDateFields) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'timeline'\"\n (click)=\"SetViewMode('timeline')\"\n title=\"Timeline View\">\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Loading state -->\n @if (SearchState === 'loading') {\n <div class=\"loading-container\">\n <mj-loading text=\"Searching...\"></mj-loading>\n </div>\n }\n\n <!-- No results -->\n @if (SearchState === 'no-results') {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-magnifying-glass empty-icon\"></i>\n <p>No results found for \"<strong>{{ searchInput }}</strong>\" in {{ entity }}</p>\n <p class=\"empty-hint\">Try a different search term or entity</p>\n </div>\n }\n\n <!-- Single result \u2014 auto-navigating to entity form -->\n @if (SearchState === 'single-result') {\n <div class=\"single-result-state\">\n <i class=\"fa-solid fa-arrow-right redirect-icon\"></i>\n <p>Found 1 result &mdash; opening record...</p>\n </div>\n }\n\n <!-- Entity Viewer (2+ results) -->\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"viewer-container\">\n <mj-entity-viewer\n [entity]=\"EntityInfo\"\n [viewMode]=\"CurrentViewMode\"\n [filterText]=\"searchInput\"\n [config]=\"ViewerConfig\"\n [showGridToolbar]=\"true\"\n [gridToolbarConfig]=\"GridToolbarConfig\"\n (viewModeChange)=\"OnViewModeChanged($event)\"\n (dataLoaded)=\"OnDataLoaded($event)\"\n (recordOpened)=\"OnRecordOpened($event)\"\n (addRequested)=\"OnCreateNewRecord()\">\n </mj-entity-viewer>\n </div>\n }\n</div>\n", styles: [".search-result-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n/* ============================================\n CONTENT HEADER \u2014 matches Data Explorer layout\n ============================================ */\n\n.content-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.entity-icon {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n/* ============================================\n HEADER RIGHT \u2014 action buttons, view mode toggle\n ============================================ */\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n/* Action Button (New Record, Export, etc.) */\n.header-action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.header-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n.header-action-btn i {\n font-size: 14px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* ============================================\n LOADING STATE\n ============================================ */\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 48px 0;\n}\n\n/* ============================================\n EMPTY STATE\n ============================================ */\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: var(--mj-text-secondary);\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-border-strong);\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 4px 0;\n font-size: 15px;\n}\n\n.empty-hint {\n color: var(--mj-text-disabled);\n font-size: 13px !important;\n}\n\n/* ============================================\n SINGLE RESULT \u2014 auto-nav state\n ============================================ */\n\n.single-result-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: var(--mj-text-secondary);\n}\n\n.redirect-icon {\n font-size: 32px;\n color: var(--mj-brand-primary);\n margin-bottom: 16px;\n}\n\n.single-result-state p {\n font-size: 15px;\n margin: 4px 0;\n}\n\n/* ============================================\n VIEWER CONTAINER\n ============================================ */\n\n.viewer-container {\n flex: 1;\n min-height: 0;\n}\n"] }]
256
+ args: [{ standalone: false, selector: 'mj-single-search-result', template: "<div class=\"search-result-container\">\n <!-- Content Header \u2014 matches Data Explorer layout -->\n <div class=\"content-header\">\n <div class=\"header-left\">\n <i [class]=\"EntityIcon\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ EntityInfo?.DisplayNameOrName || entity }}</h2>\n @if (SearchState === 'loading') {\n <span class=\"record-count\">Searching for \"{{ searchInput }}\"...</span>\n } @else if (SearchState === 'no-results') {\n <span class=\"record-count\">No results for \"{{ searchInput }}\"</span>\n } @else if (ResultCount > 0) {\n <span class=\"record-count\">{{ ResultCount | number }} {{ ResultCount === 1 ? 'result' : 'results' }} for \"{{ searchInput }}\"</span>\n }\n </div>\n\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"header-right\">\n <!-- New Record -->\n <button\n class=\"header-action-btn\"\n (click)=\"OnCreateNewRecord()\"\n title=\"New Record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n }\n </div>\n\n <!-- Loading state -->\n @if (SearchState === 'loading') {\n <div class=\"loading-container\">\n <mj-loading text=\"Searching...\"></mj-loading>\n </div>\n }\n\n <!-- No results -->\n @if (SearchState === 'no-results') {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-magnifying-glass empty-icon\"></i>\n <p>No results found for \"<strong>{{ searchInput }}</strong>\" in {{ entity }}</p>\n <p class=\"empty-hint\">Try a different search term or entity</p>\n </div>\n }\n\n <!-- Single result \u2014 auto-navigating to entity form -->\n @if (SearchState === 'single-result') {\n <div class=\"single-result-state\">\n <i class=\"fa-solid fa-arrow-right redirect-icon\"></i>\n <p>Found 1 result &mdash; opening record...</p>\n </div>\n }\n\n <!-- Entity Viewer (2+ results) -->\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"viewer-container\">\n <mj-entity-viewer\n [Entity]=\"EntityInfo\"\n [Provider]=\"Provider\"\n [FilterText]=\"searchInput\"\n [Config]=\"ViewerConfig\"\n (DataLoaded)=\"OnDataLoaded($event)\"\n (RecordOpened)=\"OnRecordOpened($event)\"\n (OpenRelatedRecordRequested)=\"OnOpenRelatedRecord($event)\"\n (CreateRecordRequested)=\"OnCreateNewRecord()\">\n </mj-entity-viewer>\n </div>\n }\n</div>\n", styles: [".search-result-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n/* ============================================\n CONTENT HEADER \u2014 matches Data Explorer layout\n ============================================ */\n\n.content-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n.entity-icon {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n/* ============================================\n HEADER RIGHT \u2014 action buttons, view mode toggle\n ============================================ */\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n/* Action Button (New Record, Export, etc.) */\n.header-action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.header-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n.header-action-btn i {\n font-size: 14px;\n}\n\n/* View Mode Toggle */\n.view-mode-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* ============================================\n LOADING STATE\n ============================================ */\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 48px 0;\n}\n\n/* ============================================\n EMPTY STATE\n ============================================ */\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: var(--mj-text-secondary);\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-border-strong);\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 4px 0;\n font-size: 15px;\n}\n\n.empty-hint {\n color: var(--mj-text-disabled);\n font-size: 13px !important;\n}\n\n/* ============================================\n SINGLE RESULT \u2014 auto-nav state\n ============================================ */\n\n.single-result-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 0;\n color: var(--mj-text-secondary);\n}\n\n.redirect-icon {\n font-size: 32px;\n color: var(--mj-brand-primary);\n margin-bottom: 16px;\n}\n\n.single-result-state p {\n font-size: 15px;\n margin: 4px 0;\n}\n\n/* ============================================\n VIEWER CONTAINER\n ============================================ */\n\n.viewer-container {\n flex: 1;\n min-height: 0;\n}\n"] }]
306
257
  }], () => [{ type: i1.NavigationService }, { type: i0.ChangeDetectorRef }], { entity: [{
307
258
  type: Input
308
259
  }], searchInput: [{
@@ -1 +1 @@
1
- {"version":3,"file":"single-search-result.component.js","sourceRoot":"","sources":["../../../src/lib/single-search-result/single-search-result.component.ts","../../../src/lib/single-search-result/single-search-result.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core';\nimport { RunView, CompositeKey, EntityInfo, EntityFieldTSType, Metadata } from '@memberjunction/core';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport { DataLoadedEvent, RecordOpenedEvent, EntityViewerConfig, EntityViewMode, GridToolbarConfig } from '@memberjunction/ng-entity-viewer';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\ntype SearchState = 'loading' | 'no-results' | 'single-result' | 'viewer';\n\n@Component({\n standalone: false,\n selector: 'mj-single-search-result',\n templateUrl: './single-search-result.component.html',\n styleUrls: ['./single-search-result.component.css']\n})\nexport class SingleSearchResultComponent extends BaseAngularComponent implements OnChanges {\n @Input() public entity: string = '';\n @Input() public searchInput: string = '';\n @Output() public loadComplete = new EventEmitter<boolean>();\n @Output() public loadStarted = new EventEmitter<boolean>();\n\n public SearchState: SearchState = 'loading';\n public ResultCount = 0;\n public EntityInfo: EntityInfo | null = null;\n public CurrentViewMode: EntityViewMode = 'grid';\n\n /** Whether the current entity has date fields (enables timeline view toggle) */\n public get HasDateFields(): boolean {\n if (!this.EntityInfo) return false;\n return this.EntityInfo.Fields.some(f => f.TSType === EntityFieldTSType.Date);\n }\n\n /** Resolved icon class for the entity, matching Data Explorer's format */\n public get EntityIcon(): string {\n if (this.EntityInfo?.Icon) {\n return this.formatEntityIcon(this.EntityInfo.Icon);\n }\n return 'fa-solid fa-table';\n }\n\n /** Configuration for the entity-viewer — matches the Data Explorer's setup */\n public ViewerConfig: Partial<EntityViewerConfig> = {\n showFilter: false,\n showViewModeToggle: false,\n showRecordCount: false,\n showPagination: true,\n serverSideFiltering: true,\n serverSideSorting: true,\n height: '100%'\n };\n\n /** Grid toolbar config — minimal action bar (no search, no column chooser) */\n public GridToolbarConfig: Partial<GridToolbarConfig> = {\n showSearch: false,\n showRefresh: true,\n showAdd: true,\n showExport: true,\n showDelete: false,\n showColumnChooser: false,\n showRowCount: false,\n showSelectionCount: false\n };\n\n constructor(\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['entity'] || changes['searchInput']) && this.entity && this.searchInput) {\n this.ExecuteSearch();\n }\n }\n\n /**\n * Runs a lightweight pre-query (MaxRows: 2, PK fields only) to determine result count,\n * then routes to the appropriate state: no-results, single-result auto-nav, or viewer.\n */\n private async ExecuteSearch(): Promise<void> {\n this.SearchState = 'loading';\n this.ResultCount = 0;\n this.CurrentViewMode = 'grid';\n this.loadStarted.emit(true);\n\n // Resolve EntityInfo early so the header can show icon + display name during loading\n const entityInfo = this.findEntityInfo();\n this.EntityInfo = entityInfo ?? null;\n this.cdr.detectChanges();\n\n if (!entityInfo) {\n this.setNoResults();\n return;\n }\n\n const result = await this.runPreQuery(entityInfo);\n if (!result.Success || result.Results.length === 0) {\n this.setNoResults();\n return;\n }\n\n if (result.Results.length === 1) {\n this.navigateToSingleResult(entityInfo, result.Results[0]);\n return;\n }\n\n // 2+ results — show the entity-viewer\n this.SearchState = 'viewer';\n this.cdr.detectChanges();\n }\n\n private findEntityInfo(): EntityInfo | undefined {\n const md = this.ProviderToUse;\n return md.Entities.find(e =>\n e.Name.trim().toLowerCase() === this.entity.trim().toLowerCase()\n );\n }\n\n private async runPreQuery(entityInfo: EntityInfo) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const pkFields = entityInfo.PrimaryKeys.map(pk => pk.Name);\n return rv.RunView<Record<string, unknown>>({\n EntityName: this.entity,\n ExtraFilter: 'ID IS NOT NULL',\n UserSearchString: this.searchInput,\n Fields: pkFields,\n ResultType: 'simple',\n MaxRows: 2,\n });\n }\n\n private setNoResults(): void {\n this.SearchState = 'no-results';\n this.ResultCount = 0;\n this.loadComplete.emit(true);\n this.cdr.detectChanges();\n }\n\n private navigateToSingleResult(entityInfo: EntityInfo, record: Record<string, unknown>): void {\n this.SearchState = 'single-result';\n this.ResultCount = 1;\n this.cdr.detectChanges();\n\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromEntityInfoAndRecord(entityInfo, record);\n this.navigationService.OpenEntityRecord(entityInfo.Name, compositeKey);\n this.loadComplete.emit(true);\n }\n\n // ── Header action handlers ──\n\n public SetViewMode(mode: EntityViewMode): void {\n this.CurrentViewMode = mode;\n this.cdr.detectChanges();\n }\n\n public OnViewModeChanged(mode: EntityViewMode): void {\n this.CurrentViewMode = mode;\n this.cdr.detectChanges();\n }\n\n public OnCreateNewRecord(): void {\n if (this.EntityInfo) {\n this.navigationService.OpenNewEntityRecord(this.EntityInfo.Name);\n }\n }\n\n // ── Entity-viewer event handlers ──\n\n public OnDataLoaded(event: DataLoadedEvent): void {\n this.ResultCount = event.totalRowCount;\n this.loadComplete.emit(true);\n this.cdr.detectChanges();\n }\n\n public OnRecordOpened(event: RecordOpenedEvent): void {\n this.navigationService.OpenEntityRecord(event.entity.Name, event.compositeKey);\n }\n\n /** Format entity icon to ensure proper Font Awesome class format */\n private formatEntityIcon(icon: string): string {\n if (!icon) {\n return 'fa-solid fa-table';\n }\n if (icon.startsWith('fa-solid') || icon.startsWith('fa-regular') ||\n icon.startsWith('fa-light') || icon.startsWith('fa-brands') ||\n icon.startsWith('fa ')) {\n return icon;\n }\n if (icon.startsWith('fa-')) {\n return `fa-solid ${icon}`;\n }\n return `fa-solid fa-${icon}`;\n }\n}\n","<div class=\"search-result-container\">\n <!-- Content Header — matches Data Explorer layout -->\n <div class=\"content-header\">\n <div class=\"header-left\">\n <i [class]=\"EntityIcon\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ EntityInfo?.DisplayNameOrName || entity }}</h2>\n @if (SearchState === 'loading') {\n <span class=\"record-count\">Searching for \"{{ searchInput }}\"...</span>\n } @else if (SearchState === 'no-results') {\n <span class=\"record-count\">No results for \"{{ searchInput }}\"</span>\n } @else if (ResultCount > 0) {\n <span class=\"record-count\">{{ ResultCount | number }} {{ ResultCount === 1 ? 'result' : 'results' }} for \"{{ searchInput }}\"</span>\n }\n </div>\n\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"header-right\">\n <!-- New Record -->\n <button\n class=\"header-action-btn\"\n (click)=\"OnCreateNewRecord()\"\n title=\"New Record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- View Mode Toggle -->\n <div class=\"view-mode-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'grid'\"\n (click)=\"SetViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'cards'\"\n (click)=\"SetViewMode('cards')\"\n title=\"Cards View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n @if (HasDateFields) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"CurrentViewMode === 'timeline'\"\n (click)=\"SetViewMode('timeline')\"\n title=\"Timeline View\">\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Loading state -->\n @if (SearchState === 'loading') {\n <div class=\"loading-container\">\n <mj-loading text=\"Searching...\"></mj-loading>\n </div>\n }\n\n <!-- No results -->\n @if (SearchState === 'no-results') {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-magnifying-glass empty-icon\"></i>\n <p>No results found for \"<strong>{{ searchInput }}</strong>\" in {{ entity }}</p>\n <p class=\"empty-hint\">Try a different search term or entity</p>\n </div>\n }\n\n <!-- Single result — auto-navigating to entity form -->\n @if (SearchState === 'single-result') {\n <div class=\"single-result-state\">\n <i class=\"fa-solid fa-arrow-right redirect-icon\"></i>\n <p>Found 1 result &mdash; opening record...</p>\n </div>\n }\n\n <!-- Entity Viewer (2+ results) -->\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"viewer-container\">\n <mj-entity-viewer\n [entity]=\"EntityInfo\"\n [viewMode]=\"CurrentViewMode\"\n [filterText]=\"searchInput\"\n [config]=\"ViewerConfig\"\n [showGridToolbar]=\"true\"\n [gridToolbarConfig]=\"GridToolbarConfig\"\n (viewModeChange)=\"OnViewModeChanged($event)\"\n (dataLoaded)=\"OnDataLoaded($event)\"\n (recordOpened)=\"OnRecordOpened($event)\"\n (addRequested)=\"OnCreateNewRecord()\">\n </mj-entity-viewer>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"single-search-result.component.js","sourceRoot":"","sources":["../../../src/lib/single-search-result/single-search-result.component.ts","../../../src/lib/single-search-result/single-search-result.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core';\nimport { RunView, CompositeKey, EntityInfo } from '@memberjunction/core';\nimport { NavigationService } from '@memberjunction/ng-shared';\nimport { DataLoadedEvent, RecordOpenedEvent, EntityViewerConfig, ViewRelatedRecordNavigation } from '@memberjunction/ng-entity-viewer';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\ntype SearchState = 'loading' | 'no-results' | 'single-result' | 'viewer';\n\n@Component({\n standalone: false,\n selector: 'mj-single-search-result',\n templateUrl: './single-search-result.component.html',\n styleUrls: ['./single-search-result.component.css']\n})\nexport class SingleSearchResultComponent extends BaseAngularComponent implements OnChanges {\n @Input() public entity: string = '';\n @Input() public searchInput: string = '';\n @Output() public loadComplete = new EventEmitter<boolean>();\n @Output() public loadStarted = new EventEmitter<boolean>();\n\n public SearchState: SearchState = 'loading';\n public ResultCount = 0;\n public EntityInfo: EntityInfo | null = null;\n\n /** Resolved icon class for the entity, matching Data Explorer's format */\n public get EntityIcon(): string {\n if (this.EntityInfo?.Icon) {\n return this.formatEntityIcon(this.EntityInfo.Icon);\n }\n return 'fa-solid fa-table';\n }\n\n /** Configuration for the entity-viewer — matches the Data Explorer's setup */\n public ViewerConfig: Partial<EntityViewerConfig> = {\n showFilter: false,\n showViewModeToggle: false,\n showRecordCount: false,\n showPagination: true,\n serverSideFiltering: true,\n serverSideSorting: true,\n height: '100%'\n };\n\n constructor(\n private navigationService: NavigationService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['entity'] || changes['searchInput']) && this.entity && this.searchInput) {\n this.ExecuteSearch();\n }\n }\n\n /**\n * Runs a lightweight pre-query (MaxRows: 2, PK fields only) to determine result count,\n * then routes to the appropriate state: no-results, single-result auto-nav, or viewer.\n */\n private async ExecuteSearch(): Promise<void> {\n this.SearchState = 'loading';\n this.ResultCount = 0;\n this.loadStarted.emit(true);\n\n // Resolve EntityInfo early so the header can show icon + display name during loading\n const entityInfo = this.findEntityInfo();\n this.EntityInfo = entityInfo ?? null;\n this.cdr.detectChanges();\n\n if (!entityInfo) {\n this.setNoResults();\n return;\n }\n\n const result = await this.runPreQuery(entityInfo);\n if (!result.Success || result.Results.length === 0) {\n this.setNoResults();\n return;\n }\n\n if (result.Results.length === 1) {\n this.navigateToSingleResult(entityInfo, result.Results[0]);\n return;\n }\n\n // 2+ results — show the entity-viewer\n this.SearchState = 'viewer';\n this.cdr.detectChanges();\n }\n\n private findEntityInfo(): EntityInfo | undefined {\n const md = this.ProviderToUse;\n return md.Entities.find(e =>\n e.Name.trim().toLowerCase() === this.entity.trim().toLowerCase()\n );\n }\n\n private async runPreQuery(entityInfo: EntityInfo) {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const pkFields = entityInfo.PrimaryKeys.map(pk => pk.Name);\n return rv.RunView<Record<string, unknown>>({\n EntityName: this.entity,\n ExtraFilter: 'ID IS NOT NULL',\n UserSearchString: this.searchInput,\n Fields: pkFields,\n ResultType: 'simple',\n MaxRows: 2,\n });\n }\n\n private setNoResults(): void {\n this.SearchState = 'no-results';\n this.ResultCount = 0;\n this.loadComplete.emit(true);\n this.cdr.detectChanges();\n }\n\n private navigateToSingleResult(entityInfo: EntityInfo, record: Record<string, unknown>): void {\n this.SearchState = 'single-result';\n this.ResultCount = 1;\n this.cdr.detectChanges();\n\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromEntityInfoAndRecord(entityInfo, record);\n this.navigationService.OpenEntityRecord(entityInfo.Name, compositeKey);\n this.loadComplete.emit(true);\n }\n\n // ── Header action handlers ──\n\n public OnCreateNewRecord(): void {\n if (this.EntityInfo) {\n this.navigationService.OpenNewEntityRecord(this.EntityInfo.Name);\n }\n }\n\n // ── Entity-viewer event handlers ──\n\n public OnDataLoaded(event: DataLoadedEvent): void {\n this.ResultCount = event.totalRowCount;\n this.loadComplete.emit(true);\n this.cdr.detectChanges();\n }\n\n public OnRecordOpened(event: RecordOpenedEvent): void {\n this.navigationService.OpenEntityRecord(event.entity.Name, event.compositeKey);\n }\n\n /** Navigate to a related record requested from within a view-type renderer (e.g. a foreign-key cell). */\n public OnOpenRelatedRecord(nav: ViewRelatedRecordNavigation): void {\n if (nav?.entityName && nav.recordKey != null) {\n this.navigationService.OpenEntityRecord(nav.entityName, CompositeKey.FromID(String(nav.recordKey)));\n }\n }\n\n /** Format entity icon to ensure proper Font Awesome class format */\n private formatEntityIcon(icon: string): string {\n if (!icon) {\n return 'fa-solid fa-table';\n }\n if (icon.startsWith('fa-solid') || icon.startsWith('fa-regular') ||\n icon.startsWith('fa-light') || icon.startsWith('fa-brands') ||\n icon.startsWith('fa ')) {\n return icon;\n }\n if (icon.startsWith('fa-')) {\n return `fa-solid ${icon}`;\n }\n return `fa-solid fa-${icon}`;\n }\n}\n","<div class=\"search-result-container\">\n <!-- Content Header — matches Data Explorer layout -->\n <div class=\"content-header\">\n <div class=\"header-left\">\n <i [class]=\"EntityIcon\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ EntityInfo?.DisplayNameOrName || entity }}</h2>\n @if (SearchState === 'loading') {\n <span class=\"record-count\">Searching for \"{{ searchInput }}\"...</span>\n } @else if (SearchState === 'no-results') {\n <span class=\"record-count\">No results for \"{{ searchInput }}\"</span>\n } @else if (ResultCount > 0) {\n <span class=\"record-count\">{{ ResultCount | number }} {{ ResultCount === 1 ? 'result' : 'results' }} for \"{{ searchInput }}\"</span>\n }\n </div>\n\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"header-right\">\n <!-- New Record -->\n <button\n class=\"header-action-btn\"\n (click)=\"OnCreateNewRecord()\"\n title=\"New Record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n }\n </div>\n\n <!-- Loading state -->\n @if (SearchState === 'loading') {\n <div class=\"loading-container\">\n <mj-loading text=\"Searching...\"></mj-loading>\n </div>\n }\n\n <!-- No results -->\n @if (SearchState === 'no-results') {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-magnifying-glass empty-icon\"></i>\n <p>No results found for \"<strong>{{ searchInput }}</strong>\" in {{ entity }}</p>\n <p class=\"empty-hint\">Try a different search term or entity</p>\n </div>\n }\n\n <!-- Single result — auto-navigating to entity form -->\n @if (SearchState === 'single-result') {\n <div class=\"single-result-state\">\n <i class=\"fa-solid fa-arrow-right redirect-icon\"></i>\n <p>Found 1 result &mdash; opening record...</p>\n </div>\n }\n\n <!-- Entity Viewer (2+ results) -->\n @if (SearchState === 'viewer' && EntityInfo) {\n <div class=\"viewer-container\">\n <mj-entity-viewer\n [Entity]=\"EntityInfo\"\n [Provider]=\"Provider\"\n [FilterText]=\"searchInput\"\n [Config]=\"ViewerConfig\"\n (DataLoaded)=\"OnDataLoaded($event)\"\n (RecordOpened)=\"OnRecordOpened($event)\"\n (OpenRelatedRecordRequested)=\"OnOpenRelatedRecord($event)\"\n (CreateRecordRequested)=\"OnCreateNewRecord()\">\n </mj-entity-viewer>\n </div>\n }\n</div>\n"]}
@@ -22,6 +22,7 @@ export * from './lib/single-list-detail/single-list-detail.component';
22
22
  export * from './lib/user-profile/user-profile.component';
23
23
  export * from './lib/user-notifications/user-notifications.component';
24
24
  export * from './lib/guards/auth-guard.service';
25
+ export * from './lib/guards/app-lock-guard.service';
25
26
  export * from './lib/guards/entities.guard';
26
27
  export * from './lib/single-query/single-query.component';
27
28
  export * from './lib/resource-wrappers/query-resource.component';
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAIA,cAAc,4CAA4C,CAAC;AAE3D,cAAc,sDAAsD,CAAA;AACpE,cAAc,2EAA2E,CAAA;AACzF,cAAc,mDAAmD,CAAA;AAEjE,cAAc,2DAA2D,CAAA;AACzE,cAAc,iDAAiD,CAAA;AAC/D,cAAc,wDAAwD,CAAA;AACtE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qDAAqD,CAAA;AACnE,cAAc,6BAA6B,CAAA;AAG3C,cAAc,iDAAiD,CAAC;AAChE,cAAc,+CAA+C,CAAC;AAG9D,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,2DAA2D,CAAA;AACzE,cAAc,mDAAmD,CAAA;AACjE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qEAAqE,CAAA;AACnF,cAAc,2EAA2E,CAAA;AACzF,cAAc,uDAAuD,CAAA;AACrE,cAAc,2CAA2C,CAAA;AACzD,cAAc,uDAAuD,CAAC;AACtE,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,2CAA2C,CAAA;AACzD,cAAc,kDAAkD,CAAA;AAGhE,cAAc,0CAA0C,CAAA;AACxD,cAAc,2CAA2C,CAAA;AAGzD,cAAc,4CAA4C,CAAA;AAC1D,cAAc,gEAAgE,CAAA;AAG9E,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4DAA4D,CAAA;AAG1E,cAAc,iBAAiB,CAAA;AAG/B,cAAc,oCAAoC,CAAA;AAClD,cAAc,2CAA2C,CAAA;AAGzD,cAAc,wCAAwC,CAAA;AACtD,cAAc,6CAA6C,CAAA;AAG3D,cAAc,0BAA0B,CAAA;AACxC,cAAc,sCAAsC,CAAA;AAGpD,cAAc,sBAAsB,CAAA;AAEpC,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAIA,cAAc,4CAA4C,CAAC;AAE3D,cAAc,sDAAsD,CAAA;AACpE,cAAc,2EAA2E,CAAA;AACzF,cAAc,mDAAmD,CAAA;AAEjE,cAAc,2DAA2D,CAAA;AACzE,cAAc,iDAAiD,CAAA;AAC/D,cAAc,wDAAwD,CAAA;AACtE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qDAAqD,CAAA;AACnE,cAAc,6BAA6B,CAAA;AAG3C,cAAc,iDAAiD,CAAC;AAChE,cAAc,+CAA+C,CAAC;AAG9D,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,2DAA2D,CAAA;AACzE,cAAc,mDAAmD,CAAA;AACjE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qEAAqE,CAAA;AACnF,cAAc,2EAA2E,CAAA;AACzF,cAAc,uDAAuD,CAAA;AACrE,cAAc,2CAA2C,CAAA;AACzD,cAAc,uDAAuD,CAAC;AACtE,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,2CAA2C,CAAA;AACzD,cAAc,kDAAkD,CAAA;AAGhE,cAAc,0CAA0C,CAAA;AACxD,cAAc,2CAA2C,CAAA;AAGzD,cAAc,4CAA4C,CAAA;AAC1D,cAAc,gEAAgE,CAAA;AAG9E,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4DAA4D,CAAA;AAG1E,cAAc,iBAAiB,CAAA;AAG/B,cAAc,oCAAoC,CAAA;AAClD,cAAc,2CAA2C,CAAA;AAGzD,cAAc,wCAAwC,CAAA;AACtD,cAAc,6CAA6C,CAAA;AAG3D,cAAc,0BAA0B,CAAA;AACxC,cAAc,sCAAsC,CAAA;AAGpD,cAAc,sBAAsB,CAAA;AAEpC,cAAc,UAAU,CAAC"}
@@ -28,6 +28,7 @@ export * from './lib/single-list-detail/single-list-detail.component';
28
28
  export * from './lib/user-profile/user-profile.component';
29
29
  export * from './lib/user-notifications/user-notifications.component';
30
30
  export * from './lib/guards/auth-guard.service';
31
+ export * from './lib/guards/app-lock-guard.service';
31
32
  export * from './lib/guards/entities.guard';
32
33
  export * from './lib/single-query/single-query.component';
33
34
  export * from './lib/resource-wrappers/query-resource.component';
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,4CAA4C,CAAC;AAE3D,cAAc,sDAAsD,CAAA;AACpE,cAAc,2EAA2E,CAAA;AACzF,cAAc,mDAAmD,CAAA;AACjE,mEAAmE;AACnE,cAAc,2DAA2D,CAAA;AACzE,cAAc,iDAAiD,CAAA;AAC/D,cAAc,wDAAwD,CAAA;AACtE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qDAAqD,CAAA;AACnE,cAAc,6BAA6B,CAAA;AAE3C,0DAA0D;AAC1D,cAAc,iDAAiD,CAAC;AAChE,cAAc,+CAA+C,CAAC;AAE9D,qCAAqC;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,2DAA2D,CAAA;AACzE,cAAc,mDAAmD,CAAA;AACjE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qEAAqE,CAAA;AACnF,cAAc,2EAA2E,CAAA;AACzF,cAAc,uDAAuD,CAAA;AACrE,cAAc,2CAA2C,CAAA;AACzD,cAAc,uDAAuD,CAAC;AACtE,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,2CAA2C,CAAA;AACzD,cAAc,kDAAkD,CAAA;AAEhE,sBAAsB;AACtB,cAAc,0CAA0C,CAAA;AACxD,cAAc,2CAA2C,CAAA;AAEzD,sBAAsB;AACtB,cAAc,4CAA4C,CAAA;AAC1D,cAAc,gEAAgE,CAAA;AAE9E,8BAA8B;AAC9B,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4DAA4D,CAAA;AAE1E,0BAA0B;AAC1B,cAAc,iBAAiB,CAAA;AAE/B,eAAe;AACf,cAAc,oCAAoC,CAAA;AAClD,cAAc,2CAA2C,CAAA;AAEzD,iCAAiC;AACjC,cAAc,wCAAwC,CAAA;AACtD,cAAc,6CAA6C,CAAA;AAE3D,eAAe;AACf,cAAc,0BAA0B,CAAA;AACxC,cAAc,sCAAsC,CAAA;AAEpD,gEAAgE;AAChE,cAAc,sBAAsB,CAAA;AAEpC,cAAc,UAAU,CAAC","sourcesContent":["/*\n * Public API Surface \n */\n\nexport * from './lib/generic/resource-container-component';\n\nexport * from './lib/resource-wrappers/dashboard-resource.component'\nexport * from './lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component'\nexport * from './lib/resource-wrappers/record-resource.component'\n// export * from './lib/resource-wrappers/resource-wrappers-loader'\nexport * from './lib/resource-wrappers/search-results-resource.component'\nexport * from './lib/resource-wrappers/view-resource.component'\nexport * from './lib/resource-wrappers/list-detail-resource.component'\nexport * from './lib/resource-wrappers/chat-conversations-resource.component'\nexport * from './lib/resource-wrappers/artifact-resource.component'\nexport * from './lib/conversation-feedback'\n\n// Command Palette (only component and service, no module)\nexport * from './lib/command-palette/command-palette.component';\nexport * from './lib/command-palette/command-palette.service';\n\n// New Shell Module (New Explorer UX)\nexport * from './lib/shell/shell.module'\nexport * from './lib/shell/shell.component'\nexport * from './lib/single-record/single-record.component'\nexport * from './lib/single-search-result/single-search-result.component'\nexport * from './lib/single-dashboard/single-dashboard.component'\nexport * from './lib/single-dashboard/Components/add-item/add-item.component'\nexport * from './lib/single-dashboard/Components/delete-item/delete-item.component'\nexport * from './lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component'\nexport * from './lib/single-list-detail/single-list-detail.component'\nexport * from './lib/user-profile/user-profile.component'\nexport * from './lib/user-notifications/user-notifications.component';\nexport * from './lib/guards/auth-guard.service';\nexport * from './lib/guards/entities.guard';\n\nexport * from './lib/single-query/single-query.component'\nexport * from './lib/resource-wrappers/query-resource.component'\n\n// Validation services\nexport * from './lib/services/system-validation.service'\nexport * from './lib/services/startup-validation.service'\n\n// Server connectivity\nexport * from './lib/services/server-connectivity.service'\nexport * from './lib/server-connectivity/server-connectivity-banner.component'\n\n// Lazy loading infrastructure\nexport * from './lib/services/lazy-module-registry'\nexport * from './generated/lazy-feature-config'\nexport * from './lib/system-validation/system-validation-banner.component'\n\n// User Menu Plugin System\nexport * from './lib/user-menu'\n\n// About Dialog\nexport * from './lib/about/about-dialog.component'\nexport * from './lib/shell/services/about-dialog.service'\n\n// Profile Dialog (Identity Card)\nexport * from './lib/profile/profile-dialog.component'\nexport * from './lib/shell/services/profile-dialog.service'\n\n// OAuth Module\nexport * from './lib/oauth/oauth.module'\nexport * from './lib/oauth/oauth-callback.component'\n\n// Routing Module - must be imported directly in root app module\nexport * from './app-routing.module'\n\nexport * from './module';"]}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,4CAA4C,CAAC;AAE3D,cAAc,sDAAsD,CAAA;AACpE,cAAc,2EAA2E,CAAA;AACzF,cAAc,mDAAmD,CAAA;AACjE,mEAAmE;AACnE,cAAc,2DAA2D,CAAA;AACzE,cAAc,iDAAiD,CAAA;AAC/D,cAAc,wDAAwD,CAAA;AACtE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qDAAqD,CAAA;AACnE,cAAc,6BAA6B,CAAA;AAE3C,0DAA0D;AAC1D,cAAc,iDAAiD,CAAC;AAChE,cAAc,+CAA+C,CAAC;AAE9D,qCAAqC;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,6CAA6C,CAAA;AAC3D,cAAc,2DAA2D,CAAA;AACzE,cAAc,mDAAmD,CAAA;AACjE,cAAc,+DAA+D,CAAA;AAC7E,cAAc,qEAAqE,CAAA;AACnF,cAAc,2EAA2E,CAAA;AACzF,cAAc,uDAAuD,CAAA;AACrE,cAAc,2CAA2C,CAAA;AACzD,cAAc,uDAAuD,CAAC;AACtE,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAE5C,cAAc,2CAA2C,CAAA;AACzD,cAAc,kDAAkD,CAAA;AAEhE,sBAAsB;AACtB,cAAc,0CAA0C,CAAA;AACxD,cAAc,2CAA2C,CAAA;AAEzD,sBAAsB;AACtB,cAAc,4CAA4C,CAAA;AAC1D,cAAc,gEAAgE,CAAA;AAE9E,8BAA8B;AAC9B,cAAc,qCAAqC,CAAA;AACnD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,4DAA4D,CAAA;AAE1E,0BAA0B;AAC1B,cAAc,iBAAiB,CAAA;AAE/B,eAAe;AACf,cAAc,oCAAoC,CAAA;AAClD,cAAc,2CAA2C,CAAA;AAEzD,iCAAiC;AACjC,cAAc,wCAAwC,CAAA;AACtD,cAAc,6CAA6C,CAAA;AAE3D,eAAe;AACf,cAAc,0BAA0B,CAAA;AACxC,cAAc,sCAAsC,CAAA;AAEpD,gEAAgE;AAChE,cAAc,sBAAsB,CAAA;AAEpC,cAAc,UAAU,CAAC","sourcesContent":["/*\n * Public API Surface \n */\n\nexport * from './lib/generic/resource-container-component';\n\nexport * from './lib/resource-wrappers/dashboard-resource.component'\nexport * from './lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component'\nexport * from './lib/resource-wrappers/record-resource.component'\n// export * from './lib/resource-wrappers/resource-wrappers-loader'\nexport * from './lib/resource-wrappers/search-results-resource.component'\nexport * from './lib/resource-wrappers/view-resource.component'\nexport * from './lib/resource-wrappers/list-detail-resource.component'\nexport * from './lib/resource-wrappers/chat-conversations-resource.component'\nexport * from './lib/resource-wrappers/artifact-resource.component'\nexport * from './lib/conversation-feedback'\n\n// Command Palette (only component and service, no module)\nexport * from './lib/command-palette/command-palette.component';\nexport * from './lib/command-palette/command-palette.service';\n\n// New Shell Module (New Explorer UX)\nexport * from './lib/shell/shell.module'\nexport * from './lib/shell/shell.component'\nexport * from './lib/single-record/single-record.component'\nexport * from './lib/single-search-result/single-search-result.component'\nexport * from './lib/single-dashboard/single-dashboard.component'\nexport * from './lib/single-dashboard/Components/add-item/add-item.component'\nexport * from './lib/single-dashboard/Components/delete-item/delete-item.component'\nexport * from './lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component'\nexport * from './lib/single-list-detail/single-list-detail.component'\nexport * from './lib/user-profile/user-profile.component'\nexport * from './lib/user-notifications/user-notifications.component';\nexport * from './lib/guards/auth-guard.service';\nexport * from './lib/guards/app-lock-guard.service';\nexport * from './lib/guards/entities.guard';\n\nexport * from './lib/single-query/single-query.component'\nexport * from './lib/resource-wrappers/query-resource.component'\n\n// Validation services\nexport * from './lib/services/system-validation.service'\nexport * from './lib/services/startup-validation.service'\n\n// Server connectivity\nexport * from './lib/services/server-connectivity.service'\nexport * from './lib/server-connectivity/server-connectivity-banner.component'\n\n// Lazy loading infrastructure\nexport * from './lib/services/lazy-module-registry'\nexport * from './generated/lazy-feature-config'\nexport * from './lib/system-validation/system-validation-banner.component'\n\n// User Menu Plugin System\nexport * from './lib/user-menu'\n\n// About Dialog\nexport * from './lib/about/about-dialog.component'\nexport * from './lib/shell/services/about-dialog.service'\n\n// Profile Dialog (Identity Card)\nexport * from './lib/profile/profile-dialog.component'\nexport * from './lib/shell/services/profile-dialog.service'\n\n// OAuth Module\nexport * from './lib/oauth/oauth.module'\nexport * from './lib/oauth/oauth-callback.component'\n\n// Routing Module - must be imported directly in root app module\nexport * from './app-routing.module'\n\nexport * from './module';"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-explorer-core",
3
- "version": "5.39.0",
3
+ "version": "5.40.1",
4
4
  "description": "MemberJunction Explorer: Core Angular Components",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -32,51 +32,51 @@
32
32
  "@angular/cdk": "21.1.3",
33
33
  "@angular/platform-browser": "21.1.3",
34
34
  "@auth0/auth0-angular": "^2.6.0",
35
- "@memberjunction/ai-core-plus": "5.39.0",
36
- "@memberjunction/ai-engine-base": "5.39.0",
37
- "@memberjunction/communication-types": "5.39.0",
38
- "@memberjunction/core": "5.39.0",
39
- "@memberjunction/core-entities": "5.39.0",
40
- "@memberjunction/entity-communications-client": "5.39.0",
41
- "@memberjunction/export-engine": "5.39.0",
42
- "@memberjunction/global": "5.39.0",
43
- "@memberjunction/graphql-dataprovider": "5.39.0",
44
- "@memberjunction/interactive-component-types": "5.39.0",
45
- "@memberjunction/lists-base": "5.39.0",
46
- "@memberjunction/ng-ai-test-harness": "5.39.0",
47
- "@memberjunction/ng-artifacts": "5.39.0",
48
- "@memberjunction/ng-auth-services": "5.39.0",
49
- "@memberjunction/ng-base-application": "5.39.0",
50
- "@memberjunction/ng-base-forms": "5.39.0",
51
- "@memberjunction/ng-base-types": "5.39.0",
52
- "@memberjunction/ng-container-directives": "5.39.0",
53
- "@memberjunction/ng-conversations": "5.39.0",
54
- "@memberjunction/ng-dashboard-viewer": "5.39.0",
55
- "@memberjunction/ng-dashboards": "5.39.0",
56
- "@memberjunction/ng-entity-form-dialog": "5.39.0",
57
- "@memberjunction/ng-entity-permissions": "5.39.0",
58
- "@memberjunction/ng-entity-viewer": "5.39.0",
59
- "@memberjunction/ng-explorer-settings": "5.39.0",
60
- "@memberjunction/ng-export-service": "5.39.0",
61
- "@memberjunction/ng-feedback": "5.39.0",
62
- "@memberjunction/ng-file-storage": "5.39.0",
63
- "@memberjunction/ng-generic-dialog": "5.39.0",
64
- "@memberjunction/ng-list-detail-grid": "5.39.0",
65
- "@memberjunction/ng-list-management": "5.39.0",
66
- "@memberjunction/ng-notifications": "5.39.0",
67
- "@memberjunction/ng-pagination": "5.39.0",
68
- "@memberjunction/ng-query-viewer": "5.39.0",
69
- "@memberjunction/ng-record-changes": "5.39.0",
70
- "@memberjunction/ng-record-selector": "5.39.0",
71
- "@memberjunction/ng-record-tags": "5.39.0",
72
- "@memberjunction/ng-resource-permissions": "5.39.0",
73
- "@memberjunction/ng-search": "5.39.0",
74
- "@memberjunction/ng-shared": "5.39.0",
75
- "@memberjunction/ng-shared-generic": "5.39.0",
76
- "@memberjunction/ng-ui-components": "5.39.0",
77
- "@memberjunction/ng-user-avatar": "5.39.0",
78
- "@memberjunction/ng-word-cloud": "5.39.0",
79
- "@memberjunction/templates-base-types": "5.39.0",
35
+ "@memberjunction/ai-core-plus": "5.40.1",
36
+ "@memberjunction/ai-engine-base": "5.40.1",
37
+ "@memberjunction/communication-types": "5.40.1",
38
+ "@memberjunction/core": "5.40.1",
39
+ "@memberjunction/core-entities": "5.40.1",
40
+ "@memberjunction/entity-communications-client": "5.40.1",
41
+ "@memberjunction/export-engine": "5.40.1",
42
+ "@memberjunction/global": "5.40.1",
43
+ "@memberjunction/graphql-dataprovider": "5.40.1",
44
+ "@memberjunction/interactive-component-types": "5.40.1",
45
+ "@memberjunction/lists-base": "5.40.1",
46
+ "@memberjunction/ng-ai-test-harness": "5.40.1",
47
+ "@memberjunction/ng-artifacts": "5.40.1",
48
+ "@memberjunction/ng-auth-services": "5.40.1",
49
+ "@memberjunction/ng-base-application": "5.40.1",
50
+ "@memberjunction/ng-base-forms": "5.40.1",
51
+ "@memberjunction/ng-base-types": "5.40.1",
52
+ "@memberjunction/ng-container-directives": "5.40.1",
53
+ "@memberjunction/ng-conversations": "5.40.1",
54
+ "@memberjunction/ng-dashboard-viewer": "5.40.1",
55
+ "@memberjunction/ng-dashboards": "5.40.1",
56
+ "@memberjunction/ng-entity-form-dialog": "5.40.1",
57
+ "@memberjunction/ng-entity-permissions": "5.40.1",
58
+ "@memberjunction/ng-entity-viewer": "5.40.1",
59
+ "@memberjunction/ng-explorer-settings": "5.40.1",
60
+ "@memberjunction/ng-export-service": "5.40.1",
61
+ "@memberjunction/ng-feedback": "5.40.1",
62
+ "@memberjunction/ng-file-storage": "5.40.1",
63
+ "@memberjunction/ng-generic-dialog": "5.40.1",
64
+ "@memberjunction/ng-list-detail-grid": "5.40.1",
65
+ "@memberjunction/ng-list-management": "5.40.1",
66
+ "@memberjunction/ng-notifications": "5.40.1",
67
+ "@memberjunction/ng-pagination": "5.40.1",
68
+ "@memberjunction/ng-query-viewer": "5.40.1",
69
+ "@memberjunction/ng-record-changes": "5.40.1",
70
+ "@memberjunction/ng-record-selector": "5.40.1",
71
+ "@memberjunction/ng-record-tags": "5.40.1",
72
+ "@memberjunction/ng-resource-permissions": "5.40.1",
73
+ "@memberjunction/ng-search": "5.40.1",
74
+ "@memberjunction/ng-shared": "5.40.1",
75
+ "@memberjunction/ng-shared-generic": "5.40.1",
76
+ "@memberjunction/ng-ui-components": "5.40.1",
77
+ "@memberjunction/ng-user-avatar": "5.40.1",
78
+ "@memberjunction/ng-word-cloud": "5.40.1",
79
+ "@memberjunction/templates-base-types": "5.40.1",
80
80
  "golden-layout": "^2.6.0",
81
81
  "rxjs": "^7.8.2",
82
82
  "tslib": "^2.8.1"