@memberjunction/ng-dashboards 2.127.0 → 2.128.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +3 -3
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +50 -19
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +17 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +77 -45
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +34 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +547 -368
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/module.d.ts +10 -9
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +4 -0
- package/dist/module.js.map +1 -1
- package/package.json +25 -25
|
@@ -16,539 +16,544 @@ import { EntityViewerComponent } from '@memberjunction/ng-entity-viewer';
|
|
|
16
16
|
import { ViewSelectorComponent } from './components/view-selector/view-selector.component';
|
|
17
17
|
import { ViewConfigPanelComponent } from './components/view-config-panel/view-config-panel.component';
|
|
18
18
|
import { createEmptyFilter } from '@memberjunction/ng-filter-builder';
|
|
19
|
+
import { ExcelExportComponent } from '@progress/kendo-angular-excel-export';
|
|
20
|
+
import { MJEventType, MJGlobal } from '@memberjunction/global';
|
|
19
21
|
import * as i0 from "@angular/core";
|
|
20
22
|
import * as i1 from "./services/explorer-state.service";
|
|
21
23
|
import * as i2 from "@angular/router";
|
|
22
24
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
23
25
|
import * as i4 from "@memberjunction/ng-shared";
|
|
24
26
|
import * as i5 from "@angular/forms";
|
|
25
|
-
import * as i6 from "@
|
|
26
|
-
import * as i7 from "
|
|
27
|
-
import * as i8 from "./components/
|
|
28
|
-
import * as i9 from "./components/view-
|
|
29
|
-
import * as i10 from "./components/
|
|
30
|
-
import * as i11 from "
|
|
27
|
+
import * as i6 from "@progress/kendo-angular-excel-export";
|
|
28
|
+
import * as i7 from "@memberjunction/ng-entity-viewer";
|
|
29
|
+
import * as i8 from "./components/navigation-panel/navigation-panel.component";
|
|
30
|
+
import * as i9 from "./components/view-selector/view-selector.component";
|
|
31
|
+
import * as i10 from "./components/view-config-panel/view-config-panel.component";
|
|
32
|
+
import * as i11 from "./components/filter-dialog/filter-dialog.component";
|
|
33
|
+
import * as i12 from "@angular/common";
|
|
31
34
|
const _c0 = ["filterInput"];
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
35
|
+
const _c1 = ["excelExport"];
|
|
36
|
+
const _forTrack0 = ($index, $item) => $item.Name;
|
|
37
|
+
const _forTrack1 = ($index, $item) => $item.label;
|
|
38
|
+
const _forTrack2 = ($index, $item) => $item.name;
|
|
39
|
+
const _forTrack3 = ($index, $item) => $item.ID;
|
|
40
|
+
const _forTrack4 = ($index, $item) => $item.entityId + "|" + $item.recordId;
|
|
41
|
+
const _forTrack5 = ($index, $item) => $item.entityId;
|
|
42
|
+
const _forTrack6 = ($index, $item) => $item.userFavoriteId;
|
|
38
43
|
function DataExplorerDashboardComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
-
const
|
|
40
|
-
i0.ɵɵelementStart(0, "div",
|
|
41
|
-
i0.ɵɵlistener("entitySelected", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_entitySelected_1_listener($event) { i0.ɵɵrestoreView(
|
|
44
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
45
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "mj-explorer-navigation-panel", 20);
|
|
46
|
+
i0.ɵɵlistener("entitySelected", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_entitySelected_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onEntitySelected($event)); })("toggleCollapse", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_toggleCollapse_1_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleNavigationPanel()); })("sectionToggled", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_sectionToggled_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.stateService.toggleSection($event)); })("openRecord", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_openRecord_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onOpenRecordFromNav($event)); })("selectRecord", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_selectRecord_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSelectRecordFromNav($event)); })("expandAndFocus", function DataExplorerDashboardComponent_Conditional_1_Template_mj_explorer_navigation_panel_expandAndFocus_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onExpandAndFocus($event)); });
|
|
42
47
|
i0.ɵɵelementEnd()();
|
|
43
48
|
} if (rf & 2) {
|
|
44
|
-
const
|
|
45
|
-
i0.ɵɵstyleProp("width",
|
|
46
|
-
i0.ɵɵclassProp("collapsed",
|
|
49
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
50
|
+
i0.ɵɵstyleProp("width", ctx_r2.state.navigationPanelCollapsed ? 48 : ctx_r2.state.navigationPanelWidth, "px");
|
|
51
|
+
i0.ɵɵclassProp("collapsed", ctx_r2.state.navigationPanelCollapsed);
|
|
47
52
|
i0.ɵɵproperty("@slideInLeft", undefined);
|
|
48
53
|
i0.ɵɵadvance();
|
|
49
|
-
i0.ɵɵproperty("entities",
|
|
54
|
+
i0.ɵɵproperty("entities", ctx_r2.entities)("selectedEntityName", ctx_r2.state.selectedEntityName)("favorites", ctx_r2.state.favorites)("recentItems", ctx_r2.state.recentItems)("collapsed", ctx_r2.state.navigationPanelCollapsed)("allowedEntityNames", ctx_r2.allowedEntityNames)("favoritesSectionExpanded", ctx_r2.state.favoritesSectionExpanded)("recentSectionExpanded", ctx_r2.state.recentSectionExpanded)("entitiesSectionExpanded", ctx_r2.state.entitiesSectionExpanded)("viewsSectionExpanded", ctx_r2.state.viewsSectionExpanded);
|
|
50
55
|
} }
|
|
51
56
|
function DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
52
|
-
i0.ɵɵelement(0, "i",
|
|
57
|
+
i0.ɵɵelement(0, "i", 25);
|
|
53
58
|
} if (rf & 2) {
|
|
54
|
-
const
|
|
55
|
-
i0.ɵɵclassMap(
|
|
59
|
+
const crumb_r6 = i0.ɵɵnextContext().$implicit;
|
|
60
|
+
i0.ɵɵclassMap(crumb_r6.icon);
|
|
56
61
|
} }
|
|
57
62
|
function DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
-
i0.ɵɵelement(0, "i",
|
|
63
|
+
i0.ɵɵelement(0, "i", 24);
|
|
59
64
|
} }
|
|
60
65
|
function DataExplorerDashboardComponent_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
-
const
|
|
62
|
-
i0.ɵɵelementStart(0, "span",
|
|
63
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_3_For_2_Template_span_click_0_listener() { const
|
|
64
|
-
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_1_Template, 1, 2, "i",
|
|
65
|
-
i0.ɵɵelementStart(2, "span",
|
|
66
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
67
|
+
i0.ɵɵelementStart(0, "span", 21);
|
|
68
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_3_For_2_Template_span_click_0_listener() { const ctx_r4 = i0.ɵɵrestoreView(_r4); const crumb_r6 = ctx_r4.$implicit; const ɵ$index_13_r7 = ctx_r4.$index; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onBreadcrumbClick(crumb_r6, ɵ$index_13_r7)); });
|
|
69
|
+
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_1_Template, 1, 2, "i", 22);
|
|
70
|
+
i0.ɵɵelementStart(2, "span", 23);
|
|
66
71
|
i0.ɵɵtext(3);
|
|
67
72
|
i0.ɵɵelementEnd()();
|
|
68
|
-
i0.ɵɵtemplate(4, DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_4_Template, 1, 0, "i",
|
|
73
|
+
i0.ɵɵtemplate(4, DataExplorerDashboardComponent_Conditional_3_For_2_Conditional_4_Template, 1, 0, "i", 24);
|
|
69
74
|
} if (rf & 2) {
|
|
70
|
-
const
|
|
71
|
-
const ɵ$
|
|
72
|
-
const ɵ$
|
|
73
|
-
i0.ɵɵclassProp("clickable", !(ɵ$
|
|
74
|
-
i0.ɵɵproperty("title",
|
|
75
|
+
const crumb_r6 = ctx.$implicit;
|
|
76
|
+
const ɵ$index_13_r7 = ctx.$index;
|
|
77
|
+
const ɵ$count_13_r8 = ctx.$count;
|
|
78
|
+
i0.ɵɵclassProp("clickable", !(ɵ$index_13_r7 === ɵ$count_13_r8 - 1))("current", ɵ$index_13_r7 === ɵ$count_13_r8 - 1);
|
|
79
|
+
i0.ɵɵproperty("title", crumb_r6.label);
|
|
75
80
|
i0.ɵɵadvance();
|
|
76
|
-
i0.ɵɵconditional(
|
|
81
|
+
i0.ɵɵconditional(crumb_r6.icon ? 1 : -1);
|
|
77
82
|
i0.ɵɵadvance(2);
|
|
78
|
-
i0.ɵɵtextInterpolate(
|
|
83
|
+
i0.ɵɵtextInterpolate(crumb_r6.label);
|
|
79
84
|
i0.ɵɵadvance();
|
|
80
|
-
i0.ɵɵconditional(!(ɵ$
|
|
85
|
+
i0.ɵɵconditional(!(ɵ$index_13_r7 === ɵ$count_13_r8 - 1) ? 4 : -1);
|
|
81
86
|
} }
|
|
82
87
|
function DataExplorerDashboardComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
-
i0.ɵɵelementStart(0, "div",
|
|
84
|
-
i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_3_For_2_Template, 5, 8, null, null,
|
|
88
|
+
i0.ɵɵelementStart(0, "div", 5);
|
|
89
|
+
i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_3_For_2_Template, 5, 8, null, null, _forTrack1);
|
|
85
90
|
i0.ɵɵelementEnd();
|
|
86
91
|
} if (rf & 2) {
|
|
87
|
-
const
|
|
92
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
88
93
|
i0.ɵɵadvance();
|
|
89
|
-
i0.ɵɵrepeater(
|
|
94
|
+
i0.ɵɵrepeater(ctx_r2.breadcrumbs);
|
|
90
95
|
} }
|
|
91
96
|
function DataExplorerDashboardComponent_Conditional_6_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
-
i0.ɵɵelementStart(0, "span",
|
|
97
|
+
i0.ɵɵelementStart(0, "span", 28);
|
|
93
98
|
i0.ɵɵtext(1);
|
|
94
99
|
i0.ɵɵpipe(2, "number");
|
|
95
100
|
i0.ɵɵpipe(3, "number");
|
|
96
101
|
i0.ɵɵelementEnd();
|
|
97
102
|
} if (rf & 2) {
|
|
98
|
-
const
|
|
103
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
99
104
|
i0.ɵɵadvance();
|
|
100
|
-
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(2, 2,
|
|
105
|
+
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(2, 2, ctx_r2.filteredRecordCount), " of ", i0.ɵɵpipeBind1(3, 4, ctx_r2.totalRecordCount), " records");
|
|
101
106
|
} }
|
|
102
107
|
function DataExplorerDashboardComponent_Conditional_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
103
|
-
i0.ɵɵelementStart(0, "span",
|
|
108
|
+
i0.ɵɵelementStart(0, "span", 28);
|
|
104
109
|
i0.ɵɵtext(1);
|
|
105
110
|
i0.ɵɵpipe(2, "number");
|
|
106
111
|
i0.ɵɵelementEnd();
|
|
107
112
|
} if (rf & 2) {
|
|
108
|
-
const
|
|
113
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
109
114
|
i0.ɵɵadvance();
|
|
110
|
-
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(2, 1,
|
|
115
|
+
i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(2, 1, ctx_r2.totalRecordCount), " records");
|
|
111
116
|
} }
|
|
112
117
|
function DataExplorerDashboardComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
113
|
-
const
|
|
114
|
-
i0.ɵɵelement(0, "i",
|
|
115
|
-
i0.ɵɵelementStart(1, "h2",
|
|
118
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
119
|
+
i0.ɵɵelement(0, "i", 26);
|
|
120
|
+
i0.ɵɵelementStart(1, "h2", 27);
|
|
116
121
|
i0.ɵɵtext(2);
|
|
117
122
|
i0.ɵɵelementEnd();
|
|
118
|
-
i0.ɵɵtemplate(3, DataExplorerDashboardComponent_Conditional_6_Conditional_3_Template, 4, 6, "span",
|
|
119
|
-
i0.ɵɵelementStart(5, "mj-view-selector",
|
|
120
|
-
i0.ɵɵlistener("viewSelected", function DataExplorerDashboardComponent_Conditional_6_Template_mj_view_selector_viewSelected_5_listener($event) { i0.ɵɵrestoreView(
|
|
123
|
+
i0.ɵɵtemplate(3, DataExplorerDashboardComponent_Conditional_6_Conditional_3_Template, 4, 6, "span", 28)(4, DataExplorerDashboardComponent_Conditional_6_Conditional_4_Template, 3, 3, "span", 28);
|
|
124
|
+
i0.ɵɵelementStart(5, "mj-view-selector", 29);
|
|
125
|
+
i0.ɵɵlistener("viewSelected", function DataExplorerDashboardComponent_Conditional_6_Template_mj_view_selector_viewSelected_5_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onViewSelected($event)); })("saveViewRequested", function DataExplorerDashboardComponent_Conditional_6_Template_mj_view_selector_saveViewRequested_5_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSaveViewRequested($event)); })("manageViewsRequested", function DataExplorerDashboardComponent_Conditional_6_Template_mj_view_selector_manageViewsRequested_5_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onManageViewsRequested()); })("openInTabRequested", function DataExplorerDashboardComponent_Conditional_6_Template_mj_view_selector_openInTabRequested_5_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onOpenInTabRequested($event)); })("configureViewRequested", function DataExplorerDashboardComponent_Conditional_6_Template_mj_view_selector_configureViewRequested_5_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onConfigureViewRequested()); })("createNewRecordRequested", function DataExplorerDashboardComponent_Conditional_6_Template_mj_view_selector_createNewRecordRequested_5_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCreateNewRecord()); })("exportRequested", function DataExplorerDashboardComponent_Conditional_6_Template_mj_view_selector_exportRequested_5_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onExport()); });
|
|
121
126
|
i0.ɵɵelementEnd();
|
|
122
127
|
} if (rf & 2) {
|
|
123
|
-
const
|
|
124
|
-
i0.ɵɵclassMap(
|
|
128
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
129
|
+
i0.ɵɵclassMap(ctx_r2.getEntityIcon(ctx_r2.selectedEntity));
|
|
125
130
|
i0.ɵɵadvance(2);
|
|
126
|
-
i0.ɵɵtextInterpolate(
|
|
131
|
+
i0.ɵɵtextInterpolate(ctx_r2.selectedEntity.Name);
|
|
127
132
|
i0.ɵɵadvance();
|
|
128
|
-
i0.ɵɵconditional(
|
|
133
|
+
i0.ɵɵconditional(ctx_r2.debouncedFilterText && ctx_r2.filteredRecordCount !== ctx_r2.totalRecordCount ? 3 : 4);
|
|
129
134
|
i0.ɵɵadvance(2);
|
|
130
|
-
i0.ɵɵproperty("entity",
|
|
135
|
+
i0.ɵɵproperty("entity", ctx_r2.selectedEntity)("selectedViewId", ctx_r2.state.selectedViewId)("viewModified", ctx_r2.state.viewModified);
|
|
131
136
|
} }
|
|
132
137
|
function DataExplorerDashboardComponent_Conditional_7_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
-
i0.ɵɵelement(0, "i",
|
|
138
|
+
i0.ɵɵelement(0, "i", 26);
|
|
134
139
|
} if (rf & 2) {
|
|
135
|
-
const
|
|
136
|
-
i0.ɵɵclassMap(
|
|
140
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
141
|
+
i0.ɵɵclassMap(ctx_r2.displayIcon);
|
|
137
142
|
} }
|
|
138
143
|
function DataExplorerDashboardComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
139
|
-
i0.ɵɵtemplate(0, DataExplorerDashboardComponent_Conditional_7_Conditional_0_Template, 1, 2, "i",
|
|
140
|
-
i0.ɵɵelementStart(1, "h2",
|
|
144
|
+
i0.ɵɵtemplate(0, DataExplorerDashboardComponent_Conditional_7_Conditional_0_Template, 1, 2, "i", 30);
|
|
145
|
+
i0.ɵɵelementStart(1, "h2", 27);
|
|
141
146
|
i0.ɵɵtext(2);
|
|
142
147
|
i0.ɵɵelementEnd();
|
|
143
|
-
i0.ɵɵelementStart(3, "span",
|
|
148
|
+
i0.ɵɵelementStart(3, "span", 28);
|
|
144
149
|
i0.ɵɵtext(4);
|
|
145
150
|
i0.ɵɵelementEnd();
|
|
146
151
|
} if (rf & 2) {
|
|
147
|
-
const
|
|
148
|
-
i0.ɵɵconditional(
|
|
152
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
153
|
+
i0.ɵɵconditional(ctx_r2.displayIcon ? 0 : -1);
|
|
149
154
|
i0.ɵɵadvance(2);
|
|
150
|
-
i0.ɵɵtextInterpolate(
|
|
155
|
+
i0.ɵɵtextInterpolate(ctx_r2.displayTitle);
|
|
151
156
|
i0.ɵɵadvance(2);
|
|
152
|
-
i0.ɵɵtextInterpolate1("",
|
|
157
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.entities.length, " entities available");
|
|
153
158
|
} }
|
|
154
159
|
function DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
155
|
-
const
|
|
156
|
-
i0.ɵɵelementStart(0, "button",
|
|
157
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
158
|
-
i0.ɵɵelement(1, "i",
|
|
160
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
161
|
+
i0.ɵɵelementStart(0, "button", 34);
|
|
162
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onSmartFilterChanged("")); });
|
|
163
|
+
i0.ɵɵelement(1, "i", 35);
|
|
159
164
|
i0.ɵɵelementEnd();
|
|
160
165
|
} }
|
|
161
166
|
function DataExplorerDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
162
|
-
const
|
|
163
|
-
i0.ɵɵelementStart(0, "div",
|
|
164
|
-
i0.ɵɵelement(1, "i",
|
|
165
|
-
i0.ɵɵelementStart(2, "input",
|
|
166
|
-
i0.ɵɵlistener("ngModelChange", function DataExplorerDashboardComponent_Conditional_9_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(
|
|
167
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
168
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
169
|
+
i0.ɵɵelement(1, "i", 31);
|
|
170
|
+
i0.ɵɵelementStart(2, "input", 32, 1);
|
|
171
|
+
i0.ɵɵlistener("ngModelChange", function DataExplorerDashboardComponent_Conditional_9_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSmartFilterChanged($event)); });
|
|
167
172
|
i0.ɵɵelementEnd();
|
|
168
|
-
i0.ɵɵtemplate(4, DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template, 2, 0, "button",
|
|
173
|
+
i0.ɵɵtemplate(4, DataExplorerDashboardComponent_Conditional_9_Conditional_4_Template, 2, 0, "button", 33);
|
|
169
174
|
i0.ɵɵelementEnd();
|
|
170
175
|
} if (rf & 2) {
|
|
171
|
-
const
|
|
176
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
172
177
|
i0.ɵɵadvance(2);
|
|
173
|
-
i0.ɵɵproperty("ngModel",
|
|
178
|
+
i0.ɵɵproperty("ngModel", ctx_r2.state.smartFilterPrompt);
|
|
174
179
|
i0.ɵɵadvance(2);
|
|
175
|
-
i0.ɵɵconditional(
|
|
180
|
+
i0.ɵɵconditional(ctx_r2.state.smartFilterPrompt ? 4 : -1);
|
|
176
181
|
} }
|
|
177
182
|
function DataExplorerDashboardComponent_Conditional_10_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
178
|
-
const
|
|
179
|
-
i0.ɵɵelementStart(0, "button",
|
|
180
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_10_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
181
|
-
i0.ɵɵelement(1, "i",
|
|
183
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
184
|
+
i0.ɵɵelementStart(0, "button", 34);
|
|
185
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_10_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.entityFilterText = ""); });
|
|
186
|
+
i0.ɵɵelement(1, "i", 35);
|
|
182
187
|
i0.ɵɵelementEnd();
|
|
183
188
|
} }
|
|
184
189
|
function DataExplorerDashboardComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
185
|
-
const
|
|
186
|
-
i0.ɵɵelementStart(0, "div",
|
|
187
|
-
i0.ɵɵelement(1, "i",
|
|
188
|
-
i0.ɵɵelementStart(2, "input",
|
|
189
|
-
i0.ɵɵtwoWayListener("ngModelChange", function DataExplorerDashboardComponent_Conditional_10_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(
|
|
190
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
191
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
192
|
+
i0.ɵɵelement(1, "i", 31);
|
|
193
|
+
i0.ɵɵelementStart(2, "input", 36, 1);
|
|
194
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DataExplorerDashboardComponent_Conditional_10_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.entityFilterText, $event) || (ctx_r2.entityFilterText = $event); return i0.ɵɵresetView($event); });
|
|
190
195
|
i0.ɵɵelementEnd();
|
|
191
|
-
i0.ɵɵtemplate(4, DataExplorerDashboardComponent_Conditional_10_Conditional_4_Template, 2, 0, "button",
|
|
196
|
+
i0.ɵɵtemplate(4, DataExplorerDashboardComponent_Conditional_10_Conditional_4_Template, 2, 0, "button", 33);
|
|
192
197
|
i0.ɵɵelementEnd();
|
|
193
198
|
} if (rf & 2) {
|
|
194
|
-
const
|
|
199
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
195
200
|
i0.ɵɵadvance(2);
|
|
196
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
201
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.entityFilterText);
|
|
197
202
|
i0.ɵɵadvance(2);
|
|
198
|
-
i0.ɵɵconditional(
|
|
203
|
+
i0.ɵɵconditional(ctx_r2.entityFilterText ? 4 : -1);
|
|
199
204
|
} }
|
|
200
205
|
function DataExplorerDashboardComponent_Conditional_12_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
201
|
-
const
|
|
202
|
-
i0.ɵɵelementStart(0, "button",
|
|
203
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
204
|
-
i0.ɵɵelement(1, "i",
|
|
206
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
207
|
+
i0.ɵɵelementStart(0, "button", 43);
|
|
208
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onViewModeChanged("timeline")); });
|
|
209
|
+
i0.ɵɵelement(1, "i", 44);
|
|
205
210
|
i0.ɵɵelementEnd();
|
|
206
211
|
} if (rf & 2) {
|
|
207
|
-
const
|
|
208
|
-
i0.ɵɵclassProp("active",
|
|
212
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
213
|
+
i0.ɵɵclassProp("active", ctx_r2.state.viewMode === "timeline");
|
|
209
214
|
} }
|
|
210
215
|
function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
211
|
-
const
|
|
212
|
-
i0.ɵɵelementStart(0, "div",
|
|
213
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(
|
|
216
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
217
|
+
i0.ɵɵelementStart(0, "div", 56);
|
|
218
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.closeDateFieldDropdown()); });
|
|
214
219
|
i0.ɵɵelementEnd();
|
|
215
220
|
} }
|
|
216
221
|
function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
217
|
-
i0.ɵɵelement(0, "i",
|
|
222
|
+
i0.ɵɵelement(0, "i", 57);
|
|
218
223
|
} if (rf & 2) {
|
|
219
|
-
const
|
|
220
|
-
i0.ɵɵclassProp("rotated",
|
|
224
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
225
|
+
i0.ɵɵclassProp("rotated", ctx_r2.isDateFieldDropdownOpen);
|
|
221
226
|
} }
|
|
222
227
|
function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
223
|
-
i0.ɵɵelement(0, "i",
|
|
228
|
+
i0.ɵɵelement(0, "i", 62);
|
|
224
229
|
} }
|
|
225
230
|
function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
226
|
-
const
|
|
227
|
-
i0.ɵɵelementStart(0, "div",
|
|
228
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_For_2_Template_div_click_0_listener() { const
|
|
229
|
-
i0.ɵɵelement(1, "i",
|
|
230
|
-
i0.ɵɵelementStart(2, "span",
|
|
231
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
232
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
233
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_For_2_Template_div_click_0_listener() { const field_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.setTimelineDateField(field_r19.name)); });
|
|
234
|
+
i0.ɵɵelement(1, "i", 60);
|
|
235
|
+
i0.ɵɵelementStart(2, "span", 61);
|
|
231
236
|
i0.ɵɵtext(3);
|
|
232
237
|
i0.ɵɵelementEnd();
|
|
233
|
-
i0.ɵɵtemplate(4, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_For_2_Conditional_4_Template, 1, 0, "i",
|
|
238
|
+
i0.ɵɵtemplate(4, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_For_2_Conditional_4_Template, 1, 0, "i", 62);
|
|
234
239
|
i0.ɵɵelementEnd();
|
|
235
240
|
} if (rf & 2) {
|
|
236
|
-
const
|
|
237
|
-
const
|
|
238
|
-
i0.ɵɵclassProp("selected",
|
|
241
|
+
const field_r19 = ctx.$implicit;
|
|
242
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
243
|
+
i0.ɵɵclassProp("selected", field_r19.name === ctx_r2.effectiveTimelineDateField);
|
|
239
244
|
i0.ɵɵadvance(3);
|
|
240
|
-
i0.ɵɵtextInterpolate(
|
|
245
|
+
i0.ɵɵtextInterpolate(field_r19.displayName);
|
|
241
246
|
i0.ɵɵadvance();
|
|
242
|
-
i0.ɵɵconditional(
|
|
247
|
+
i0.ɵɵconditional(field_r19.name === ctx_r2.effectiveTimelineDateField ? 4 : -1);
|
|
243
248
|
} }
|
|
244
249
|
function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
245
|
-
i0.ɵɵelementStart(0, "div",
|
|
246
|
-
i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_For_2_Template, 5, 4, "div",
|
|
250
|
+
i0.ɵɵelementStart(0, "div", 52);
|
|
251
|
+
i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_For_2_Template, 5, 4, "div", 58, _forTrack2);
|
|
247
252
|
i0.ɵɵelementEnd();
|
|
248
253
|
} if (rf & 2) {
|
|
249
|
-
const
|
|
254
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
250
255
|
i0.ɵɵadvance();
|
|
251
|
-
i0.ɵɵrepeater(
|
|
256
|
+
i0.ɵɵrepeater(ctx_r2.availableDateFields);
|
|
252
257
|
} }
|
|
253
258
|
function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
254
|
-
const
|
|
255
|
-
i0.ɵɵelementStart(0, "div",
|
|
256
|
-
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_1_Template, 1, 0, "div",
|
|
257
|
-
i0.ɵɵelementStart(2, "div",
|
|
258
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(
|
|
259
|
-
i0.ɵɵelement(4, "i",
|
|
260
|
-
i0.ɵɵelementStart(5, "span",
|
|
259
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
260
|
+
i0.ɵɵelementStart(0, "div", 45);
|
|
261
|
+
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_1_Template, 1, 0, "div", 46);
|
|
262
|
+
i0.ɵɵelementStart(2, "div", 47)(3, "button", 48);
|
|
263
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleDateFieldDropdown()); });
|
|
264
|
+
i0.ɵɵelement(4, "i", 49);
|
|
265
|
+
i0.ɵɵelementStart(5, "span", 50);
|
|
261
266
|
i0.ɵɵtext(6);
|
|
262
267
|
i0.ɵɵelementEnd();
|
|
263
|
-
i0.ɵɵtemplate(7, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_7_Template, 1, 2, "i",
|
|
268
|
+
i0.ɵɵtemplate(7, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_7_Template, 1, 2, "i", 51);
|
|
264
269
|
i0.ɵɵelementEnd();
|
|
265
|
-
i0.ɵɵtemplate(8, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_Template, 3, 0, "div",
|
|
270
|
+
i0.ɵɵtemplate(8, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Conditional_8_Template, 3, 0, "div", 52);
|
|
266
271
|
i0.ɵɵelementEnd()();
|
|
267
|
-
i0.ɵɵelementStart(9, "div",
|
|
268
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Template_button_click_10_listener() { i0.ɵɵrestoreView(
|
|
272
|
+
i0.ɵɵelementStart(9, "div", 53)(10, "button", 54);
|
|
273
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleTimelineOrientation()); });
|
|
269
274
|
i0.ɵɵelement(11, "i");
|
|
270
275
|
i0.ɵɵelementEnd()();
|
|
271
|
-
i0.ɵɵelementStart(12, "div",
|
|
272
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Template_button_click_13_listener() { i0.ɵɵrestoreView(
|
|
276
|
+
i0.ɵɵelementStart(12, "div", 55)(13, "button", 54);
|
|
277
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Conditional_6_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleTimelineSortOrder()); });
|
|
273
278
|
i0.ɵɵelement(14, "i");
|
|
274
279
|
i0.ɵɵelementEnd()();
|
|
275
280
|
} if (rf & 2) {
|
|
276
|
-
const
|
|
281
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
277
282
|
i0.ɵɵadvance();
|
|
278
|
-
i0.ɵɵconditional(
|
|
283
|
+
i0.ɵɵconditional(ctx_r2.isDateFieldDropdownOpen ? 1 : -1);
|
|
279
284
|
i0.ɵɵadvance(2);
|
|
280
|
-
i0.ɵɵclassProp("open",
|
|
281
|
-
i0.ɵɵproperty("disabled",
|
|
285
|
+
i0.ɵɵclassProp("open", ctx_r2.isDateFieldDropdownOpen);
|
|
286
|
+
i0.ɵɵproperty("disabled", ctx_r2.availableDateFields.length <= 1);
|
|
282
287
|
i0.ɵɵadvance(3);
|
|
283
|
-
i0.ɵɵtextInterpolate(
|
|
288
|
+
i0.ɵɵtextInterpolate(ctx_r2.effectiveTimelineDateFieldDisplayName);
|
|
284
289
|
i0.ɵɵadvance();
|
|
285
|
-
i0.ɵɵconditional(
|
|
290
|
+
i0.ɵɵconditional(ctx_r2.availableDateFields.length > 1 ? 7 : -1);
|
|
286
291
|
i0.ɵɵadvance();
|
|
287
|
-
i0.ɵɵconditional(
|
|
292
|
+
i0.ɵɵconditional(ctx_r2.isDateFieldDropdownOpen && ctx_r2.availableDateFields.length > 1 ? 8 : -1);
|
|
288
293
|
i0.ɵɵadvance(2);
|
|
289
|
-
i0.ɵɵproperty("title",
|
|
294
|
+
i0.ɵɵproperty("title", ctx_r2.state.timelineOrientation === "vertical" ? "Switch to Horizontal" : "Switch to Vertical");
|
|
290
295
|
i0.ɵɵadvance();
|
|
291
|
-
i0.ɵɵclassMap(
|
|
296
|
+
i0.ɵɵclassMap(ctx_r2.state.timelineOrientation === "vertical" ? "fa-solid fa-ellipsis-vertical" : "fa-solid fa-ellipsis");
|
|
292
297
|
i0.ɵɵadvance(2);
|
|
293
|
-
i0.ɵɵproperty("title",
|
|
298
|
+
i0.ɵɵproperty("title", ctx_r2.state.timelineSortOrder === "desc" ? "Showing Newest First (click for Oldest First)" : "Showing Oldest First (click for Newest First)");
|
|
294
299
|
i0.ɵɵadvance();
|
|
295
|
-
i0.ɵɵclassMap(
|
|
300
|
+
i0.ɵɵclassMap(ctx_r2.state.timelineSortOrder === "desc" ? "fa-solid fa-arrow-down-wide-short" : "fa-solid fa-arrow-up-wide-short");
|
|
296
301
|
} }
|
|
297
302
|
function DataExplorerDashboardComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
298
|
-
const
|
|
299
|
-
i0.ɵɵelementStart(0, "div",
|
|
300
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
301
|
-
i0.ɵɵelement(2, "i",
|
|
303
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
304
|
+
i0.ɵɵelementStart(0, "div", 37)(1, "button", 38);
|
|
305
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onViewModeChanged("grid")); });
|
|
306
|
+
i0.ɵɵelement(2, "i", 39);
|
|
302
307
|
i0.ɵɵelementEnd();
|
|
303
|
-
i0.ɵɵelementStart(3, "button",
|
|
304
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Template_button_click_3_listener() { i0.ɵɵrestoreView(
|
|
305
|
-
i0.ɵɵelement(4, "i",
|
|
308
|
+
i0.ɵɵelementStart(3, "button", 40);
|
|
309
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onViewModeChanged("cards")); });
|
|
310
|
+
i0.ɵɵelement(4, "i", 41);
|
|
306
311
|
i0.ɵɵelementEnd();
|
|
307
|
-
i0.ɵɵtemplate(5, DataExplorerDashboardComponent_Conditional_12_Conditional_5_Template, 2, 2, "button",
|
|
312
|
+
i0.ɵɵtemplate(5, DataExplorerDashboardComponent_Conditional_12_Conditional_5_Template, 2, 2, "button", 42);
|
|
308
313
|
i0.ɵɵelementEnd();
|
|
309
314
|
i0.ɵɵtemplate(6, DataExplorerDashboardComponent_Conditional_12_Conditional_6_Template, 15, 13);
|
|
310
315
|
} if (rf & 2) {
|
|
311
|
-
const
|
|
316
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
312
317
|
i0.ɵɵadvance();
|
|
313
|
-
i0.ɵɵclassProp("active",
|
|
318
|
+
i0.ɵɵclassProp("active", ctx_r2.state.viewMode === "grid");
|
|
314
319
|
i0.ɵɵadvance(2);
|
|
315
|
-
i0.ɵɵclassProp("active",
|
|
320
|
+
i0.ɵɵclassProp("active", ctx_r2.state.viewMode === "cards");
|
|
316
321
|
i0.ɵɵadvance(2);
|
|
317
|
-
i0.ɵɵconditional(
|
|
322
|
+
i0.ɵɵconditional(ctx_r2.entityHasDateFields ? 5 : -1);
|
|
318
323
|
i0.ɵɵadvance();
|
|
319
|
-
i0.ɵɵconditional(
|
|
324
|
+
i0.ɵɵconditional(ctx_r2.state.viewMode === "timeline" && ctx_r2.entityHasDateFields ? 6 : -1);
|
|
320
325
|
} }
|
|
321
326
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
322
|
-
i0.ɵɵelementStart(0, "div",
|
|
323
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
327
|
+
i0.ɵɵelementStart(0, "div", 63);
|
|
328
|
+
i0.ɵɵelement(1, "mj-loading", 65);
|
|
324
329
|
i0.ɵɵelementEnd();
|
|
325
330
|
} }
|
|
326
331
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
327
|
-
const
|
|
328
|
-
i0.ɵɵelementStart(0, "button",
|
|
329
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_For_4_Template_button_click_0_listener() { const
|
|
332
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
333
|
+
i0.ɵɵelementStart(0, "button", 87);
|
|
334
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_For_4_Template_button_click_0_listener() { const entity_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r2 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r2.setRecentRecordsEntityFilter(entity_r22.entityId)); });
|
|
330
335
|
i0.ɵɵelement(1, "i");
|
|
331
336
|
i0.ɵɵelementEnd();
|
|
332
337
|
} if (rf & 2) {
|
|
333
|
-
const
|
|
334
|
-
const
|
|
335
|
-
i0.ɵɵclassProp("active",
|
|
336
|
-
i0.ɵɵproperty("title",
|
|
338
|
+
const entity_r22 = ctx.$implicit;
|
|
339
|
+
const ctx_r2 = i0.ɵɵnextContext(7);
|
|
340
|
+
i0.ɵɵclassProp("active", ctx_r2.recentRecordsEntityFilter === entity_r22.entityId);
|
|
341
|
+
i0.ɵɵproperty("title", entity_r22.entityName);
|
|
337
342
|
i0.ɵɵadvance();
|
|
338
|
-
i0.ɵɵclassMap(
|
|
343
|
+
i0.ɵɵclassMap(entity_r22.icon);
|
|
339
344
|
} }
|
|
340
345
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
341
|
-
const
|
|
342
|
-
i0.ɵɵelementStart(0, "div",
|
|
343
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
344
|
-
i0.ɵɵelement(2, "i",
|
|
346
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
347
|
+
i0.ɵɵelementStart(0, "div", 81)(1, "button", 84);
|
|
348
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.setRecentRecordsEntityFilter(null)); });
|
|
349
|
+
i0.ɵɵelement(2, "i", 85);
|
|
345
350
|
i0.ɵɵelementEnd();
|
|
346
|
-
i0.ɵɵrepeaterCreate(3, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_For_4_Template, 2, 5, "button",
|
|
351
|
+
i0.ɵɵrepeaterCreate(3, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_For_4_Template, 2, 5, "button", 86, _forTrack5);
|
|
347
352
|
i0.ɵɵelementEnd();
|
|
348
353
|
} if (rf & 2) {
|
|
349
|
-
const
|
|
354
|
+
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
350
355
|
i0.ɵɵadvance();
|
|
351
|
-
i0.ɵɵclassProp("active",
|
|
356
|
+
i0.ɵɵclassProp("active", ctx_r2.recentRecordsEntityFilter === null);
|
|
352
357
|
i0.ɵɵadvance(2);
|
|
353
|
-
i0.ɵɵrepeater(
|
|
358
|
+
i0.ɵɵrepeater(ctx_r2.uniqueRecentRecordEntities);
|
|
354
359
|
} }
|
|
355
360
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
356
|
-
const
|
|
357
|
-
i0.ɵɵelementStart(0, "div",
|
|
358
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_For_8_Template_div_click_0_listener() { const
|
|
359
|
-
i0.ɵɵelementStart(1, "div",
|
|
361
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
362
|
+
i0.ɵɵelementStart(0, "div", 88);
|
|
363
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_For_8_Template_div_click_0_listener() { const record_r24 = i0.ɵɵrestoreView(_r23).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.onRecentRecordClick(record_r24)); });
|
|
364
|
+
i0.ɵɵelementStart(1, "div", 89);
|
|
360
365
|
i0.ɵɵelement(2, "i");
|
|
361
366
|
i0.ɵɵelementEnd();
|
|
362
|
-
i0.ɵɵelementStart(3, "div",
|
|
367
|
+
i0.ɵɵelementStart(3, "div", 90)(4, "span", 91);
|
|
363
368
|
i0.ɵɵtext(5);
|
|
364
369
|
i0.ɵɵelementEnd();
|
|
365
|
-
i0.ɵɵelementStart(6, "span",
|
|
370
|
+
i0.ɵɵelementStart(6, "span", 92);
|
|
366
371
|
i0.ɵɵtext(7);
|
|
367
372
|
i0.ɵɵelementEnd()();
|
|
368
|
-
i0.ɵɵelementStart(8, "span",
|
|
373
|
+
i0.ɵɵelementStart(8, "span", 93);
|
|
369
374
|
i0.ɵɵtext(9);
|
|
370
375
|
i0.ɵɵelementEnd()();
|
|
371
376
|
} if (rf & 2) {
|
|
372
|
-
const
|
|
373
|
-
const
|
|
374
|
-
i0.ɵɵproperty("title",
|
|
377
|
+
const record_r24 = ctx.$implicit;
|
|
378
|
+
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
379
|
+
i0.ɵɵproperty("title", record_r24.entityName + " - " + record_r24.recordId);
|
|
375
380
|
i0.ɵɵadvance(2);
|
|
376
|
-
i0.ɵɵclassMap(
|
|
381
|
+
i0.ɵɵclassMap(ctx_r2.getEntityIconById(record_r24.entityId));
|
|
377
382
|
i0.ɵɵadvance(3);
|
|
378
|
-
i0.ɵɵtextInterpolate(
|
|
383
|
+
i0.ɵɵtextInterpolate(record_r24.recordName || record_r24.recordId);
|
|
379
384
|
i0.ɵɵadvance(2);
|
|
380
|
-
i0.ɵɵtextInterpolate(
|
|
385
|
+
i0.ɵɵtextInterpolate(record_r24.entityName);
|
|
381
386
|
i0.ɵɵadvance(2);
|
|
382
|
-
i0.ɵɵtextInterpolate(
|
|
387
|
+
i0.ɵɵtextInterpolate(ctx_r2.formatRelativeTime(record_r24.latestAt));
|
|
383
388
|
} }
|
|
384
389
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
385
|
-
i0.ɵɵelementStart(0, "div",
|
|
386
|
-
i0.ɵɵelement(2, "i",
|
|
387
|
-
i0.ɵɵelementStart(3, "h3",
|
|
390
|
+
i0.ɵɵelementStart(0, "div", 64)(1, "div", 79);
|
|
391
|
+
i0.ɵɵelement(2, "i", 80);
|
|
392
|
+
i0.ɵɵelementStart(3, "h3", 70);
|
|
388
393
|
i0.ɵɵtext(4, "Recent Records");
|
|
389
394
|
i0.ɵɵelementEnd();
|
|
390
|
-
i0.ɵɵtemplate(5, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_Template, 5, 2, "div",
|
|
395
|
+
i0.ɵɵtemplate(5, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Conditional_5_Template, 5, 2, "div", 81);
|
|
391
396
|
i0.ɵɵelementEnd();
|
|
392
|
-
i0.ɵɵelementStart(6, "div",
|
|
393
|
-
i0.ɵɵrepeaterCreate(7, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_For_8_Template, 10, 6, "div",
|
|
397
|
+
i0.ɵɵelementStart(6, "div", 82);
|
|
398
|
+
i0.ɵɵrepeaterCreate(7, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_For_8_Template, 10, 6, "div", 83, _forTrack4);
|
|
394
399
|
i0.ɵɵelementEnd()();
|
|
395
400
|
} if (rf & 2) {
|
|
396
|
-
const
|
|
401
|
+
const ctx_r2 = i0.ɵɵnextContext(5);
|
|
397
402
|
i0.ɵɵadvance(5);
|
|
398
|
-
i0.ɵɵconditional(
|
|
403
|
+
i0.ɵɵconditional(ctx_r2.showRecentRecordsEntityFilter ? 5 : -1);
|
|
399
404
|
i0.ɵɵadvance(2);
|
|
400
|
-
i0.ɵɵrepeater(
|
|
405
|
+
i0.ɵɵrepeater(ctx_r2.filteredRecentRecords);
|
|
401
406
|
} }
|
|
402
407
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_2_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
403
|
-
const
|
|
404
|
-
i0.ɵɵelementStart(0, "div",
|
|
405
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_2_For_7_Template_div_click_0_listener() { const
|
|
406
|
-
i0.ɵɵelementStart(1, "div",
|
|
408
|
+
const _r25 = i0.ɵɵgetCurrentView();
|
|
409
|
+
i0.ɵɵelementStart(0, "div", 88);
|
|
410
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_2_For_7_Template_div_click_0_listener() { const record_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.onFavoriteRecordClick(record_r26)); });
|
|
411
|
+
i0.ɵɵelementStart(1, "div", 89);
|
|
407
412
|
i0.ɵɵelement(2, "i");
|
|
408
413
|
i0.ɵɵelementEnd();
|
|
409
|
-
i0.ɵɵelementStart(3, "div",
|
|
414
|
+
i0.ɵɵelementStart(3, "div", 90)(4, "span", 91);
|
|
410
415
|
i0.ɵɵtext(5);
|
|
411
416
|
i0.ɵɵelementEnd();
|
|
412
|
-
i0.ɵɵelementStart(6, "span",
|
|
417
|
+
i0.ɵɵelementStart(6, "span", 92);
|
|
413
418
|
i0.ɵɵtext(7);
|
|
414
419
|
i0.ɵɵelementEnd()()();
|
|
415
420
|
} if (rf & 2) {
|
|
416
|
-
const
|
|
417
|
-
const
|
|
418
|
-
i0.ɵɵproperty("title",
|
|
421
|
+
const record_r26 = ctx.$implicit;
|
|
422
|
+
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
423
|
+
i0.ɵɵproperty("title", record_r26.entityName + " - " + record_r26.recordId);
|
|
419
424
|
i0.ɵɵadvance(2);
|
|
420
|
-
i0.ɵɵclassMap(
|
|
425
|
+
i0.ɵɵclassMap(ctx_r2.getEntityIconById(record_r26.entityId));
|
|
421
426
|
i0.ɵɵadvance(3);
|
|
422
|
-
i0.ɵɵtextInterpolate(
|
|
427
|
+
i0.ɵɵtextInterpolate(record_r26.recordName || record_r26.recordId);
|
|
423
428
|
i0.ɵɵadvance(2);
|
|
424
|
-
i0.ɵɵtextInterpolate(
|
|
429
|
+
i0.ɵɵtextInterpolate(record_r26.entityName);
|
|
425
430
|
} }
|
|
426
431
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
427
|
-
i0.ɵɵelementStart(0, "div",
|
|
428
|
-
i0.ɵɵelement(2, "i",
|
|
429
|
-
i0.ɵɵelementStart(3, "h3",
|
|
432
|
+
i0.ɵɵelementStart(0, "div", 64)(1, "div", 79);
|
|
433
|
+
i0.ɵɵelement(2, "i", 94);
|
|
434
|
+
i0.ɵɵelementStart(3, "h3", 70);
|
|
430
435
|
i0.ɵɵtext(4, "Favorite Records");
|
|
431
436
|
i0.ɵɵelementEnd()();
|
|
432
|
-
i0.ɵɵelementStart(5, "div",
|
|
433
|
-
i0.ɵɵrepeaterCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_2_For_7_Template, 8, 5, "div",
|
|
437
|
+
i0.ɵɵelementStart(5, "div", 82);
|
|
438
|
+
i0.ɵɵrepeaterCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_2_For_7_Template, 8, 5, "div", 83, _forTrack6);
|
|
434
439
|
i0.ɵɵelementEnd()();
|
|
435
440
|
} if (rf & 2) {
|
|
436
|
-
const
|
|
441
|
+
const ctx_r2 = i0.ɵɵnextContext(5);
|
|
437
442
|
i0.ɵɵadvance(6);
|
|
438
|
-
i0.ɵɵrepeater(
|
|
443
|
+
i0.ɵɵrepeater(ctx_r2.favoriteRecords);
|
|
439
444
|
} }
|
|
440
445
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
441
|
-
i0.ɵɵelementStart(0, "div",
|
|
442
|
-
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Template, 9, 1, "div",
|
|
446
|
+
i0.ɵɵelementStart(0, "div", 78);
|
|
447
|
+
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_1_Template, 9, 1, "div", 64)(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Conditional_2_Template, 8, 0, "div", 64);
|
|
443
448
|
i0.ɵɵelementEnd();
|
|
444
449
|
} if (rf & 2) {
|
|
445
|
-
const
|
|
450
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
446
451
|
i0.ɵɵadvance();
|
|
447
|
-
i0.ɵɵconditional(
|
|
452
|
+
i0.ɵɵconditional(ctx_r2.recentRecords.length > 0 ? 1 : -1);
|
|
448
453
|
i0.ɵɵadvance();
|
|
449
|
-
i0.ɵɵconditional(
|
|
454
|
+
i0.ɵɵconditional(ctx_r2.favoriteRecords.length > 0 ? 2 : -1);
|
|
450
455
|
} }
|
|
451
456
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
452
|
-
const
|
|
453
|
-
i0.ɵɵelementStart(0, "div",
|
|
454
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_For_7_Template_div_click_0_listener() { const
|
|
455
|
-
i0.ɵɵelementStart(1, "div",
|
|
457
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
458
|
+
i0.ɵɵelementStart(0, "div", 98);
|
|
459
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_For_7_Template_div_click_0_listener() { const entity_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.onEntitySelected(entity_r28)); });
|
|
460
|
+
i0.ɵɵelementStart(1, "div", 99);
|
|
456
461
|
i0.ɵɵelement(2, "i");
|
|
457
462
|
i0.ɵɵelementEnd();
|
|
458
|
-
i0.ɵɵelementStart(3, "div",
|
|
463
|
+
i0.ɵɵelementStart(3, "div", 100)(4, "span", 101);
|
|
459
464
|
i0.ɵɵtext(5);
|
|
460
465
|
i0.ɵɵelementEnd()();
|
|
461
|
-
i0.ɵɵelementStart(6, "button",
|
|
462
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_For_7_Template_button_click_6_listener($event) { const
|
|
466
|
+
i0.ɵɵelementStart(6, "button", 102);
|
|
467
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_For_7_Template_button_click_6_listener($event) { const entity_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.toggleEntityFavorite(entity_r28, $event)); });
|
|
463
468
|
i0.ɵɵelement(7, "i");
|
|
464
469
|
i0.ɵɵelementEnd()();
|
|
465
470
|
} if (rf & 2) {
|
|
466
|
-
const
|
|
467
|
-
const
|
|
468
|
-
i0.ɵɵproperty("title",
|
|
471
|
+
const entity_r28 = ctx.$implicit;
|
|
472
|
+
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
473
|
+
i0.ɵɵproperty("title", entity_r28.Description || entity_r28.Name);
|
|
469
474
|
i0.ɵɵadvance(2);
|
|
470
|
-
i0.ɵɵclassMap(
|
|
475
|
+
i0.ɵɵclassMap(ctx_r2.getEntityIcon(entity_r28));
|
|
471
476
|
i0.ɵɵadvance(3);
|
|
472
|
-
i0.ɵɵtextInterpolate(
|
|
477
|
+
i0.ɵɵtextInterpolate(entity_r28.Name);
|
|
473
478
|
i0.ɵɵadvance();
|
|
474
|
-
i0.ɵɵclassProp("favorited",
|
|
475
|
-
i0.ɵɵproperty("title",
|
|
479
|
+
i0.ɵɵclassProp("favorited", ctx_r2.isEntityFavorited(entity_r28));
|
|
480
|
+
i0.ɵɵproperty("title", ctx_r2.isEntityFavorited(entity_r28) ? "Remove from favorites" : "Add to favorites");
|
|
476
481
|
i0.ɵɵadvance();
|
|
477
|
-
i0.ɵɵclassMap(
|
|
482
|
+
i0.ɵɵclassMap(ctx_r2.isEntityFavorited(entity_r28) ? "fa-solid fa-star" : "fa-regular fa-star");
|
|
478
483
|
} }
|
|
479
484
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
480
|
-
i0.ɵɵelementStart(0, "div",
|
|
481
|
-
i0.ɵɵelement(2, "i",
|
|
482
|
-
i0.ɵɵelementStart(3, "h3",
|
|
485
|
+
i0.ɵɵelementStart(0, "div", 64)(1, "div", 79);
|
|
486
|
+
i0.ɵɵelement(2, "i", 95);
|
|
487
|
+
i0.ɵɵelementStart(3, "h3", 70);
|
|
483
488
|
i0.ɵɵtext(4, "Recent Entities");
|
|
484
489
|
i0.ɵɵelementEnd()();
|
|
485
|
-
i0.ɵɵelementStart(5, "div",
|
|
486
|
-
i0.ɵɵrepeaterCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_For_7_Template, 8, 9, "div",
|
|
490
|
+
i0.ɵɵelementStart(5, "div", 96);
|
|
491
|
+
i0.ɵɵrepeaterCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_For_7_Template, 8, 9, "div", 97, _forTrack3);
|
|
487
492
|
i0.ɵɵelementEnd()();
|
|
488
493
|
} if (rf & 2) {
|
|
489
|
-
const
|
|
494
|
+
const ctx_r2 = i0.ɵɵnextContext(5);
|
|
490
495
|
i0.ɵɵadvance(6);
|
|
491
|
-
i0.ɵɵrepeater(
|
|
496
|
+
i0.ɵɵrepeater(ctx_r2.recentEntities);
|
|
492
497
|
} }
|
|
493
498
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
494
|
-
const
|
|
495
|
-
i0.ɵɵelementStart(0, "div",
|
|
496
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_For_7_Template_div_click_0_listener() { const
|
|
497
|
-
i0.ɵɵelementStart(1, "div",
|
|
499
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
500
|
+
i0.ɵɵelementStart(0, "div", 98);
|
|
501
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_For_7_Template_div_click_0_listener() { const entity_r30 = i0.ɵɵrestoreView(_r29).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.onEntitySelected(entity_r30)); });
|
|
502
|
+
i0.ɵɵelementStart(1, "div", 99);
|
|
498
503
|
i0.ɵɵelement(2, "i");
|
|
499
504
|
i0.ɵɵelementEnd();
|
|
500
|
-
i0.ɵɵelementStart(3, "div",
|
|
505
|
+
i0.ɵɵelementStart(3, "div", 100)(4, "span", 101);
|
|
501
506
|
i0.ɵɵtext(5);
|
|
502
507
|
i0.ɵɵelementEnd()();
|
|
503
|
-
i0.ɵɵelementStart(6, "button",
|
|
504
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_For_7_Template_button_click_6_listener($event) { const
|
|
505
|
-
i0.ɵɵelement(7, "i",
|
|
508
|
+
i0.ɵɵelementStart(6, "button", 103);
|
|
509
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_For_7_Template_button_click_6_listener($event) { const entity_r30 = i0.ɵɵrestoreView(_r29).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.toggleEntityFavorite(entity_r30, $event)); });
|
|
510
|
+
i0.ɵɵelement(7, "i", 104);
|
|
506
511
|
i0.ɵɵelementEnd()();
|
|
507
512
|
} if (rf & 2) {
|
|
508
|
-
const
|
|
509
|
-
const
|
|
510
|
-
i0.ɵɵproperty("title",
|
|
513
|
+
const entity_r30 = ctx.$implicit;
|
|
514
|
+
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
515
|
+
i0.ɵɵproperty("title", entity_r30.Description || entity_r30.Name);
|
|
511
516
|
i0.ɵɵadvance(2);
|
|
512
|
-
i0.ɵɵclassMap(
|
|
517
|
+
i0.ɵɵclassMap(ctx_r2.getEntityIcon(entity_r30));
|
|
513
518
|
i0.ɵɵadvance(3);
|
|
514
|
-
i0.ɵɵtextInterpolate(
|
|
519
|
+
i0.ɵɵtextInterpolate(entity_r30.Name);
|
|
515
520
|
} }
|
|
516
521
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
517
|
-
i0.ɵɵelementStart(0, "div",
|
|
518
|
-
i0.ɵɵelement(2, "i",
|
|
519
|
-
i0.ɵɵelementStart(3, "h3",
|
|
522
|
+
i0.ɵɵelementStart(0, "div", 64)(1, "div", 79);
|
|
523
|
+
i0.ɵɵelement(2, "i", 94);
|
|
524
|
+
i0.ɵɵelementStart(3, "h3", 70);
|
|
520
525
|
i0.ɵɵtext(4, "Favorite Entities");
|
|
521
526
|
i0.ɵɵelementEnd()();
|
|
522
|
-
i0.ɵɵelementStart(5, "div",
|
|
523
|
-
i0.ɵɵrepeaterCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_For_7_Template, 8, 4, "div",
|
|
527
|
+
i0.ɵɵelementStart(5, "div", 96);
|
|
528
|
+
i0.ɵɵrepeaterCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_For_7_Template, 8, 4, "div", 97, _forTrack3);
|
|
524
529
|
i0.ɵɵelementEnd()();
|
|
525
530
|
} if (rf & 2) {
|
|
526
|
-
const
|
|
531
|
+
const ctx_r2 = i0.ɵɵnextContext(5);
|
|
527
532
|
i0.ɵɵadvance(6);
|
|
528
|
-
i0.ɵɵrepeater(
|
|
533
|
+
i0.ɵɵrepeater(ctx_r2.favoriteEntities);
|
|
529
534
|
} }
|
|
530
535
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
531
|
-
i0.ɵɵelementStart(0, "div",
|
|
532
|
-
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_Template, 8, 0, "div",
|
|
536
|
+
i0.ɵɵelementStart(0, "div", 78);
|
|
537
|
+
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_1_Template, 8, 0, "div", 64)(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Conditional_2_Template, 8, 0, "div", 64);
|
|
533
538
|
i0.ɵɵelementEnd();
|
|
534
539
|
} if (rf & 2) {
|
|
535
|
-
const
|
|
540
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
536
541
|
i0.ɵɵadvance();
|
|
537
|
-
i0.ɵɵconditional(
|
|
542
|
+
i0.ɵɵconditional(ctx_r2.recentEntities.length > 0 ? 1 : -1);
|
|
538
543
|
i0.ɵɵadvance();
|
|
539
|
-
i0.ɵɵconditional(
|
|
544
|
+
i0.ɵɵconditional(ctx_r2.favoriteEntities.length > 0 ? 2 : -1);
|
|
540
545
|
} }
|
|
541
546
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
542
|
-
i0.ɵɵelementStart(0, "div",
|
|
543
|
-
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Template, 3, 2, "div",
|
|
547
|
+
i0.ɵɵelementStart(0, "div", 77);
|
|
548
|
+
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_1_Template, 3, 2, "div", 78)(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Conditional_2_Template, 3, 2, "div", 78);
|
|
544
549
|
i0.ɵɵelementEnd();
|
|
545
550
|
} if (rf & 2) {
|
|
546
|
-
const
|
|
547
|
-
i0.ɵɵclassProp("single-column", !
|
|
551
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
552
|
+
i0.ɵɵclassProp("single-column", !ctx_r2.hasRecordsColumnContent || !ctx_r2.hasEntitiesColumnContent);
|
|
548
553
|
i0.ɵɵadvance();
|
|
549
|
-
i0.ɵɵconditional(
|
|
554
|
+
i0.ɵɵconditional(ctx_r2.hasRecordsColumnContent ? 1 : -1);
|
|
550
555
|
i0.ɵɵadvance();
|
|
551
|
-
i0.ɵɵconditional(
|
|
556
|
+
i0.ɵɵconditional(ctx_r2.hasEntitiesColumnContent ? 2 : -1);
|
|
552
557
|
} }
|
|
553
558
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
554
559
|
i0.ɵɵtext(0, " All Entities ");
|
|
@@ -557,77 +562,77 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional
|
|
|
557
562
|
i0.ɵɵtext(0, " Common Entities ");
|
|
558
563
|
} }
|
|
559
564
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
560
|
-
i0.ɵɵelementStart(0, "span",
|
|
565
|
+
i0.ɵɵelementStart(0, "span", 71);
|
|
561
566
|
i0.ɵɵtext(1);
|
|
562
567
|
i0.ɵɵelementEnd();
|
|
563
568
|
} if (rf & 2) {
|
|
564
|
-
const
|
|
569
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
565
570
|
i0.ɵɵadvance();
|
|
566
|
-
i0.ɵɵtextInterpolate1("",
|
|
571
|
+
i0.ɵɵtextInterpolate1("", ctx_r2.filteredEntities.length, " matching");
|
|
567
572
|
} }
|
|
568
573
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
569
|
-
const
|
|
570
|
-
i0.ɵɵelementStart(0, "div",
|
|
571
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_9_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
574
|
+
const _r31 = i0.ɵɵgetCurrentView();
|
|
575
|
+
i0.ɵɵelementStart(0, "div", 72)(1, "button", 54);
|
|
576
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_9_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleShowAllEntities()); });
|
|
572
577
|
i0.ɵɵtext(2, " Common ");
|
|
573
578
|
i0.ɵɵelementEnd();
|
|
574
|
-
i0.ɵɵelementStart(3, "button",
|
|
575
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_9_Template_button_click_3_listener() { i0.ɵɵrestoreView(
|
|
579
|
+
i0.ɵɵelementStart(3, "button", 54);
|
|
580
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_9_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r31); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleShowAllEntities()); });
|
|
576
581
|
i0.ɵɵtext(4, " All ");
|
|
577
582
|
i0.ɵɵelementEnd()();
|
|
578
583
|
} if (rf & 2) {
|
|
579
|
-
const
|
|
584
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
580
585
|
i0.ɵɵadvance();
|
|
581
|
-
i0.ɵɵclassProp("active", !
|
|
582
|
-
i0.ɵɵpropertyInterpolate1("title", "Show common entities (",
|
|
586
|
+
i0.ɵɵclassProp("active", !ctx_r2.state.showAllEntities);
|
|
587
|
+
i0.ɵɵpropertyInterpolate1("title", "Show common entities (", ctx_r2.commonEntitiesCount, ")");
|
|
583
588
|
i0.ɵɵadvance(2);
|
|
584
|
-
i0.ɵɵclassProp("active",
|
|
585
|
-
i0.ɵɵpropertyInterpolate1("title", "Show all entities (",
|
|
589
|
+
i0.ɵɵclassProp("active", ctx_r2.state.showAllEntities);
|
|
590
|
+
i0.ɵɵpropertyInterpolate1("title", "Show all entities (", ctx_r2.allEntitiesCount, ")");
|
|
586
591
|
} }
|
|
587
592
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
588
|
-
i0.ɵɵelementStart(0, "p",
|
|
593
|
+
i0.ɵɵelementStart(0, "p", 109);
|
|
589
594
|
i0.ɵɵtext(1);
|
|
590
595
|
i0.ɵɵelementEnd();
|
|
591
596
|
} if (rf & 2) {
|
|
592
|
-
const
|
|
597
|
+
const entity_r33 = i0.ɵɵnextContext().$implicit;
|
|
593
598
|
i0.ɵɵadvance();
|
|
594
|
-
i0.ɵɵtextInterpolate(
|
|
599
|
+
i0.ɵɵtextInterpolate(entity_r33.Description);
|
|
595
600
|
} }
|
|
596
601
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
597
|
-
const
|
|
598
|
-
i0.ɵɵelementStart(0, "div",
|
|
599
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Template_div_click_0_listener() { const
|
|
600
|
-
i0.ɵɵelementStart(1, "div",
|
|
602
|
+
const _r32 = i0.ɵɵgetCurrentView();
|
|
603
|
+
i0.ɵɵelementStart(0, "div", 105);
|
|
604
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Template_div_click_0_listener() { const entity_r33 = i0.ɵɵrestoreView(_r32).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onEntitySelected(entity_r33)); });
|
|
605
|
+
i0.ɵɵelementStart(1, "div", 106);
|
|
601
606
|
i0.ɵɵelement(2, "i");
|
|
602
607
|
i0.ɵɵelementEnd();
|
|
603
|
-
i0.ɵɵelementStart(3, "div",
|
|
608
|
+
i0.ɵɵelementStart(3, "div", 107)(4, "h4", 108);
|
|
604
609
|
i0.ɵɵtext(5);
|
|
605
610
|
i0.ɵɵelementEnd();
|
|
606
|
-
i0.ɵɵtemplate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Conditional_6_Template, 2, 1, "p",
|
|
611
|
+
i0.ɵɵtemplate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Conditional_6_Template, 2, 1, "p", 109);
|
|
607
612
|
i0.ɵɵelementEnd();
|
|
608
|
-
i0.ɵɵelementStart(7, "button",
|
|
609
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Template_button_click_7_listener($event) { const
|
|
613
|
+
i0.ɵɵelementStart(7, "button", 102);
|
|
614
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Template_button_click_7_listener($event) { const entity_r33 = i0.ɵɵrestoreView(_r32).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.toggleEntityFavorite(entity_r33, $event)); });
|
|
610
615
|
i0.ɵɵelement(8, "i");
|
|
611
616
|
i0.ɵɵelementEnd()();
|
|
612
617
|
} if (rf & 2) {
|
|
613
|
-
const
|
|
614
|
-
const
|
|
615
|
-
i0.ɵɵproperty("title",
|
|
618
|
+
const entity_r33 = ctx.$implicit;
|
|
619
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
620
|
+
i0.ɵɵproperty("title", entity_r33.Description || entity_r33.Name);
|
|
616
621
|
i0.ɵɵadvance(2);
|
|
617
|
-
i0.ɵɵclassMap(
|
|
622
|
+
i0.ɵɵclassMap(ctx_r2.getEntityIcon(entity_r33));
|
|
618
623
|
i0.ɵɵadvance(3);
|
|
619
|
-
i0.ɵɵtextInterpolate(
|
|
624
|
+
i0.ɵɵtextInterpolate(entity_r33.Name);
|
|
620
625
|
i0.ɵɵadvance();
|
|
621
|
-
i0.ɵɵconditional(
|
|
626
|
+
i0.ɵɵconditional(entity_r33.Description ? 6 : -1);
|
|
622
627
|
i0.ɵɵadvance();
|
|
623
|
-
i0.ɵɵclassProp("favorited",
|
|
624
|
-
i0.ɵɵproperty("title",
|
|
628
|
+
i0.ɵɵclassProp("favorited", ctx_r2.isEntityFavorited(entity_r33));
|
|
629
|
+
i0.ɵɵproperty("title", ctx_r2.isEntityFavorited(entity_r33) ? "Remove from favorites" : "Add to favorites");
|
|
625
630
|
i0.ɵɵadvance();
|
|
626
|
-
i0.ɵɵclassMap(
|
|
631
|
+
i0.ɵɵclassMap(ctx_r2.isEntityFavorited(entity_r33) ? "fa-solid fa-star" : "fa-regular fa-star");
|
|
627
632
|
} }
|
|
628
633
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
629
|
-
i0.ɵɵelementStart(0, "div",
|
|
630
|
-
i0.ɵɵelement(1, "i",
|
|
634
|
+
i0.ɵɵelementStart(0, "div", 75);
|
|
635
|
+
i0.ɵɵelement(1, "i", 110);
|
|
631
636
|
i0.ɵɵelementStart(2, "h3");
|
|
632
637
|
i0.ɵɵtext(3, "No Matching Entities");
|
|
633
638
|
i0.ɵɵelementEnd();
|
|
@@ -635,13 +640,13 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional
|
|
|
635
640
|
i0.ɵɵtext(5);
|
|
636
641
|
i0.ɵɵelementEnd()();
|
|
637
642
|
} if (rf & 2) {
|
|
638
|
-
const
|
|
643
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
639
644
|
i0.ɵɵadvance(5);
|
|
640
|
-
i0.ɵɵtextInterpolate1("No entities match \"",
|
|
645
|
+
i0.ɵɵtextInterpolate1("No entities match \"", ctx_r2.entityFilterText, "\"");
|
|
641
646
|
} }
|
|
642
647
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
643
|
-
i0.ɵɵelementStart(0, "div",
|
|
644
|
-
i0.ɵɵelement(1, "i",
|
|
648
|
+
i0.ɵɵelementStart(0, "div", 76);
|
|
649
|
+
i0.ɵɵelement(1, "i", 111);
|
|
645
650
|
i0.ɵɵelementStart(2, "h3");
|
|
646
651
|
i0.ɵɵtext(3, "No Entities Available");
|
|
647
652
|
i0.ɵɵelementEnd();
|
|
@@ -650,65 +655,71 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional
|
|
|
650
655
|
i0.ɵɵelementEnd()();
|
|
651
656
|
} }
|
|
652
657
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
653
|
-
i0.ɵɵtemplate(0, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Template, 3, 4, "div",
|
|
654
|
-
i0.ɵɵelementStart(1, "div",
|
|
655
|
-
i0.ɵɵelement(4, "i",
|
|
656
|
-
i0.ɵɵelementStart(5, "h3",
|
|
658
|
+
i0.ɵɵtemplate(0, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_0_Template, 3, 4, "div", 66);
|
|
659
|
+
i0.ɵɵelementStart(1, "div", 64)(2, "div", 67)(3, "div", 68);
|
|
660
|
+
i0.ɵɵelement(4, "i", 69);
|
|
661
|
+
i0.ɵɵelementStart(5, "h3", 70);
|
|
657
662
|
i0.ɵɵtemplate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template, 1, 0)(7, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_7_Template, 1, 0);
|
|
658
663
|
i0.ɵɵelementEnd();
|
|
659
|
-
i0.ɵɵtemplate(8, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_8_Template, 2, 1, "span",
|
|
664
|
+
i0.ɵɵtemplate(8, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_8_Template, 2, 1, "span", 71);
|
|
660
665
|
i0.ɵɵelementEnd();
|
|
661
|
-
i0.ɵɵtemplate(9, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_9_Template, 5, 8, "div",
|
|
666
|
+
i0.ɵɵtemplate(9, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_9_Template, 5, 8, "div", 72);
|
|
662
667
|
i0.ɵɵelementEnd();
|
|
663
|
-
i0.ɵɵelementStart(10, "div",
|
|
664
|
-
i0.ɵɵrepeaterCreate(11, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Template, 9, 10, "div",
|
|
668
|
+
i0.ɵɵelementStart(10, "div", 73);
|
|
669
|
+
i0.ɵɵrepeaterCreate(11, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_12_Template, 9, 10, "div", 74, _forTrack3);
|
|
665
670
|
i0.ɵɵelementEnd();
|
|
666
|
-
i0.ɵɵtemplate(13, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_13_Template, 6, 1, "div",
|
|
671
|
+
i0.ɵɵtemplate(13, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_13_Template, 6, 1, "div", 75)(14, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_14_Template, 6, 0, "div", 76);
|
|
667
672
|
i0.ɵɵelementEnd();
|
|
668
673
|
} if (rf & 2) {
|
|
669
|
-
const
|
|
670
|
-
i0.ɵɵconditional(
|
|
674
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
675
|
+
i0.ɵɵconditional(ctx_r2.hasTopSectionContent ? 0 : -1);
|
|
671
676
|
i0.ɵɵadvance(6);
|
|
672
|
-
i0.ɵɵconditional(
|
|
677
|
+
i0.ɵɵconditional(ctx_r2.state.showAllEntities || !ctx_r2.showCommonAllToggle ? 6 : 7);
|
|
673
678
|
i0.ɵɵadvance(2);
|
|
674
|
-
i0.ɵɵconditional(
|
|
679
|
+
i0.ɵɵconditional(ctx_r2.entityFilterText && ctx_r2.filteredEntities.length !== ctx_r2.entities.length ? 8 : -1);
|
|
675
680
|
i0.ɵɵadvance();
|
|
676
|
-
i0.ɵɵconditional(
|
|
681
|
+
i0.ɵɵconditional(ctx_r2.showCommonAllToggle ? 9 : -1);
|
|
677
682
|
i0.ɵɵadvance(2);
|
|
678
|
-
i0.ɵɵrepeater(
|
|
683
|
+
i0.ɵɵrepeater(ctx_r2.filteredEntities);
|
|
679
684
|
i0.ɵɵadvance(2);
|
|
680
|
-
i0.ɵɵconditional(
|
|
685
|
+
i0.ɵɵconditional(ctx_r2.filteredEntities.length === 0 && ctx_r2.entities.length > 0 ? 13 : -1);
|
|
681
686
|
i0.ɵɵadvance();
|
|
682
|
-
i0.ɵɵconditional(
|
|
687
|
+
i0.ɵɵconditional(ctx_r2.entities.length === 0 ? 14 : -1);
|
|
683
688
|
} }
|
|
684
689
|
function DataExplorerDashboardComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
685
|
-
i0.ɵɵelementStart(0, "div",
|
|
686
|
-
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_1_Template, 2, 0, "div",
|
|
690
|
+
i0.ɵɵelementStart(0, "div", 12);
|
|
691
|
+
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_1_Template, 2, 0, "div", 63)(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template, 15, 6, "div", 64);
|
|
687
692
|
i0.ɵɵelementEnd();
|
|
688
693
|
} if (rf & 2) {
|
|
689
|
-
const
|
|
694
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
690
695
|
i0.ɵɵadvance();
|
|
691
|
-
i0.ɵɵconditional(
|
|
696
|
+
i0.ɵɵconditional(ctx_r2.isLoadingEntities ? 1 : 2);
|
|
692
697
|
} }
|
|
693
698
|
function DataExplorerDashboardComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
694
|
-
const
|
|
695
|
-
i0.ɵɵelementStart(0, "mj-entity-viewer",
|
|
696
|
-
i0.ɵɵlistener("viewModeChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_viewModeChange_0_listener($event) { i0.ɵɵrestoreView(
|
|
699
|
+
const _r34 = i0.ɵɵgetCurrentView();
|
|
700
|
+
i0.ɵɵelementStart(0, "mj-entity-viewer", 112);
|
|
701
|
+
i0.ɵɵlistener("viewModeChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_viewModeChange_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onViewModeChanged($event)); })("filterTextChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_filterTextChange_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilterTextChanged($event)); })("recordSelected", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_recordSelected_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onViewerRecordSelected($event)); })("recordOpened", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_recordOpened_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onViewerRecordOpened($event)); })("dataLoaded", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_dataLoaded_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDataLoaded($event)); })("filteredCountChanged", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_filteredCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onFilteredCountChanged($event)); })("gridStateChanged", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_gridStateChanged_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onGridStateChanged($event)); });
|
|
697
702
|
i0.ɵɵelementEnd();
|
|
698
703
|
} if (rf & 2) {
|
|
699
|
-
const
|
|
700
|
-
i0.ɵɵproperty("entity",
|
|
704
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
705
|
+
i0.ɵɵproperty("entity", ctx_r2.selectedEntity)("viewEntity", ctx_r2.selectedViewEntity)("viewMode", ctx_r2.state.viewMode)("filterText", ctx_r2.debouncedFilterText)("selectedRecordId", ctx_r2.state.selectedRecordId)("config", ctx_r2.viewerConfig)("gridState", ctx_r2.currentGridState)("timelineConfig", ctx_r2.currentTimelineConfig);
|
|
701
706
|
} }
|
|
702
707
|
function DataExplorerDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
703
|
-
const
|
|
704
|
-
i0.ɵɵelementStart(0, "div",
|
|
705
|
-
i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_close_1_listener() { i0.ɵɵrestoreView(
|
|
708
|
+
const _r35 = i0.ɵɵgetCurrentView();
|
|
709
|
+
i0.ɵɵelementStart(0, "div", 113)(1, "mj-entity-record-detail-panel", 114);
|
|
710
|
+
i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_close_1_listener() { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onDetailPanelClosed()); })("openRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openRecord_1_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onOpenRecord($event)); })("navigateToRelated", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_navigateToRelated_1_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onNavigateToRelated($event)); })("openRelatedRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openRelatedRecord_1_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onOpenRelatedRecord($event)); })("openForeignKeyRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openForeignKeyRecord_1_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onOpenForeignKeyRecord($event)); });
|
|
706
711
|
i0.ɵɵelementEnd()();
|
|
707
712
|
} if (rf & 2) {
|
|
708
|
-
const
|
|
709
|
-
i0.ɵɵstyleProp("width",
|
|
713
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
714
|
+
i0.ɵɵstyleProp("width", ctx_r2.state.detailPanelWidth, "px");
|
|
710
715
|
i0.ɵɵadvance();
|
|
711
|
-
i0.ɵɵproperty("entity",
|
|
716
|
+
i0.ɵɵproperty("entity", ctx_r2.detailPanelEntity)("record", ctx_r2.selectedRecord);
|
|
717
|
+
} }
|
|
718
|
+
function DataExplorerDashboardComponent_For_22_Template(rf, ctx) { if (rf & 1) {
|
|
719
|
+
i0.ɵɵelement(0, "kendo-excelexport-column", 18);
|
|
720
|
+
} if (rf & 2) {
|
|
721
|
+
const col_r36 = ctx.$implicit;
|
|
722
|
+
i0.ɵɵproperty("field", col_r36.Name)("title", col_r36.DisplayName);
|
|
712
723
|
} }
|
|
713
724
|
/**
|
|
714
725
|
* Data Explorer Dashboard - Power user interface for exploring data across entities
|
|
@@ -733,6 +744,8 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
733
744
|
entityViewerRef;
|
|
734
745
|
/** Reference to the view config panel for passing filter state */
|
|
735
746
|
viewConfigPanelRef;
|
|
747
|
+
/** Reference to the Excel export component */
|
|
748
|
+
excelExportRef;
|
|
736
749
|
/**
|
|
737
750
|
* Optional filter to constrain which entities are shown in the explorer.
|
|
738
751
|
* Can filter by applicationId, schemaNames, or explicit entityNames.
|
|
@@ -796,6 +809,10 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
796
809
|
isLoadingRecentRecords = true;
|
|
797
810
|
// Entity filter for recent records (null = show all, string = filter by entityId)
|
|
798
811
|
recentRecordsEntityFilter = null;
|
|
812
|
+
// Export functionality
|
|
813
|
+
exportData = [];
|
|
814
|
+
exportColumns = [];
|
|
815
|
+
exportFileName = 'export.xlsx';
|
|
799
816
|
/**
|
|
800
817
|
* Filtered entities based on entityFilterText (for home screen)
|
|
801
818
|
* Excludes entities shown in recent or favorites sections
|
|
@@ -1080,6 +1097,8 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1080
1097
|
filterDialogFields = [];
|
|
1081
1098
|
filterDialogState = createEmptyFilter();
|
|
1082
1099
|
filterDialogDisabled = false;
|
|
1100
|
+
// View save state
|
|
1101
|
+
isSavingView = false;
|
|
1083
1102
|
constructor(stateService, cdr, router, recentAccessService, navigationService) {
|
|
1084
1103
|
super();
|
|
1085
1104
|
this.stateService = stateService;
|
|
@@ -1492,6 +1511,8 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1492
1511
|
async onSaveView(event) {
|
|
1493
1512
|
if (!this.selectedEntity)
|
|
1494
1513
|
return;
|
|
1514
|
+
this.isSavingView = true;
|
|
1515
|
+
this.cdr.detectChanges();
|
|
1495
1516
|
try {
|
|
1496
1517
|
const md = new Metadata();
|
|
1497
1518
|
// Build GridState in Kendo-compatible format
|
|
@@ -1580,6 +1601,10 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1580
1601
|
catch (error) {
|
|
1581
1602
|
console.error('[DataExplorer] Error saving view:', error);
|
|
1582
1603
|
}
|
|
1604
|
+
finally {
|
|
1605
|
+
this.isSavingView = false;
|
|
1606
|
+
this.cdr.detectChanges();
|
|
1607
|
+
}
|
|
1583
1608
|
}
|
|
1584
1609
|
/**
|
|
1585
1610
|
* Build GridState in Kendo-compatible format
|
|
@@ -1784,6 +1809,147 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1784
1809
|
RecordPKey: record.PrimaryKey
|
|
1785
1810
|
});
|
|
1786
1811
|
}
|
|
1812
|
+
/**
|
|
1813
|
+
* Handle creating a new record for the current entity
|
|
1814
|
+
*/
|
|
1815
|
+
onCreateNewRecord() {
|
|
1816
|
+
if (!this.selectedEntity)
|
|
1817
|
+
return;
|
|
1818
|
+
// Use NavigationService to open a new record form
|
|
1819
|
+
this.navigationService.OpenNewEntityRecord(this.selectedEntity.Name);
|
|
1820
|
+
}
|
|
1821
|
+
/**
|
|
1822
|
+
* Handle export to Excel request
|
|
1823
|
+
*/
|
|
1824
|
+
async onExport() {
|
|
1825
|
+
if (!this.excelExportRef || !this.selectedEntity) {
|
|
1826
|
+
console.error('Cannot export: Excel export component or entity not available');
|
|
1827
|
+
return;
|
|
1828
|
+
}
|
|
1829
|
+
try {
|
|
1830
|
+
this.showNotification('Working on the export, will notify you when it is complete...', 'info', 2000);
|
|
1831
|
+
const data = await this.getExportData();
|
|
1832
|
+
// Get visible columns in priority order:
|
|
1833
|
+
// 1. Current grid state (reflects actual displayed columns including user modifications)
|
|
1834
|
+
// 2. View's column configuration (if a view is selected)
|
|
1835
|
+
// 3. All non-virtual fields (fallback for default view)
|
|
1836
|
+
if (this.currentGridState?.columnSettings && this.currentGridState.columnSettings.length > 0) {
|
|
1837
|
+
// Use current grid state - only export visible columns in grid order
|
|
1838
|
+
const visibleColumns = this.currentGridState.columnSettings.filter(col => col.hidden !== true);
|
|
1839
|
+
this.exportColumns = visibleColumns.map(col => ({
|
|
1840
|
+
Name: col.Name,
|
|
1841
|
+
DisplayName: col.DisplayName || col.Name
|
|
1842
|
+
}));
|
|
1843
|
+
}
|
|
1844
|
+
else if (this.selectedViewEntity?.Columns) {
|
|
1845
|
+
// Use view's column configuration - only export visible columns in view order
|
|
1846
|
+
const visibleColumns = this.selectedViewEntity.Columns.filter(col => !col.hidden);
|
|
1847
|
+
this.exportColumns = visibleColumns.map(col => ({
|
|
1848
|
+
Name: col.Name,
|
|
1849
|
+
DisplayName: col.DisplayName || col.Name
|
|
1850
|
+
}));
|
|
1851
|
+
}
|
|
1852
|
+
else {
|
|
1853
|
+
// Fall back to all non-virtual fields if no view is selected
|
|
1854
|
+
const visibleFields = this.selectedEntity.Fields.filter(f => !f.IsVirtual);
|
|
1855
|
+
this.exportColumns = visibleFields.map(f => ({
|
|
1856
|
+
Name: f.Name,
|
|
1857
|
+
DisplayName: f.DisplayNameOrName
|
|
1858
|
+
}));
|
|
1859
|
+
}
|
|
1860
|
+
this.exportData = data;
|
|
1861
|
+
// Set the export filename
|
|
1862
|
+
const viewName = this.selectedViewEntity?.Name || 'Data';
|
|
1863
|
+
this.exportFileName = `${this.selectedEntity.Name}_${viewName}_${new Date().toISOString().split('T')[0]}.xlsx`;
|
|
1864
|
+
// Wait for Angular to update the DOM with the new data before triggering save
|
|
1865
|
+
setTimeout(() => {
|
|
1866
|
+
this.excelExportRef.save();
|
|
1867
|
+
this.showNotification('Excel Export Complete', 'success', 2000);
|
|
1868
|
+
}, 100);
|
|
1869
|
+
}
|
|
1870
|
+
catch (e) {
|
|
1871
|
+
this.showNotification('Error exporting data', 'error', 5000);
|
|
1872
|
+
console.error('Export error:', e);
|
|
1873
|
+
}
|
|
1874
|
+
}
|
|
1875
|
+
/**
|
|
1876
|
+
* Get the data for export - loads all records for the current view/entity
|
|
1877
|
+
*/
|
|
1878
|
+
async getExportData() {
|
|
1879
|
+
if (!this.selectedEntity) {
|
|
1880
|
+
throw new Error('No entity selected for export');
|
|
1881
|
+
}
|
|
1882
|
+
const md = new Metadata();
|
|
1883
|
+
const rv = new RunView();
|
|
1884
|
+
// Build the run view params based on current state
|
|
1885
|
+
const baseParams = {
|
|
1886
|
+
EntityName: this.selectedEntity.Name,
|
|
1887
|
+
ExtraFilter: this.buildExtraFilter(),
|
|
1888
|
+
OrderBy: this.buildOrderBy(),
|
|
1889
|
+
IgnoreMaxRows: true,
|
|
1890
|
+
ForceAuditLog: true,
|
|
1891
|
+
AuditLogDescription: `Export of Data From ${this.selectedViewEntity ? '"' + this.selectedViewEntity.Name + '"' : this.selectedEntity.Name} View for User ${md.CurrentUser.Email}`
|
|
1892
|
+
};
|
|
1893
|
+
// Add smart filter if present
|
|
1894
|
+
const params = this.debouncedFilterText
|
|
1895
|
+
? { ...baseParams, UserSearchString: this.debouncedFilterText }
|
|
1896
|
+
: baseParams;
|
|
1897
|
+
const result = await rv.RunView(params);
|
|
1898
|
+
if (result && result.Success) {
|
|
1899
|
+
return result.Results;
|
|
1900
|
+
}
|
|
1901
|
+
else {
|
|
1902
|
+
throw new Error('Unable to get export data: ' + (result?.ErrorMessage || 'Unknown error'));
|
|
1903
|
+
}
|
|
1904
|
+
}
|
|
1905
|
+
/**
|
|
1906
|
+
* Build the ExtraFilter string based on current view and filter state
|
|
1907
|
+
*/
|
|
1908
|
+
buildExtraFilter() {
|
|
1909
|
+
const filters = [];
|
|
1910
|
+
// Add view filter if a view is selected
|
|
1911
|
+
if (this.selectedViewEntity?.WhereClause) {
|
|
1912
|
+
filters.push(`(${this.selectedViewEntity.WhereClause})`);
|
|
1913
|
+
}
|
|
1914
|
+
// Add smart filter if present
|
|
1915
|
+
if (this.debouncedFilterText) {
|
|
1916
|
+
// Smart filter is applied via UserSearchString in RunView, not ExtraFilter
|
|
1917
|
+
// So we don't need to add it here
|
|
1918
|
+
}
|
|
1919
|
+
return filters.join(' AND ');
|
|
1920
|
+
}
|
|
1921
|
+
/**
|
|
1922
|
+
* Build the OrderBy string based on current view state
|
|
1923
|
+
*/
|
|
1924
|
+
buildOrderBy() {
|
|
1925
|
+
// Use view's OrderByClause if available
|
|
1926
|
+
if (this.selectedViewEntity?.OrderByClause) {
|
|
1927
|
+
return this.selectedViewEntity.OrderByClause;
|
|
1928
|
+
}
|
|
1929
|
+
// Use grid state sort if available
|
|
1930
|
+
if (this.currentGridState?.sortSettings && this.currentGridState.sortSettings.length > 0) {
|
|
1931
|
+
const sorts = this.currentGridState.sortSettings.map(s => `${s.field} ${s.dir.toUpperCase()}`);
|
|
1932
|
+
return sorts.join(', ');
|
|
1933
|
+
}
|
|
1934
|
+
// Default sort by primary key
|
|
1935
|
+
return this.selectedEntity.FirstPrimaryKey.Name;
|
|
1936
|
+
}
|
|
1937
|
+
/**
|
|
1938
|
+
* Show a notification to the user
|
|
1939
|
+
*/
|
|
1940
|
+
showNotification(message, type, duration) {
|
|
1941
|
+
const data = {
|
|
1942
|
+
message: message,
|
|
1943
|
+
style: type,
|
|
1944
|
+
DisplayDuration: duration
|
|
1945
|
+
};
|
|
1946
|
+
MJGlobal.Instance.RaiseEvent({
|
|
1947
|
+
component: this,
|
|
1948
|
+
event: MJEventType.DisplaySimpleNotificationRequest,
|
|
1949
|
+
eventCode: "",
|
|
1950
|
+
args: data
|
|
1951
|
+
});
|
|
1952
|
+
}
|
|
1787
1953
|
/**
|
|
1788
1954
|
* Handle navigation to a related entity from detail panel.
|
|
1789
1955
|
* Navigates within the explorer and applies filter to show related records.
|
|
@@ -2319,37 +2485,43 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
2319
2485
|
i0.ɵɵviewQuery(ViewSelectorComponent, 5);
|
|
2320
2486
|
i0.ɵɵviewQuery(EntityViewerComponent, 5);
|
|
2321
2487
|
i0.ɵɵviewQuery(ViewConfigPanelComponent, 5);
|
|
2488
|
+
i0.ɵɵviewQuery(_c1, 5, ExcelExportComponent);
|
|
2322
2489
|
} if (rf & 2) {
|
|
2323
2490
|
let _t;
|
|
2324
2491
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.filterInputRef = _t.first);
|
|
2325
2492
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewSelectorRef = _t.first);
|
|
2326
2493
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.entityViewerRef = _t.first);
|
|
2327
2494
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewConfigPanelRef = _t.first);
|
|
2495
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.excelExportRef = _t.first);
|
|
2328
2496
|
} }, hostBindings: function DataExplorerDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
2329
2497
|
i0.ɵɵlistener("keydown", function DataExplorerDashboardComponent_keydown_HostBindingHandler($event) { return ctx.handleKeyboardShortcut($event); }, false, i0.ɵɵresolveDocument);
|
|
2330
|
-
} }, inputs: { entityFilter: "entityFilter", deepLink: "deepLink", contextName: "contextName", contextIcon: "contextIcon" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls:
|
|
2331
|
-
i0.ɵɵ
|
|
2332
|
-
i0.ɵɵ
|
|
2333
|
-
i0.ɵɵ
|
|
2334
|
-
i0.ɵɵ
|
|
2335
|
-
i0.ɵɵ
|
|
2498
|
+
} }, inputs: { entityFilter: "entityFilter", deepLink: "deepLink", contextName: "contextName", contextIcon: "contextIcon" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 23, vars: 23, consts: [["excelExport", ""], ["filterInput", ""], [1, "data-explorer-container"], [1, "navigation-panel", 3, "collapsed", "width"], [1, "content-area"], [1, "breadcrumb-bar"], [1, "content-header"], [1, "header-left"], [1, "header-center"], [1, "smart-filter-container"], [1, "header-right"], [1, "content-body"], [1, "entity-home-view"], [3, "entity", "viewEntity", "viewMode", "filterText", "selectedRecordId", "config", "gridState", "timelineConfig"], [1, "detail-panel", 3, "width"], [3, "close", "save", "delete", "openFilterDialogRequest", "entity", "viewEntity", "isOpen", "currentGridState", "externalFilterState", "isSaving"], [3, "close", "apply", "isOpen", "fields", "filter", "disabled"], [3, "data", "fileName"], [3, "field", "title"], [1, "navigation-panel"], [3, "entitySelected", "toggleCollapse", "sectionToggled", "openRecord", "selectRecord", "expandAndFocus", "entities", "selectedEntityName", "favorites", "recentItems", "collapsed", "allowedEntityNames", "favoritesSectionExpanded", "recentSectionExpanded", "entitiesSectionExpanded", "viewsSectionExpanded"], [1, "breadcrumb-item", 3, "click", "title"], [1, "breadcrumb-icon", 3, "class"], [1, "breadcrumb-label"], [1, "fa-solid", "fa-chevron-right", "breadcrumb-separator"], [1, "breadcrumb-icon"], [1, "entity-icon"], [1, "entity-title"], [1, "record-count"], [3, "viewSelected", "saveViewRequested", "manageViewsRequested", "openInTabRequested", "configureViewRequested", "createNewRecordRequested", "exportRequested", "entity", "selectedViewId", "viewModified"], [1, "entity-icon", 3, "class"], [1, "fa-solid", "fa-search", "filter-icon"], ["type", "text", "placeholder", "Filter records... (press / to focus)", 1, "smart-filter-input", 3, "ngModelChange", "ngModel"], [1, "clear-filter-btn"], [1, "clear-filter-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["type", "text", "placeholder", "Filter entities... (press / to focus)", 1, "smart-filter-input", 3, "ngModelChange", "ngModel"], [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"], [1, "date-field-selector-container"], [1, "date-field-backdrop"], [1, "date-field-selector-wrapper"], [1, "date-field-selector-button", 3, "click", "disabled"], [1, "fa-solid", "fa-calendar-days", "date-field-icon"], [1, "date-field-name"], [1, "fa-solid", "fa-chevron-down", "date-field-arrow", 3, "rotated"], [1, "date-field-dropdown-panel"], [1, "timeline-orientation-toggle"], [1, "toggle-btn", 3, "click", "title"], [1, "timeline-sort-toggle"], [1, "date-field-backdrop", 3, "click"], [1, "fa-solid", "fa-chevron-down", "date-field-arrow"], [1, "date-field-dropdown-item", 3, "selected"], [1, "date-field-dropdown-item", 3, "click"], [1, "fa-regular", "fa-calendar", "item-icon"], [1, "item-name"], [1, "fa-solid", "fa-check", "selected-check"], [1, "loading-state"], [1, "home-section"], ["text", "Loading entities...", "size", "medium"], [1, "home-two-column-layout", 3, "single-column"], [1, "section-header-with-toggle"], [1, "section-header-left"], [1, "fa-solid", "fa-database", "section-icon"], [1, "section-title"], [1, "section-count"], [1, "inline-toggle"], [1, "entity-card-grid"], [1, "entity-card", 3, "title"], [1, "empty-state", "small"], [1, "empty-state"], [1, "home-two-column-layout"], [1, "home-column"], [1, "section-header"], [1, "fa-solid", "fa-history", "section-icon"], [1, "entity-filter-strip"], [1, "recent-records-list"], [1, "recent-record-item", 3, "title"], ["title", "Show all entities", 1, "entity-filter-btn", 3, "click"], [1, "fa-solid", "fa-layer-group"], [1, "entity-filter-btn", 3, "active", "title"], [1, "entity-filter-btn", 3, "click", "title"], [1, "recent-record-item", 3, "click", "title"], [1, "recent-record-icon"], [1, "recent-record-content"], [1, "recent-record-name"], [1, "recent-record-entity"], [1, "recent-record-time"], [1, "fa-solid", "fa-star", "section-icon"], [1, "fa-solid", "fa-clock", "section-icon"], [1, "entity-list"], [1, "entity-list-item", 3, "title"], [1, "entity-list-item", 3, "click", "title"], [1, "entity-list-icon"], [1, "entity-list-content"], [1, "entity-list-name"], [1, "favorite-btn", 3, "click", "title"], ["title", "Remove from favorites", 1, "favorite-btn", "favorited", 3, "click"], [1, "fa-solid", "fa-star"], [1, "entity-card", 3, "click", "title"], [1, "entity-card-icon"], [1, "entity-card-content"], [1, "entity-card-title"], [1, "entity-card-description"], [1, "fa-solid", "fa-search", "empty-icon"], [1, "fa-solid", "fa-database", "empty-icon"], [3, "viewModeChange", "filterTextChange", "recordSelected", "recordOpened", "dataLoaded", "filteredCountChanged", "gridStateChanged", "entity", "viewEntity", "viewMode", "filterText", "selectedRecordId", "config", "gridState", "timelineConfig"], [1, "detail-panel"], [3, "close", "openRecord", "navigateToRelated", "openRelatedRecord", "openForeignKeyRecord", "entity", "record"]], template: function DataExplorerDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2499
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
2500
|
+
i0.ɵɵelementStart(0, "div", 2);
|
|
2501
|
+
i0.ɵɵtemplate(1, DataExplorerDashboardComponent_Conditional_1_Template, 2, 15, "div", 3);
|
|
2502
|
+
i0.ɵɵelementStart(2, "div", 4);
|
|
2503
|
+
i0.ɵɵtemplate(3, DataExplorerDashboardComponent_Conditional_3_Template, 3, 0, "div", 5);
|
|
2504
|
+
i0.ɵɵelementStart(4, "div", 6)(5, "div", 7);
|
|
2336
2505
|
i0.ɵɵtemplate(6, DataExplorerDashboardComponent_Conditional_6_Template, 6, 7)(7, DataExplorerDashboardComponent_Conditional_7_Template, 5, 3);
|
|
2337
2506
|
i0.ɵɵelementEnd();
|
|
2338
|
-
i0.ɵɵelementStart(8, "div",
|
|
2339
|
-
i0.ɵɵtemplate(9, DataExplorerDashboardComponent_Conditional_9_Template, 5, 2, "div",
|
|
2507
|
+
i0.ɵɵelementStart(8, "div", 8);
|
|
2508
|
+
i0.ɵɵtemplate(9, DataExplorerDashboardComponent_Conditional_9_Template, 5, 2, "div", 9)(10, DataExplorerDashboardComponent_Conditional_10_Template, 5, 2, "div", 9);
|
|
2340
2509
|
i0.ɵɵelementEnd();
|
|
2341
|
-
i0.ɵɵelementStart(11, "div",
|
|
2510
|
+
i0.ɵɵelementStart(11, "div", 10);
|
|
2342
2511
|
i0.ɵɵtemplate(12, DataExplorerDashboardComponent_Conditional_12_Template, 7, 6);
|
|
2343
2512
|
i0.ɵɵelementEnd()();
|
|
2344
|
-
i0.ɵɵelementStart(13, "div",
|
|
2345
|
-
i0.ɵɵtemplate(14, DataExplorerDashboardComponent_Conditional_14_Template, 3, 1, "div",
|
|
2513
|
+
i0.ɵɵelementStart(13, "div", 11);
|
|
2514
|
+
i0.ɵɵtemplate(14, DataExplorerDashboardComponent_Conditional_14_Template, 3, 1, "div", 12)(15, DataExplorerDashboardComponent_Conditional_15_Template, 1, 8, "mj-entity-viewer", 13);
|
|
2346
2515
|
i0.ɵɵelementEnd()();
|
|
2347
|
-
i0.ɵɵtemplate(16, DataExplorerDashboardComponent_Conditional_16_Template, 2, 4, "div",
|
|
2348
|
-
i0.ɵɵelementStart(17, "mj-view-config-panel",
|
|
2349
|
-
i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Template_mj_view_config_panel_close_17_listener() { return ctx.onCloseViewConfigPanel(); })("save", function DataExplorerDashboardComponent_Template_mj_view_config_panel_save_17_listener($event) { return ctx.onSaveView($event); })("delete", function DataExplorerDashboardComponent_Template_mj_view_config_panel_delete_17_listener() { return ctx.onDeleteView(); })("openFilterDialogRequest", function DataExplorerDashboardComponent_Template_mj_view_config_panel_openFilterDialogRequest_17_listener($event) { return ctx.onOpenFilterDialogRequest($event); });
|
|
2516
|
+
i0.ɵɵtemplate(16, DataExplorerDashboardComponent_Conditional_16_Template, 2, 4, "div", 14);
|
|
2517
|
+
i0.ɵɵelementStart(17, "mj-view-config-panel", 15);
|
|
2518
|
+
i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Template_mj_view_config_panel_close_17_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCloseViewConfigPanel()); })("save", function DataExplorerDashboardComponent_Template_mj_view_config_panel_save_17_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSaveView($event)); })("delete", function DataExplorerDashboardComponent_Template_mj_view_config_panel_delete_17_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDeleteView()); })("openFilterDialogRequest", function DataExplorerDashboardComponent_Template_mj_view_config_panel_openFilterDialogRequest_17_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onOpenFilterDialogRequest($event)); });
|
|
2519
|
+
i0.ɵɵelementEnd();
|
|
2520
|
+
i0.ɵɵelementStart(18, "mj-filter-dialog", 16);
|
|
2521
|
+
i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Template_mj_filter_dialog_close_18_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onCloseFilterDialog()); })("apply", function DataExplorerDashboardComponent_Template_mj_filter_dialog_apply_18_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onFilterApplied($event)); });
|
|
2350
2522
|
i0.ɵɵelementEnd();
|
|
2351
|
-
i0.ɵɵelementStart(
|
|
2352
|
-
i0.ɵɵ
|
|
2523
|
+
i0.ɵɵelementStart(19, "kendo-excelexport", 17, 0);
|
|
2524
|
+
i0.ɵɵrepeaterCreate(21, DataExplorerDashboardComponent_For_22_Template, 1, 2, "kendo-excelexport-column", 18, _forTrack0);
|
|
2353
2525
|
i0.ɵɵelementEnd()();
|
|
2354
2526
|
} if (rf & 2) {
|
|
2355
2527
|
i0.ɵɵadvance();
|
|
@@ -2371,10 +2543,14 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
2371
2543
|
i0.ɵɵadvance(2);
|
|
2372
2544
|
i0.ɵɵconditional(ctx.state.detailPanelOpen && ctx.selectedRecord ? 16 : -1);
|
|
2373
2545
|
i0.ɵɵadvance();
|
|
2374
|
-
i0.ɵɵproperty("entity", ctx.selectedEntity)("viewEntity", ctx.selectedViewEntity)("isOpen", ctx.state.viewConfigPanelOpen)("currentGridState", ctx.currentGridState)("externalFilterState", ctx.filterDialogState);
|
|
2546
|
+
i0.ɵɵproperty("entity", ctx.selectedEntity)("viewEntity", ctx.selectedViewEntity)("isOpen", ctx.state.viewConfigPanelOpen)("currentGridState", ctx.currentGridState)("externalFilterState", ctx.filterDialogState)("isSaving", ctx.isSavingView);
|
|
2375
2547
|
i0.ɵɵadvance();
|
|
2376
2548
|
i0.ɵɵproperty("isOpen", ctx.isFilterDialogOpen)("fields", ctx.filterDialogFields)("filter", ctx.filterDialogState)("disabled", ctx.filterDialogDisabled);
|
|
2377
|
-
} }, dependencies: [i5.DefaultValueAccessor, i5.NgControlStatus, i5.NgModel, i6.EntityViewerComponent, i6.EntityRecordDetailPanelComponent, i3.LoadingComponent, i7.NavigationPanelComponent, i8.ViewSelectorComponent, i9.ViewConfigPanelComponent, i10.FilterDialogComponent, i11.DecimalPipe], styles: [".data-explorer-container[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n width: 100%;\n background: #f5f7fa;\n overflow: hidden;\n}\n\n.navigation-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n transition: width 0.2s ease-in-out;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n}\n.navigation-panel.collapsed[_ngcontent-%COMP%] {\n width: 48px;\n}\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: #f5f7fa;\n}\n\n\n\n.breadcrumb-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: white;\n border-bottom: 1px solid #eee;\n flex-shrink: 0;\n font-size: 13px;\n min-height: 40px;\n}\n\n.breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #666;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s ease;\n max-width: 200px;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n color: #1976d2;\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n color: #1a1a1a;\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n.breadcrumb-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #ccc;\n flex-shrink: 0;\n}\n\n.content-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n\n\n.header-left[_ngcontent-%COMP%] mj-view-selector {\n margin-left: 8px;\n}\n\n.entity-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #1a1a1a;\n}\n\n.record-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n font-weight: 500;\n}\n\n.header-center[_ngcontent-%COMP%] {\n flex: 1;\n max-width: 600px;\n}\n\n.smart-filter-container[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n}\n\n.smart-filter-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 40px 10px 16px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n font-size: 14px;\n background: #fafafa;\n transition: all 0.15s ease;\n}\n.smart-filter-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n background: white;\n box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.1);\n}\n.smart-filter-input[_ngcontent-%COMP%]::placeholder {\n color: #999;\n}\n\n.clear-filter-btn[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n transition: all 0.15s ease;\n}\n.clear-filter-btn[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #424242;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\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: #666;\n transition: all 0.15s ease;\n}\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n}\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.date-field-selector-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.date-field-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.date-field-selector-wrapper[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.date-field-selector-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n min-width: 120px;\n max-width: 200px;\n}\n\n.date-field-selector-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n}\n\n.date-field-selector-button[_ngcontent-%COMP%]:disabled {\n cursor: default;\n opacity: 0.8;\n}\n\n.date-field-selector-button.open[_ngcontent-%COMP%] {\n background: var(--background-active, #e0e0e0);\n border-color: var(--primary-color, #007bff);\n}\n\n.date-field-icon[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 12px;\n}\n\n.date-field-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.date-field-arrow[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.date-field-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.date-field-dropdown-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 180px;\n max-width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--background-panel, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n cursor: pointer;\n transition: background 0.1s ease;\n font-size: 13px;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%]:hover {\n background: var(--background-hover, #f5f5f5);\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%] {\n background: var(--primary-light, #e6f0ff);\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%]:hover {\n background: var(--primary-light-hover, #d6e4f9);\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .selected-check[_ngcontent-%COMP%] {\n color: var(--primary-color, #007bff);\n font-size: 12px;\n}\n\n\n\n.timeline-orientation-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 8px;\n padding: 3px;\n}\n\n.content-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n display: flex;\n flex-direction: column;\n}\n\n.loading-container[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n background: white;\n border-radius: 8px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: 32px;\n color: #1976d2;\n}\n\n.loading-message[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: #666;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #757575;\n background: white;\n border-radius: 8px;\n padding: 40px;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: #e0e0e0;\n margin-bottom: 24px;\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n color: #666;\n}\n\n\n\n.entity-home-view[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 4px;\n}\n\n.entity-card-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n padding: 0;\n}\n\n.entity-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 20px;\n background: white;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 1px solid #e8e8e8;\n}\n\n.entity-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);\n border-color: #1976d2;\n}\n\n.entity-card[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n}\n\n.entity-card-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n background: linear-gradient(135deg, #e3f2fd, #bbdefb);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.entity-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-card[_ngcontent-%COMP%]:hover .entity-card-icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #1976d2, #1565c0);\n}\n\n.entity-card[_ngcontent-%COMP%]:hover .entity-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n}\n\n.entity-card-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.entity-card-title[_ngcontent-%COMP%] {\n margin: 0 0 6px 0;\n font-size: 15px;\n font-weight: 600;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.entity-card-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.detail-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: white;\n border-left: 1px solid #e0e0e0;\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n[_nghost-%COMP%] mj-explorer-grid-view, \n[_nghost-%COMP%] mj-explorer-cards-view {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n\n\n\n\n\n\n\n.content-header.home-header[_ngcontent-%COMP%] {\n border-bottom: none;\n background: transparent;\n box-shadow: none;\n padding: 24px 24px 16px;\n}\n\n.content-body.home-content[_ngcontent-%COMP%] {\n padding-top: 0;\n}\n\n\n\n.filter-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: #999;\n font-size: 14px;\n pointer-events: none;\n}\n\n.smart-filter-container[_ngcontent-%COMP%] .smart-filter-input[_ngcontent-%COMP%] {\n padding-left: 40px;\n}\n\n\n\n\n\n\n.home-section[_ngcontent-%COMP%] {\n margin-bottom: 28px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 14px;\n padding-left: 4px;\n}\n\n.section-icon[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #1976d2;\n width: 20px;\n text-align: center;\n}\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #888;\n font-weight: 500;\n margin-left: 8px;\n}\n\n\n\n\n\n\n.home-two-column-layout[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n margin-bottom: 28px;\n}\n\n\n\n.home-two-column-layout.single-column[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n}\n\n.home-column[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n\n\n.section-header-with-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 14px;\n padding-left: 4px;\n}\n\n.section-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n\n\n.inline-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 2px;\n}\n\n.inline-toggle[_ngcontent-%COMP%] .toggle-btn[_ngcontent-%COMP%] {\n width: auto;\n height: 26px;\n padding: 0 10px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.15s ease;\n}\n\n.inline-toggle[_ngcontent-%COMP%] .toggle-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n}\n\n.inline-toggle[_ngcontent-%COMP%] .toggle-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n\n\n\n.entity-card-row[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n padding: 0;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n width: auto;\n min-width: 180px;\n max-width: 280px;\n padding: 12px 16px;\n gap: 12px;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] .entity-card-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] .entity-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] .entity-card-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] .entity-card-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n\n\n\n\n\n.favorite-btn[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ccc;\n transition: all 0.15s ease;\n margin-left: auto;\n}\n\n.favorite-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 193, 7, 0.1);\n color: #ffc107;\n transform: scale(1.1);\n}\n\n.favorite-btn.favorited[_ngcontent-%COMP%] {\n color: #ffc107;\n}\n\n.favorite-btn.favorited[_ngcontent-%COMP%]:hover {\n background: rgba(255, 193, 7, 0.15);\n color: #ffb300;\n}\n\n.entity-card[_ngcontent-%COMP%] .favorite-btn[_ngcontent-%COMP%] {\n opacity: 0;\n transition: opacity 0.15s ease, background 0.15s ease, color 0.15s ease, transform 0.15s ease;\n}\n\n.entity-card[_ngcontent-%COMP%]:hover .favorite-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.entity-card[_ngcontent-%COMP%] .favorite-btn.favorited[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n\n\n\n\n\n.recent-records-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n background: white;\n border-radius: 10px;\n padding: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.recent-record-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.recent-record-item[_ngcontent-%COMP%]:hover {\n background: #f5f7fa;\n}\n\n.recent-record-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: linear-gradient(135deg, #e8f5e9, #c8e6c9);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.recent-record-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #4caf50;\n}\n\n.recent-record-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recent-record-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.recent-record-entity[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #888;\n}\n\n.recent-record-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #aaa;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.entity-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n background: white;\n border-radius: 10px;\n padding: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.entity-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.entity-list-item[_ngcontent-%COMP%]:hover {\n background: #f5f7fa;\n}\n\n.entity-list-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: linear-gradient(135deg, #e3f2fd, #bbdefb);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.entity-list-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #1976d2;\n}\n\n.entity-list-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-list-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.entity-list-item[_ngcontent-%COMP%] .favorite-btn[_ngcontent-%COMP%] {\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.entity-list-item[_ngcontent-%COMP%]:hover .favorite-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.entity-list-item[_ngcontent-%COMP%] .favorite-btn.favorited[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n\n\n\n\n\n.entity-filter-strip[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: auto;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 3px;\n}\n\n.entity-filter-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.entity-filter-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.05);\n}\n\n.entity-filter-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] .toggle-btn[_ngcontent-%COMP%] {\n width: auto;\n padding: 0 12px;\n gap: 6px;\n}\n\n.toggle-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n\n\n\n.empty-state.small[_ngcontent-%COMP%] {\n height: auto;\n padding: 32px;\n background: #fafafa;\n}\n\n.empty-state.small[_ngcontent-%COMP%] .empty-icon[_ngcontent-%COMP%] {\n font-size: 40px;\n margin-bottom: 16px;\n}\n\n.empty-state.small[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.empty-state.small[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\n\n@media (max-width: 1200px) {\n .entity-card-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n }\n}\n\n@media (max-width: 900px) {\n .content-header[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .header-center[_ngcontent-%COMP%] {\n order: 3;\n flex-basis: 100%;\n max-width: 100%;\n }\n\n .entity-card.compact[_ngcontent-%COMP%] {\n min-width: 160px;\n }\n\n \n\n .home-two-column-layout[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 20px;\n }\n}\n\n@media (max-width: 600px) {\n .data-explorer-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .navigation-panel[_ngcontent-%COMP%] {\n display: none;\n }\n\n .content-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .content-body[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .entity-card-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 12px;\n }\n\n .entity-card[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .entity-card.compact[_ngcontent-%COMP%] {\n min-width: 100%;\n max-width: 100%;\n }\n\n .entity-card-row[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .view-mode-toggle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .section-title[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n\n .home-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n }\n}"], data: { animation: [
|
|
2549
|
+
i0.ɵɵadvance();
|
|
2550
|
+
i0.ɵɵproperty("data", ctx.exportData)("fileName", ctx.exportFileName);
|
|
2551
|
+
i0.ɵɵadvance(2);
|
|
2552
|
+
i0.ɵɵrepeater(ctx.exportColumns);
|
|
2553
|
+
} }, dependencies: [i5.DefaultValueAccessor, i5.NgControlStatus, i5.NgModel, i6.ExcelExportComponent, i6.ColumnComponent, i7.EntityViewerComponent, i7.EntityRecordDetailPanelComponent, i3.LoadingComponent, i8.NavigationPanelComponent, i9.ViewSelectorComponent, i10.ViewConfigPanelComponent, i11.FilterDialogComponent, i12.DecimalPipe], styles: [".data-explorer-container[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n width: 100%;\n background: #f5f7fa;\n overflow: hidden;\n}\n\n.navigation-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n transition: width 0.2s ease-in-out;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n}\n.navigation-panel.collapsed[_ngcontent-%COMP%] {\n width: 48px;\n}\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: #f5f7fa;\n}\n\n\n\n.breadcrumb-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: white;\n border-bottom: 1px solid #eee;\n flex-shrink: 0;\n font-size: 13px;\n min-height: 40px;\n}\n\n.breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #666;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s ease;\n max-width: 200px;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n color: #1976d2;\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n color: #1a1a1a;\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n.breadcrumb-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #ccc;\n flex-shrink: 0;\n}\n\n.content-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n\n\n.header-left[_ngcontent-%COMP%] mj-view-selector {\n margin-left: 8px;\n}\n\n.entity-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #1a1a1a;\n}\n\n.record-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n font-weight: 500;\n}\n\n.header-center[_ngcontent-%COMP%] {\n flex: 1;\n max-width: 600px;\n}\n\n.smart-filter-container[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n}\n\n.smart-filter-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 40px 10px 16px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n font-size: 14px;\n background: #fafafa;\n transition: all 0.15s ease;\n}\n.smart-filter-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n background: white;\n box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.1);\n}\n.smart-filter-input[_ngcontent-%COMP%]::placeholder {\n color: #999;\n}\n\n.clear-filter-btn[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n transition: all 0.15s ease;\n}\n.clear-filter-btn[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #424242;\n}\n\n.header-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn[_ngcontent-%COMP%] {\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: #666;\n transition: all 0.15s ease;\n}\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n}\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.date-field-selector-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.date-field-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.date-field-selector-wrapper[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.date-field-selector-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n min-width: 120px;\n max-width: 200px;\n}\n\n.date-field-selector-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n}\n\n.date-field-selector-button[_ngcontent-%COMP%]:disabled {\n cursor: default;\n opacity: 0.8;\n}\n\n.date-field-selector-button.open[_ngcontent-%COMP%] {\n background: var(--background-active, #e0e0e0);\n border-color: var(--primary-color, #007bff);\n}\n\n.date-field-icon[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 12px;\n}\n\n.date-field-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.date-field-arrow[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.date-field-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.date-field-dropdown-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 180px;\n max-width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--background-panel, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n cursor: pointer;\n transition: background 0.1s ease;\n font-size: 13px;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%]:hover {\n background: var(--background-hover, #f5f5f5);\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%] {\n background: var(--primary-light, #e6f0ff);\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%]:hover {\n background: var(--primary-light-hover, #d6e4f9);\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%] {\n color: var(--text-secondary, #666);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-name[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .selected-check[_ngcontent-%COMP%] {\n color: var(--primary-color, #007bff);\n font-size: 12px;\n}\n\n\n\n.timeline-orientation-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 8px;\n padding: 3px;\n}\n\n.content-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n display: flex;\n flex-direction: column;\n}\n\n.loading-container[_ngcontent-%COMP%], \n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n background: white;\n border-radius: 8px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: 32px;\n color: #1976d2;\n}\n\n.loading-message[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: #666;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #757575;\n background: white;\n border-radius: 8px;\n padding: 40px;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: #e0e0e0;\n margin-bottom: 24px;\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n color: #666;\n}\n\n\n\n.entity-home-view[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 4px;\n}\n\n.entity-card-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n padding: 0;\n}\n\n.entity-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 20px;\n background: white;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 1px solid #e8e8e8;\n}\n\n.entity-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);\n border-color: #1976d2;\n}\n\n.entity-card[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n}\n\n.entity-card-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n background: linear-gradient(135deg, #e3f2fd, #bbdefb);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.entity-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-card[_ngcontent-%COMP%]:hover .entity-card-icon[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #1976d2, #1565c0);\n}\n\n.entity-card[_ngcontent-%COMP%]:hover .entity-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: white;\n}\n\n.entity-card-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.entity-card-title[_ngcontent-%COMP%] {\n margin: 0 0 6px 0;\n font-size: 15px;\n font-weight: 600;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.entity-card-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.detail-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: white;\n border-left: 1px solid #e0e0e0;\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n[_nghost-%COMP%] mj-explorer-grid-view, \n[_nghost-%COMP%] mj-explorer-cards-view {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n\n\n\n\n\n\n\n.content-header.home-header[_ngcontent-%COMP%] {\n border-bottom: none;\n background: transparent;\n box-shadow: none;\n padding: 24px 24px 16px;\n}\n\n.content-body.home-content[_ngcontent-%COMP%] {\n padding-top: 0;\n}\n\n\n\n.filter-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: #999;\n font-size: 14px;\n pointer-events: none;\n}\n\n.smart-filter-container[_ngcontent-%COMP%] .smart-filter-input[_ngcontent-%COMP%] {\n padding-left: 40px;\n}\n\n\n\n\n\n\n.home-section[_ngcontent-%COMP%] {\n margin-bottom: 28px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 14px;\n padding-left: 4px;\n}\n\n.section-icon[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #1976d2;\n width: 20px;\n text-align: center;\n}\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #888;\n font-weight: 500;\n margin-left: 8px;\n}\n\n\n\n\n\n\n.home-two-column-layout[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n margin-bottom: 28px;\n}\n\n\n\n.home-two-column-layout.single-column[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n}\n\n.home-column[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n\n\n.section-header-with-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 14px;\n padding-left: 4px;\n}\n\n.section-header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n\n\n.inline-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 2px;\n}\n\n.inline-toggle[_ngcontent-%COMP%] .toggle-btn[_ngcontent-%COMP%] {\n width: auto;\n height: 26px;\n padding: 0 10px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.15s ease;\n}\n\n.inline-toggle[_ngcontent-%COMP%] .toggle-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n}\n\n.inline-toggle[_ngcontent-%COMP%] .toggle-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n\n\n\n.entity-card-row[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n padding: 0;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n width: auto;\n min-width: 180px;\n max-width: 280px;\n padding: 12px 16px;\n gap: 12px;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] .entity-card-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] .entity-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] .entity-card-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n.entity-card.compact[_ngcontent-%COMP%] .entity-card-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n\n\n\n\n\n.favorite-btn[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ccc;\n transition: all 0.15s ease;\n margin-left: auto;\n}\n\n.favorite-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 193, 7, 0.1);\n color: #ffc107;\n transform: scale(1.1);\n}\n\n.favorite-btn.favorited[_ngcontent-%COMP%] {\n color: #ffc107;\n}\n\n.favorite-btn.favorited[_ngcontent-%COMP%]:hover {\n background: rgba(255, 193, 7, 0.15);\n color: #ffb300;\n}\n\n.entity-card[_ngcontent-%COMP%] .favorite-btn[_ngcontent-%COMP%] {\n opacity: 0;\n transition: opacity 0.15s ease, background 0.15s ease, color 0.15s ease, transform 0.15s ease;\n}\n\n.entity-card[_ngcontent-%COMP%]:hover .favorite-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.entity-card[_ngcontent-%COMP%] .favorite-btn.favorited[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n\n\n\n\n\n.recent-records-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n background: white;\n border-radius: 10px;\n padding: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.recent-record-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.recent-record-item[_ngcontent-%COMP%]:hover {\n background: #f5f7fa;\n}\n\n.recent-record-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: linear-gradient(135deg, #e8f5e9, #c8e6c9);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.recent-record-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #4caf50;\n}\n\n.recent-record-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recent-record-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.recent-record-entity[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #888;\n}\n\n.recent-record-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #aaa;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.entity-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n background: white;\n border-radius: 10px;\n padding: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.entity-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.entity-list-item[_ngcontent-%COMP%]:hover {\n background: #f5f7fa;\n}\n\n.entity-list-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: linear-gradient(135deg, #e3f2fd, #bbdefb);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.entity-list-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #1976d2;\n}\n\n.entity-list-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-list-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.entity-list-item[_ngcontent-%COMP%] .favorite-btn[_ngcontent-%COMP%] {\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.entity-list-item[_ngcontent-%COMP%]:hover .favorite-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.entity-list-item[_ngcontent-%COMP%] .favorite-btn.favorited[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n\n\n\n\n\n.entity-filter-strip[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: auto;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 3px;\n}\n\n.entity-filter-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.entity-filter-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.05);\n}\n\n.entity-filter-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] .toggle-btn[_ngcontent-%COMP%] {\n width: auto;\n padding: 0 12px;\n gap: 6px;\n}\n\n.toggle-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n\n\n\n.empty-state.small[_ngcontent-%COMP%] {\n height: auto;\n padding: 32px;\n background: #fafafa;\n}\n\n.empty-state.small[_ngcontent-%COMP%] .empty-icon[_ngcontent-%COMP%] {\n font-size: 40px;\n margin-bottom: 16px;\n}\n\n.empty-state.small[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 16px;\n}\n\n.empty-state.small[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n\n\n\n@media (max-width: 1200px) {\n .entity-card-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n }\n}\n\n@media (max-width: 900px) {\n .content-header[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .header-center[_ngcontent-%COMP%] {\n order: 3;\n flex-basis: 100%;\n max-width: 100%;\n }\n\n .entity-card.compact[_ngcontent-%COMP%] {\n min-width: 160px;\n }\n\n \n\n .home-two-column-layout[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 20px;\n }\n}\n\n@media (max-width: 600px) {\n .data-explorer-container[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .navigation-panel[_ngcontent-%COMP%] {\n display: none;\n }\n\n .content-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .content-body[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .entity-card-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 12px;\n }\n\n .entity-card[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .entity-card.compact[_ngcontent-%COMP%] {\n min-width: 100%;\n max-width: 100%;\n }\n\n .entity-card-row[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .view-mode-toggle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .section-title[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n\n .home-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n }\n}"], data: { animation: [
|
|
2378
2554
|
trigger('slideInLeft', [
|
|
2379
2555
|
transition(':enter', [
|
|
2380
2556
|
style({ transform: 'translateX(-100%)', opacity: 0 }),
|
|
@@ -2402,7 +2578,7 @@ export { DataExplorerDashboardComponent };
|
|
|
2402
2578
|
animate('200ms ease-in', style({ transform: 'translateX(-100%)', opacity: 0 }))
|
|
2403
2579
|
])
|
|
2404
2580
|
])
|
|
2405
|
-
], template: "<div class=\"data-explorer-container\">\n <!-- Navigation Panel (Left) - Hidden at home level, animated -->\n @if (!isAtHomeLevel) {\n <div\n class=\"navigation-panel\"\n [class.collapsed]=\"state.navigationPanelCollapsed\"\n [style.width.px]=\"state.navigationPanelCollapsed ? 48 : state.navigationPanelWidth\"\n [@slideInLeft]>\n\n <mj-explorer-navigation-panel\n [entities]=\"entities\"\n [selectedEntityName]=\"state.selectedEntityName\"\n [favorites]=\"state.favorites\"\n [recentItems]=\"state.recentItems\"\n [collapsed]=\"state.navigationPanelCollapsed\"\n [allowedEntityNames]=\"allowedEntityNames\"\n [favoritesSectionExpanded]=\"state.favoritesSectionExpanded\"\n [recentSectionExpanded]=\"state.recentSectionExpanded\"\n [entitiesSectionExpanded]=\"state.entitiesSectionExpanded\"\n [viewsSectionExpanded]=\"state.viewsSectionExpanded\"\n (entitySelected)=\"onEntitySelected($event)\"\n (toggleCollapse)=\"toggleNavigationPanel()\"\n (sectionToggled)=\"stateService.toggleSection($event)\"\n (openRecord)=\"onOpenRecordFromNav($event)\"\n (selectRecord)=\"onSelectRecordFromNav($event)\"\n (expandAndFocus)=\"onExpandAndFocus($event)\">\n </mj-explorer-navigation-panel>\n </div>\n }\n\n <!-- Main Content Area -->\n <div class=\"content-area\">\n <!-- Breadcrumb Bar - Hidden at home level -->\n @if (!isAtHomeLevel && breadcrumbs.length > 0) {\n <div class=\"breadcrumb-bar\">\n @for (crumb of breadcrumbs; track crumb.label; let i = $index; let last = $last) {\n <span\n class=\"breadcrumb-item\"\n [class.clickable]=\"!last\"\n [class.current]=\"last\"\n (click)=\"onBreadcrumbClick(crumb, i)\"\n [title]=\"crumb.label\">\n @if (crumb.icon) {\n <i [class]=\"crumb.icon\" class=\"breadcrumb-icon\"></i>\n }\n <span class=\"breadcrumb-label\">{{ crumb.label }}</span>\n </span>\n @if (!last) {\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n }\n }\n </div>\n }\n\n <!-- Header -->\n <div class=\"content-header\" [class.home-header]=\"isAtHomeLevel\">\n <div class=\"header-left\">\n @if (selectedEntity) {\n <i [class]=\"getEntityIcon(selectedEntity)\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ selectedEntity.Name }}</h2>\n @if (debouncedFilterText && filteredRecordCount !== totalRecordCount) {\n <span class=\"record-count\">{{ filteredRecordCount | number }} of {{ totalRecordCount | number }} records</span>\n } @else {\n <span class=\"record-count\">{{ totalRecordCount | number }} records</span>\n }\n\n <!-- View Selector -->\n <mj-view-selector\n [entity]=\"selectedEntity\"\n [selectedViewId]=\"state.selectedViewId\"\n [viewModified]=\"state.viewModified\"\n (viewSelected)=\"onViewSelected($event)\"\n (saveViewRequested)=\"onSaveViewRequested($event)\"\n (manageViewsRequested)=\"onManageViewsRequested()\"\n (openInTabRequested)=\"onOpenInTabRequested($event)\"\n (configureViewRequested)=\"onConfigureViewRequested()\">\n </mj-view-selector>\n } @else {\n @if (displayIcon) {\n <i [class]=\"displayIcon\" class=\"entity-icon\"></i>\n }\n <h2 class=\"entity-title\">{{ displayTitle }}</h2>\n <span class=\"record-count\">{{ entities.length }} entities available</span>\n }\n </div>\n\n <div class=\"header-center\">\n @if (selectedEntity) {\n <div class=\"smart-filter-container\">\n <i class=\"fa-solid fa-search filter-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"smart-filter-input\"\n placeholder=\"Filter records... (press / to focus)\"\n [ngModel]=\"state.smartFilterPrompt\"\n (ngModelChange)=\"onSmartFilterChanged($event)\"\n />\n @if (state.smartFilterPrompt) {\n <button class=\"clear-filter-btn\" (click)=\"onSmartFilterChanged('')\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n } @else {\n <!-- Entity filter for home screen -->\n <div class=\"smart-filter-container\">\n <i class=\"fa-solid fa-search filter-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"smart-filter-input\"\n placeholder=\"Filter entities... (press / to focus)\"\n [(ngModel)]=\"entityFilterText\"\n />\n @if (entityFilterText) {\n <button class=\"clear-filter-btn\" (click)=\"entityFilterText = ''\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"header-right\">\n @if (selectedEntity) {\n <!-- View Mode Toggle -->\n <div class=\"view-mode-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.viewMode === 'grid'\"\n (click)=\"onViewModeChanged('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.viewMode === 'cards'\"\n (click)=\"onViewModeChanged('cards')\"\n title=\"Cards View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n @if (entityHasDateFields) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.viewMode === 'timeline'\"\n (click)=\"onViewModeChanged('timeline')\"\n title=\"Timeline View\">\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n }\n </div>\n\n <!-- Timeline Controls (only shown when timeline view is active) -->\n @if (state.viewMode === 'timeline' && entityHasDateFields) {\n <!-- Date Field Selector -->\n <div class=\"date-field-selector-container\">\n <!-- Backdrop for closing dropdown -->\n @if (isDateFieldDropdownOpen) {\n <div class=\"date-field-backdrop\" (click)=\"closeDateFieldDropdown()\"></div>\n }\n\n <div class=\"date-field-selector-wrapper\">\n <button\n class=\"date-field-selector-button\"\n [class.open]=\"isDateFieldDropdownOpen\"\n [disabled]=\"availableDateFields.length <= 1\"\n (click)=\"toggleDateFieldDropdown()\">\n <i class=\"fa-solid fa-calendar-days date-field-icon\"></i>\n <span class=\"date-field-name\">{{ effectiveTimelineDateFieldDisplayName }}</span>\n @if (availableDateFields.length > 1) {\n <i class=\"fa-solid fa-chevron-down date-field-arrow\" [class.rotated]=\"isDateFieldDropdownOpen\"></i>\n }\n </button>\n\n @if (isDateFieldDropdownOpen && availableDateFields.length > 1) {\n <div class=\"date-field-dropdown-panel\">\n @for (field of availableDateFields; track field.name) {\n <div\n class=\"date-field-dropdown-item\"\n [class.selected]=\"field.name === effectiveTimelineDateField\"\n (click)=\"setTimelineDateField(field.name)\">\n <i class=\"fa-regular fa-calendar item-icon\"></i>\n <span class=\"item-name\">{{ field.displayName }}</span>\n @if (field.name === effectiveTimelineDateField) {\n <i class=\"fa-solid fa-check selected-check\"></i>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Orientation Toggle -->\n <div class=\"timeline-orientation-toggle\">\n <button\n class=\"toggle-btn\"\n (click)=\"toggleTimelineOrientation()\"\n [title]=\"state.timelineOrientation === 'vertical' ? 'Switch to Horizontal' : 'Switch to Vertical'\">\n <i [class]=\"state.timelineOrientation === 'vertical' ? 'fa-solid fa-ellipsis-vertical' : 'fa-solid fa-ellipsis'\"></i>\n </button>\n </div>\n\n <!-- Sort Order Toggle -->\n <div class=\"timeline-sort-toggle\">\n <button\n class=\"toggle-btn\"\n (click)=\"toggleTimelineSortOrder()\"\n [title]=\"state.timelineSortOrder === 'desc' ? 'Showing Newest First (click for Oldest First)' : 'Showing Oldest First (click for Newest First)'\">\n <i [class]=\"state.timelineSortOrder === 'desc' ? 'fa-solid fa-arrow-down-wide-short' : 'fa-solid fa-arrow-up-wide-short'\"></i>\n </button>\n </div>\n }\n }\n <!-- Common/All toggle moved to inline with All Entities section header -->\n </div>\n </div>\n\n <!-- Content Body - Using mj-entity-viewer composite -->\n <div class=\"content-body\" [class.home-content]=\"isAtHomeLevel\">\n @if (!selectedEntity) {\n <!-- Entity Home View - Two-Column Layout -->\n <div class=\"entity-home-view\">\n @if (isLoadingEntities) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading entities...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <!-- Two-Column Layout: Records (left) | Entities (right) -->\n @if (hasTopSectionContent) {\n <div class=\"home-two-column-layout\" [class.single-column]=\"!hasRecordsColumnContent || !hasEntitiesColumnContent\">\n <!-- Left Column: Recent & Favorite Records (most actionable) -->\n @if (hasRecordsColumnContent) {\n <div class=\"home-column\">\n <!-- Recent Records Section -->\n @if (recentRecords.length > 0) {\n <div class=\"home-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-history section-icon\"></i>\n <h3 class=\"section-title\">Recent Records</h3>\n <!-- Entity filter strip - only show with 2+ entities -->\n @if (showRecentRecordsEntityFilter) {\n <div class=\"entity-filter-strip\">\n <button\n class=\"entity-filter-btn\"\n [class.active]=\"recentRecordsEntityFilter === null\"\n (click)=\"setRecentRecordsEntityFilter(null)\"\n title=\"Show all entities\">\n <i class=\"fa-solid fa-layer-group\"></i>\n </button>\n @for (entity of uniqueRecentRecordEntities; track entity.entityId) {\n <button\n class=\"entity-filter-btn\"\n [class.active]=\"recentRecordsEntityFilter === entity.entityId\"\n (click)=\"setRecentRecordsEntityFilter(entity.entityId)\"\n [title]=\"entity.entityName\">\n <i [class]=\"entity.icon\"></i>\n </button>\n }\n </div>\n }\n </div>\n <div class=\"recent-records-list\">\n @for (record of filteredRecentRecords; track record.entityId + '|' + record.recordId) {\n <div\n class=\"recent-record-item\"\n (click)=\"onRecentRecordClick(record)\"\n [title]=\"record.entityName + ' - ' + record.recordId\">\n <div class=\"recent-record-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"recent-record-content\">\n <span class=\"recent-record-name\">{{ record.recordName || record.recordId }}</span>\n <span class=\"recent-record-entity\">{{ record.entityName }}</span>\n </div>\n <span class=\"recent-record-time\">{{ formatRelativeTime(record.latestAt) }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Favorite Records Section -->\n @if (favoriteRecords.length > 0) {\n <div class=\"home-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-star section-icon\"></i>\n <h3 class=\"section-title\">Favorite Records</h3>\n </div>\n <div class=\"recent-records-list\">\n @for (record of favoriteRecords; track record.userFavoriteId) {\n <div\n class=\"recent-record-item\"\n (click)=\"onFavoriteRecordClick(record)\"\n [title]=\"record.entityName + ' - ' + record.recordId\">\n <div class=\"recent-record-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"recent-record-content\">\n <span class=\"recent-record-name\">{{ record.recordName || record.recordId }}</span>\n <span class=\"recent-record-entity\">{{ record.entityName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Right Column: Recent & Favorite Entities -->\n @if (hasEntitiesColumnContent) {\n <div class=\"home-column\">\n <!-- Recent Entities Section (list format) -->\n @if (recentEntities.length > 0) {\n <div class=\"home-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-clock section-icon\"></i>\n <h3 class=\"section-title\">Recent Entities</h3>\n </div>\n <div class=\"entity-list\">\n @for (entity of recentEntities; track entity.ID) {\n <div\n class=\"entity-list-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.Name\">\n <div class=\"entity-list-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-list-content\">\n <span class=\"entity-list-name\">{{ entity.Name }}</span>\n </div>\n <button\n class=\"favorite-btn\"\n [class.favorited]=\"isEntityFavorited(entity)\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n [title]=\"isEntityFavorited(entity) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isEntityFavorited(entity) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Favorite Entities Section (list format) -->\n @if (favoriteEntities.length > 0) {\n <div class=\"home-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-star section-icon\"></i>\n <h3 class=\"section-title\">Favorite Entities</h3>\n </div>\n <div class=\"entity-list\">\n @for (entity of favoriteEntities; track entity.ID) {\n <div\n class=\"entity-list-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.Name\">\n <div class=\"entity-list-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-list-content\">\n <span class=\"entity-list-name\">{{ entity.Name }}</span>\n </div>\n <button\n class=\"favorite-btn favorited\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n title=\"Remove from favorites\">\n <i class=\"fa-solid fa-star\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- All/Common Entities Section - Full Width -->\n <div class=\"home-section\">\n <div class=\"section-header-with-toggle\">\n <div class=\"section-header-left\">\n <i class=\"fa-solid fa-database section-icon\"></i>\n <h3 class=\"section-title\">\n @if (state.showAllEntities || !showCommonAllToggle) {\n All Entities\n } @else {\n Common Entities\n }\n </h3>\n @if (entityFilterText && filteredEntities.length !== entities.length) {\n <span class=\"section-count\">{{ filteredEntities.length }} matching</span>\n }\n </div>\n @if (showCommonAllToggle) {\n <div class=\"inline-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"!state.showAllEntities\"\n (click)=\"toggleShowAllEntities()\"\n title=\"Show common entities ({{ commonEntitiesCount }})\">\n Common\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.showAllEntities\"\n (click)=\"toggleShowAllEntities()\"\n title=\"Show all entities ({{ allEntitiesCount }})\">\n All\n </button>\n </div>\n }\n </div>\n <div class=\"entity-card-grid\">\n @for (entity of filteredEntities; track entity.ID) {\n <div\n class=\"entity-card\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.Name\">\n <div class=\"entity-card-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-card-content\">\n <h4 class=\"entity-card-title\">{{ entity.Name }}</h4>\n @if (entity.Description) {\n <p class=\"entity-card-description\">{{ entity.Description }}</p>\n }\n </div>\n <button\n class=\"favorite-btn\"\n [class.favorited]=\"isEntityFavorited(entity)\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n [title]=\"isEntityFavorited(entity) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isEntityFavorited(entity) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n </div>\n }\n </div>\n @if (filteredEntities.length === 0 && entities.length > 0) {\n <div class=\"empty-state small\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <h3>No Matching Entities</h3>\n <p>No entities match \"{{ entityFilterText }}\"</p>\n </div>\n }\n @if (entities.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database empty-icon\"></i>\n <h3>No Entities Available</h3>\n <p>There are no entities configured for this application.</p>\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <mj-entity-viewer\n [entity]=\"selectedEntity\"\n [viewEntity]=\"selectedViewEntity\"\n [viewMode]=\"state.viewMode\"\n [filterText]=\"debouncedFilterText\"\n [selectedRecordId]=\"state.selectedRecordId\"\n [config]=\"viewerConfig\"\n [gridState]=\"currentGridState\"\n [timelineConfig]=\"currentTimelineConfig\"\n (viewModeChange)=\"onViewModeChanged($event)\"\n (filterTextChange)=\"onFilterTextChanged($event)\"\n (recordSelected)=\"onViewerRecordSelected($event)\"\n (recordOpened)=\"onViewerRecordOpened($event)\"\n (dataLoaded)=\"onDataLoaded($event)\"\n (filteredCountChanged)=\"onFilteredCountChanged($event)\"\n (gridStateChanged)=\"onGridStateChanged($event)\">\n </mj-entity-viewer>\n }\n </div>\n </div>\n\n <!-- Detail Panel (Right - Slide In) -->\n @if (state.detailPanelOpen && selectedRecord) {\n <div class=\"detail-panel\" [style.width.px]=\"state.detailPanelWidth\">\n <mj-entity-record-detail-panel\n [entity]=\"detailPanelEntity\"\n [record]=\"selectedRecord\"\n (close)=\"onDetailPanelClosed()\"\n (openRecord)=\"onOpenRecord($event)\"\n (navigateToRelated)=\"onNavigateToRelated($event)\"\n (openRelatedRecord)=\"onOpenRelatedRecord($event)\"\n (openForeignKeyRecord)=\"onOpenForeignKeyRecord($event)\">\n </mj-entity-record-detail-panel>\n </div>\n }\n\n <!-- View Configuration Panel -->\n <mj-view-config-panel\n [entity]=\"selectedEntity\"\n [viewEntity]=\"selectedViewEntity\"\n [isOpen]=\"state.viewConfigPanelOpen\"\n [currentGridState]=\"currentGridState\"\n [externalFilterState]=\"filterDialogState\"\n (close)=\"onCloseViewConfigPanel()\"\n (save)=\"onSaveView($event)\"\n (delete)=\"onDeleteView()\"\n (openFilterDialogRequest)=\"onOpenFilterDialogRequest($event)\">\n </mj-view-config-panel>\n\n <!-- Filter Dialog (rendered at dashboard level for full viewport width) -->\n <mj-filter-dialog\n [isOpen]=\"isFilterDialogOpen\"\n [fields]=\"filterDialogFields\"\n [filter]=\"filterDialogState\"\n [disabled]=\"filterDialogDisabled\"\n (close)=\"onCloseFilterDialog()\"\n (apply)=\"onFilterApplied($event)\">\n </mj-filter-dialog>\n</div>\n", styles: [".data-explorer-container {\n display: flex;\n height: 100%;\n width: 100%;\n background: #f5f7fa;\n overflow: hidden;\n}\n\n.navigation-panel {\n flex-shrink: 0;\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n transition: width 0.2s ease-in-out;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n}\n.navigation-panel.collapsed {\n width: 48px;\n}\n\n.content-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: #f5f7fa;\n}\n\n/* Breadcrumb Bar */\n.breadcrumb-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: white;\n border-bottom: 1px solid #eee;\n flex-shrink: 0;\n font-size: 13px;\n min-height: 40px;\n}\n\n.breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #666;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s ease;\n max-width: 200px;\n}\n\n.breadcrumb-item.clickable {\n cursor: pointer;\n}\n\n.breadcrumb-item.clickable:hover {\n background: #f0f0f0;\n color: #1976d2;\n}\n\n.breadcrumb-item.current {\n color: #1a1a1a;\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-icon {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n.breadcrumb-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-separator {\n font-size: 10px;\n color: #ccc;\n flex-shrink: 0;\n}\n\n.content-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\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/* View Selector within header */\n.header-left ::ng-deep mj-view-selector {\n margin-left: 8px;\n}\n\n.entity-icon {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #1a1a1a;\n}\n\n.record-count {\n font-size: 13px;\n color: #666;\n font-weight: 500;\n}\n\n.header-center {\n flex: 1;\n max-width: 600px;\n}\n\n.smart-filter-container {\n position: relative;\n width: 100%;\n}\n\n.smart-filter-input {\n width: 100%;\n padding: 10px 40px 10px 16px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n font-size: 14px;\n background: #fafafa;\n transition: all 0.15s ease;\n}\n.smart-filter-input:focus {\n outline: none;\n border-color: #1976d2;\n background: white;\n box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.1);\n}\n.smart-filter-input::placeholder {\n color: #999;\n}\n\n.clear-filter-btn {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n transition: all 0.15s ease;\n}\n.clear-filter-btn:hover {\n background: #e0e0e0;\n color: #424242;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.view-mode-toggle {\n display: flex;\n background: #f0f0f0;\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: #666;\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: #333;\n}\n.toggle-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Timeline Date Field Selector - Styled Dropdown */\n.date-field-selector-container {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.date-field-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.date-field-selector-wrapper {\n position: relative;\n}\n\n.date-field-selector-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n min-width: 120px;\n max-width: 200px;\n}\n\n.date-field-selector-button:hover:not(:disabled) {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n}\n\n.date-field-selector-button:disabled {\n cursor: default;\n opacity: 0.8;\n}\n\n.date-field-selector-button.open {\n background: var(--background-active, #e0e0e0);\n border-color: var(--primary-color, #007bff);\n}\n\n.date-field-icon {\n color: var(--text-secondary, #666);\n font-size: 12px;\n}\n\n.date-field-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.date-field-arrow {\n color: var(--text-secondary, #666);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.date-field-arrow.rotated {\n transform: rotate(180deg);\n}\n\n.date-field-dropdown-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 180px;\n max-width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--background-panel, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n.date-field-dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n cursor: pointer;\n transition: background 0.1s ease;\n font-size: 13px;\n}\n\n.date-field-dropdown-item:hover {\n background: var(--background-hover, #f5f5f5);\n}\n\n.date-field-dropdown-item.selected {\n background: var(--primary-light, #e6f0ff);\n}\n\n.date-field-dropdown-item.selected:hover {\n background: var(--primary-light-hover, #d6e4f9);\n}\n\n.date-field-dropdown-item .item-icon {\n color: var(--text-secondary, #666);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.date-field-dropdown-item .item-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.date-field-dropdown-item .selected-check {\n color: var(--primary-color, #007bff);\n font-size: 12px;\n}\n\n/* Timeline Orientation Toggle */\n.timeline-orientation-toggle {\n display: flex;\n background: #f0f0f0;\n border-radius: 8px;\n padding: 3px;\n}\n\n.content-body {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n display: flex;\n flex-direction: column;\n}\n\n.loading-container,\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n background: white;\n border-radius: 8px;\n}\n\n.loading-spinner {\n font-size: 32px;\n color: #1976d2;\n}\n\n.loading-message {\n margin: 0;\n font-size: 14px;\n color: #666;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #757575;\n background: white;\n border-radius: 8px;\n padding: 40px;\n}\n\n.empty-icon {\n font-size: 64px;\n color: #e0e0e0;\n margin-bottom: 24px;\n}\n\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n color: #666;\n}\n\n/* Entity Home View - Card Grid */\n.entity-home-view {\n flex: 1;\n overflow: auto;\n padding: 4px;\n}\n\n.entity-card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n padding: 0;\n}\n\n.entity-card {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 20px;\n background: white;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 1px solid #e8e8e8;\n}\n\n.entity-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);\n border-color: #1976d2;\n}\n\n.entity-card:active {\n transform: translateY(0);\n}\n\n.entity-card-icon {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n background: linear-gradient(135deg, #e3f2fd, #bbdefb);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.entity-card-icon i {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-card:hover .entity-card-icon {\n background: linear-gradient(135deg, #1976d2, #1565c0);\n}\n\n.entity-card:hover .entity-card-icon i {\n color: white;\n}\n\n.entity-card-content {\n flex: 1;\n min-width: 0;\n}\n\n.entity-card-title {\n margin: 0 0 6px 0;\n font-size: 15px;\n font-weight: 600;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.entity-card-description {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.detail-panel {\n flex-shrink: 0;\n height: 100%;\n background: white;\n border-left: 1px solid #e0e0e0;\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: slideIn 0.2s ease-out;\n}\n\n@keyframes slideIn {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n:host ::ng-deep mj-explorer-grid-view,\n:host ::ng-deep mj-explorer-cards-view {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n HOME SCREEN STYLES\n ============================================ */\n\n/* Home-level header adjustments */\n.content-header.home-header {\n border-bottom: none;\n background: transparent;\n box-shadow: none;\n padding: 24px 24px 16px;\n}\n\n.content-body.home-content {\n padding-top: 0;\n}\n\n/* Smart filter with search icon */\n.filter-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: #999;\n font-size: 14px;\n pointer-events: none;\n}\n\n.smart-filter-container .smart-filter-input {\n padding-left: 40px;\n}\n\n/* ============================================\n HOME SECTIONS\n ============================================ */\n\n.home-section {\n margin-bottom: 28px;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 14px;\n padding-left: 4px;\n}\n\n.section-icon {\n font-size: 14px;\n color: #1976d2;\n width: 20px;\n text-align: center;\n}\n\n.section-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-count {\n font-size: 12px;\n color: #888;\n font-weight: 500;\n margin-left: 8px;\n}\n\n/* ============================================\n TWO-COLUMN LAYOUT (Entities left, Records right)\n ============================================ */\n\n.home-two-column-layout {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n margin-bottom: 28px;\n}\n\n/* When only one column has content, let it take full width */\n.home-two-column-layout.single-column {\n grid-template-columns: 1fr;\n}\n\n.home-column {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n/* Section header with inline toggle */\n.section-header-with-toggle {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 14px;\n padding-left: 4px;\n}\n\n.section-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* Inline Common/All toggle (compact) */\n.inline-toggle {\n display: flex;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 2px;\n}\n\n.inline-toggle .toggle-btn {\n width: auto;\n height: 26px;\n padding: 0 10px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.15s ease;\n}\n\n.inline-toggle .toggle-btn:hover {\n color: #333;\n}\n\n.inline-toggle .toggle-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* ============================================\n COMPACT ENTITY CARDS (Recent/Favorites rows)\n ============================================ */\n\n.entity-card-row {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n padding: 0;\n}\n\n.entity-card.compact {\n flex: 0 0 auto;\n width: auto;\n min-width: 180px;\n max-width: 280px;\n padding: 12px 16px;\n gap: 12px;\n}\n\n.entity-card.compact .entity-card-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n}\n\n.entity-card.compact .entity-card-icon i {\n font-size: 16px;\n}\n\n.entity-card.compact .entity-card-title {\n margin: 0;\n font-size: 14px;\n}\n\n.entity-card.compact .entity-card-content {\n display: flex;\n align-items: center;\n}\n\n/* ============================================\n FAVORITE BUTTON\n ============================================ */\n\n.favorite-btn {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ccc;\n transition: all 0.15s ease;\n margin-left: auto;\n}\n\n.favorite-btn:hover {\n background: rgba(255, 193, 7, 0.1);\n color: #ffc107;\n transform: scale(1.1);\n}\n\n.favorite-btn.favorited {\n color: #ffc107;\n}\n\n.favorite-btn.favorited:hover {\n background: rgba(255, 193, 7, 0.15);\n color: #ffb300;\n}\n\n.entity-card .favorite-btn {\n opacity: 0;\n transition: opacity 0.15s ease, background 0.15s ease, color 0.15s ease, transform 0.15s ease;\n}\n\n.entity-card:hover .favorite-btn {\n opacity: 1;\n}\n\n.entity-card .favorite-btn.favorited {\n opacity: 1;\n}\n\n/* ============================================\n RECENT RECORDS LIST\n ============================================ */\n\n.recent-records-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n background: white;\n border-radius: 10px;\n padding: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.recent-record-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.recent-record-item:hover {\n background: #f5f7fa;\n}\n\n.recent-record-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: linear-gradient(135deg, #e8f5e9, #c8e6c9);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.recent-record-icon i {\n font-size: 14px;\n color: #4caf50;\n}\n\n.recent-record-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recent-record-name {\n font-size: 14px;\n font-weight: 500;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.recent-record-entity {\n font-size: 12px;\n color: #888;\n}\n\n.recent-record-time {\n font-size: 11px;\n color: #aaa;\n flex-shrink: 0;\n}\n\n/* ============================================\n ENTITY LIST (for Recent/Favorite Entities)\n ============================================ */\n\n.entity-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n background: white;\n border-radius: 10px;\n padding: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.entity-list-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.entity-list-item:hover {\n background: #f5f7fa;\n}\n\n.entity-list-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: linear-gradient(135deg, #e3f2fd, #bbdefb);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.entity-list-icon i {\n font-size: 14px;\n color: #1976d2;\n}\n\n.entity-list-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-list-name {\n font-size: 14px;\n font-weight: 500;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.entity-list-item .favorite-btn {\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.entity-list-item:hover .favorite-btn {\n opacity: 1;\n}\n\n.entity-list-item .favorite-btn.favorited {\n opacity: 1;\n}\n\n/* ============================================\n ENTITY FILTER STRIP (for Recent Records)\n ============================================ */\n\n.entity-filter-strip {\n display: flex;\n gap: 4px;\n margin-left: auto;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 3px;\n}\n\n.entity-filter-btn {\n width: 28px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.entity-filter-btn:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.05);\n}\n\n.entity-filter-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* ============================================\n COMMON/ALL TOGGLE WITH LABELS\n ============================================ */\n\n.view-mode-toggle .toggle-btn {\n width: auto;\n padding: 0 12px;\n gap: 6px;\n}\n\n.toggle-label {\n font-size: 12px;\n font-weight: 500;\n}\n\n/* ============================================\n EMPTY STATE VARIANTS\n ============================================ */\n\n.empty-state.small {\n height: auto;\n padding: 32px;\n background: #fafafa;\n}\n\n.empty-state.small .empty-icon {\n font-size: 40px;\n margin-bottom: 16px;\n}\n\n.empty-state.small h3 {\n font-size: 16px;\n}\n\n.empty-state.small p {\n font-size: 13px;\n}\n\n/* ============================================\n RESPONSIVE STYLES\n ============================================ */\n\n@media (max-width: 1200px) {\n .entity-card-grid {\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n }\n}\n\n@media (max-width: 900px) {\n .content-header {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .header-center {\n order: 3;\n flex-basis: 100%;\n max-width: 100%;\n }\n\n .entity-card.compact {\n min-width: 160px;\n }\n\n /* Stack two-column layout on smaller screens */\n .home-two-column-layout {\n grid-template-columns: 1fr;\n gap: 20px;\n }\n}\n\n@media (max-width: 600px) {\n .data-explorer-container {\n flex-direction: column;\n }\n\n .navigation-panel {\n display: none;\n }\n\n .content-header {\n padding: 12px 16px;\n }\n\n .content-body {\n padding: 12px 16px;\n }\n\n .entity-card-grid {\n grid-template-columns: 1fr;\n gap: 12px;\n }\n\n .entity-card {\n padding: 16px;\n }\n\n .entity-card.compact {\n min-width: 100%;\n max-width: 100%;\n }\n\n .entity-card-row {\n flex-direction: column;\n }\n\n .view-mode-toggle {\n display: none;\n }\n\n .section-title {\n font-size: 13px;\n }\n\n .home-section {\n margin-bottom: 20px;\n }\n}\n"] }]
|
|
2581
|
+
], template: "<div class=\"data-explorer-container\">\n <!-- Navigation Panel (Left) - Hidden at home level, animated -->\n @if (!isAtHomeLevel) {\n <div\n class=\"navigation-panel\"\n [class.collapsed]=\"state.navigationPanelCollapsed\"\n [style.width.px]=\"state.navigationPanelCollapsed ? 48 : state.navigationPanelWidth\"\n [@slideInLeft]>\n\n <mj-explorer-navigation-panel\n [entities]=\"entities\"\n [selectedEntityName]=\"state.selectedEntityName\"\n [favorites]=\"state.favorites\"\n [recentItems]=\"state.recentItems\"\n [collapsed]=\"state.navigationPanelCollapsed\"\n [allowedEntityNames]=\"allowedEntityNames\"\n [favoritesSectionExpanded]=\"state.favoritesSectionExpanded\"\n [recentSectionExpanded]=\"state.recentSectionExpanded\"\n [entitiesSectionExpanded]=\"state.entitiesSectionExpanded\"\n [viewsSectionExpanded]=\"state.viewsSectionExpanded\"\n (entitySelected)=\"onEntitySelected($event)\"\n (toggleCollapse)=\"toggleNavigationPanel()\"\n (sectionToggled)=\"stateService.toggleSection($event)\"\n (openRecord)=\"onOpenRecordFromNav($event)\"\n (selectRecord)=\"onSelectRecordFromNav($event)\"\n (expandAndFocus)=\"onExpandAndFocus($event)\">\n </mj-explorer-navigation-panel>\n </div>\n }\n\n <!-- Main Content Area -->\n <div class=\"content-area\">\n <!-- Breadcrumb Bar - Hidden at home level -->\n @if (!isAtHomeLevel && breadcrumbs.length > 0) {\n <div class=\"breadcrumb-bar\">\n @for (crumb of breadcrumbs; track crumb.label; let i = $index; let last = $last) {\n <span\n class=\"breadcrumb-item\"\n [class.clickable]=\"!last\"\n [class.current]=\"last\"\n (click)=\"onBreadcrumbClick(crumb, i)\"\n [title]=\"crumb.label\">\n @if (crumb.icon) {\n <i [class]=\"crumb.icon\" class=\"breadcrumb-icon\"></i>\n }\n <span class=\"breadcrumb-label\">{{ crumb.label }}</span>\n </span>\n @if (!last) {\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n }\n }\n </div>\n }\n\n <!-- Header -->\n <div class=\"content-header\" [class.home-header]=\"isAtHomeLevel\">\n <div class=\"header-left\">\n @if (selectedEntity) {\n <i [class]=\"getEntityIcon(selectedEntity)\" class=\"entity-icon\"></i>\n <h2 class=\"entity-title\">{{ selectedEntity.Name }}</h2>\n @if (debouncedFilterText && filteredRecordCount !== totalRecordCount) {\n <span class=\"record-count\">{{ filteredRecordCount | number }} of {{ totalRecordCount | number }} records</span>\n } @else {\n <span class=\"record-count\">{{ totalRecordCount | number }} records</span>\n }\n\n <!-- View Selector -->\n <mj-view-selector\n [entity]=\"selectedEntity\"\n [selectedViewId]=\"state.selectedViewId\"\n [viewModified]=\"state.viewModified\"\n (viewSelected)=\"onViewSelected($event)\"\n (saveViewRequested)=\"onSaveViewRequested($event)\"\n (manageViewsRequested)=\"onManageViewsRequested()\"\n (openInTabRequested)=\"onOpenInTabRequested($event)\"\n (configureViewRequested)=\"onConfigureViewRequested()\"\n (createNewRecordRequested)=\"onCreateNewRecord()\"\n (exportRequested)=\"onExport()\">\n </mj-view-selector>\n } @else {\n @if (displayIcon) {\n <i [class]=\"displayIcon\" class=\"entity-icon\"></i>\n }\n <h2 class=\"entity-title\">{{ displayTitle }}</h2>\n <span class=\"record-count\">{{ entities.length }} entities available</span>\n }\n </div>\n\n <div class=\"header-center\">\n @if (selectedEntity) {\n <div class=\"smart-filter-container\">\n <i class=\"fa-solid fa-search filter-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"smart-filter-input\"\n placeholder=\"Filter records... (press / to focus)\"\n [ngModel]=\"state.smartFilterPrompt\"\n (ngModelChange)=\"onSmartFilterChanged($event)\"\n />\n @if (state.smartFilterPrompt) {\n <button class=\"clear-filter-btn\" (click)=\"onSmartFilterChanged('')\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n } @else {\n <!-- Entity filter for home screen -->\n <div class=\"smart-filter-container\">\n <i class=\"fa-solid fa-search filter-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"smart-filter-input\"\n placeholder=\"Filter entities... (press / to focus)\"\n [(ngModel)]=\"entityFilterText\"\n />\n @if (entityFilterText) {\n <button class=\"clear-filter-btn\" (click)=\"entityFilterText = ''\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n </div>\n\n <div class=\"header-right\">\n @if (selectedEntity) {\n <!-- View Mode Toggle -->\n <div class=\"view-mode-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.viewMode === 'grid'\"\n (click)=\"onViewModeChanged('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.viewMode === 'cards'\"\n (click)=\"onViewModeChanged('cards')\"\n title=\"Cards View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n @if (entityHasDateFields) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.viewMode === 'timeline'\"\n (click)=\"onViewModeChanged('timeline')\"\n title=\"Timeline View\">\n <i class=\"fa-solid fa-timeline\"></i>\n </button>\n }\n </div>\n\n <!-- Timeline Controls (only shown when timeline view is active) -->\n @if (state.viewMode === 'timeline' && entityHasDateFields) {\n <!-- Date Field Selector -->\n <div class=\"date-field-selector-container\">\n <!-- Backdrop for closing dropdown -->\n @if (isDateFieldDropdownOpen) {\n <div class=\"date-field-backdrop\" (click)=\"closeDateFieldDropdown()\"></div>\n }\n\n <div class=\"date-field-selector-wrapper\">\n <button\n class=\"date-field-selector-button\"\n [class.open]=\"isDateFieldDropdownOpen\"\n [disabled]=\"availableDateFields.length <= 1\"\n (click)=\"toggleDateFieldDropdown()\">\n <i class=\"fa-solid fa-calendar-days date-field-icon\"></i>\n <span class=\"date-field-name\">{{ effectiveTimelineDateFieldDisplayName }}</span>\n @if (availableDateFields.length > 1) {\n <i class=\"fa-solid fa-chevron-down date-field-arrow\" [class.rotated]=\"isDateFieldDropdownOpen\"></i>\n }\n </button>\n\n @if (isDateFieldDropdownOpen && availableDateFields.length > 1) {\n <div class=\"date-field-dropdown-panel\">\n @for (field of availableDateFields; track field.name) {\n <div\n class=\"date-field-dropdown-item\"\n [class.selected]=\"field.name === effectiveTimelineDateField\"\n (click)=\"setTimelineDateField(field.name)\">\n <i class=\"fa-regular fa-calendar item-icon\"></i>\n <span class=\"item-name\">{{ field.displayName }}</span>\n @if (field.name === effectiveTimelineDateField) {\n <i class=\"fa-solid fa-check selected-check\"></i>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Orientation Toggle -->\n <div class=\"timeline-orientation-toggle\">\n <button\n class=\"toggle-btn\"\n (click)=\"toggleTimelineOrientation()\"\n [title]=\"state.timelineOrientation === 'vertical' ? 'Switch to Horizontal' : 'Switch to Vertical'\">\n <i [class]=\"state.timelineOrientation === 'vertical' ? 'fa-solid fa-ellipsis-vertical' : 'fa-solid fa-ellipsis'\"></i>\n </button>\n </div>\n\n <!-- Sort Order Toggle -->\n <div class=\"timeline-sort-toggle\">\n <button\n class=\"toggle-btn\"\n (click)=\"toggleTimelineSortOrder()\"\n [title]=\"state.timelineSortOrder === 'desc' ? 'Showing Newest First (click for Oldest First)' : 'Showing Oldest First (click for Newest First)'\">\n <i [class]=\"state.timelineSortOrder === 'desc' ? 'fa-solid fa-arrow-down-wide-short' : 'fa-solid fa-arrow-up-wide-short'\"></i>\n </button>\n </div>\n }\n }\n <!-- Common/All toggle moved to inline with All Entities section header -->\n </div>\n </div>\n\n <!-- Content Body - Using mj-entity-viewer composite -->\n <div class=\"content-body\" [class.home-content]=\"isAtHomeLevel\">\n @if (!selectedEntity) {\n <!-- Entity Home View - Two-Column Layout -->\n <div class=\"entity-home-view\">\n @if (isLoadingEntities) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading entities...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <!-- Two-Column Layout: Records (left) | Entities (right) -->\n @if (hasTopSectionContent) {\n <div class=\"home-two-column-layout\" [class.single-column]=\"!hasRecordsColumnContent || !hasEntitiesColumnContent\">\n <!-- Left Column: Recent & Favorite Records (most actionable) -->\n @if (hasRecordsColumnContent) {\n <div class=\"home-column\">\n <!-- Recent Records Section -->\n @if (recentRecords.length > 0) {\n <div class=\"home-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-history section-icon\"></i>\n <h3 class=\"section-title\">Recent Records</h3>\n <!-- Entity filter strip - only show with 2+ entities -->\n @if (showRecentRecordsEntityFilter) {\n <div class=\"entity-filter-strip\">\n <button\n class=\"entity-filter-btn\"\n [class.active]=\"recentRecordsEntityFilter === null\"\n (click)=\"setRecentRecordsEntityFilter(null)\"\n title=\"Show all entities\">\n <i class=\"fa-solid fa-layer-group\"></i>\n </button>\n @for (entity of uniqueRecentRecordEntities; track entity.entityId) {\n <button\n class=\"entity-filter-btn\"\n [class.active]=\"recentRecordsEntityFilter === entity.entityId\"\n (click)=\"setRecentRecordsEntityFilter(entity.entityId)\"\n [title]=\"entity.entityName\">\n <i [class]=\"entity.icon\"></i>\n </button>\n }\n </div>\n }\n </div>\n <div class=\"recent-records-list\">\n @for (record of filteredRecentRecords; track record.entityId + '|' + record.recordId) {\n <div\n class=\"recent-record-item\"\n (click)=\"onRecentRecordClick(record)\"\n [title]=\"record.entityName + ' - ' + record.recordId\">\n <div class=\"recent-record-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"recent-record-content\">\n <span class=\"recent-record-name\">{{ record.recordName || record.recordId }}</span>\n <span class=\"recent-record-entity\">{{ record.entityName }}</span>\n </div>\n <span class=\"recent-record-time\">{{ formatRelativeTime(record.latestAt) }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Favorite Records Section -->\n @if (favoriteRecords.length > 0) {\n <div class=\"home-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-star section-icon\"></i>\n <h3 class=\"section-title\">Favorite Records</h3>\n </div>\n <div class=\"recent-records-list\">\n @for (record of favoriteRecords; track record.userFavoriteId) {\n <div\n class=\"recent-record-item\"\n (click)=\"onFavoriteRecordClick(record)\"\n [title]=\"record.entityName + ' - ' + record.recordId\">\n <div class=\"recent-record-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"recent-record-content\">\n <span class=\"recent-record-name\">{{ record.recordName || record.recordId }}</span>\n <span class=\"recent-record-entity\">{{ record.entityName }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Right Column: Recent & Favorite Entities -->\n @if (hasEntitiesColumnContent) {\n <div class=\"home-column\">\n <!-- Recent Entities Section (list format) -->\n @if (recentEntities.length > 0) {\n <div class=\"home-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-clock section-icon\"></i>\n <h3 class=\"section-title\">Recent Entities</h3>\n </div>\n <div class=\"entity-list\">\n @for (entity of recentEntities; track entity.ID) {\n <div\n class=\"entity-list-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.Name\">\n <div class=\"entity-list-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-list-content\">\n <span class=\"entity-list-name\">{{ entity.Name }}</span>\n </div>\n <button\n class=\"favorite-btn\"\n [class.favorited]=\"isEntityFavorited(entity)\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n [title]=\"isEntityFavorited(entity) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isEntityFavorited(entity) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Favorite Entities Section (list format) -->\n @if (favoriteEntities.length > 0) {\n <div class=\"home-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-star section-icon\"></i>\n <h3 class=\"section-title\">Favorite Entities</h3>\n </div>\n <div class=\"entity-list\">\n @for (entity of favoriteEntities; track entity.ID) {\n <div\n class=\"entity-list-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.Name\">\n <div class=\"entity-list-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-list-content\">\n <span class=\"entity-list-name\">{{ entity.Name }}</span>\n </div>\n <button\n class=\"favorite-btn favorited\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n title=\"Remove from favorites\">\n <i class=\"fa-solid fa-star\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- All/Common Entities Section - Full Width -->\n <div class=\"home-section\">\n <div class=\"section-header-with-toggle\">\n <div class=\"section-header-left\">\n <i class=\"fa-solid fa-database section-icon\"></i>\n <h3 class=\"section-title\">\n @if (state.showAllEntities || !showCommonAllToggle) {\n All Entities\n } @else {\n Common Entities\n }\n </h3>\n @if (entityFilterText && filteredEntities.length !== entities.length) {\n <span class=\"section-count\">{{ filteredEntities.length }} matching</span>\n }\n </div>\n @if (showCommonAllToggle) {\n <div class=\"inline-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"!state.showAllEntities\"\n (click)=\"toggleShowAllEntities()\"\n title=\"Show common entities ({{ commonEntitiesCount }})\">\n Common\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.showAllEntities\"\n (click)=\"toggleShowAllEntities()\"\n title=\"Show all entities ({{ allEntitiesCount }})\">\n All\n </button>\n </div>\n }\n </div>\n <div class=\"entity-card-grid\">\n @for (entity of filteredEntities; track entity.ID) {\n <div\n class=\"entity-card\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.Name\">\n <div class=\"entity-card-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-card-content\">\n <h4 class=\"entity-card-title\">{{ entity.Name }}</h4>\n @if (entity.Description) {\n <p class=\"entity-card-description\">{{ entity.Description }}</p>\n }\n </div>\n <button\n class=\"favorite-btn\"\n [class.favorited]=\"isEntityFavorited(entity)\"\n (click)=\"toggleEntityFavorite(entity, $event)\"\n [title]=\"isEntityFavorited(entity) ? 'Remove from favorites' : 'Add to favorites'\">\n <i [class]=\"isEntityFavorited(entity) ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n </div>\n }\n </div>\n @if (filteredEntities.length === 0 && entities.length > 0) {\n <div class=\"empty-state small\">\n <i class=\"fa-solid fa-search empty-icon\"></i>\n <h3>No Matching Entities</h3>\n <p>No entities match \"{{ entityFilterText }}\"</p>\n </div>\n }\n @if (entities.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-database empty-icon\"></i>\n <h3>No Entities Available</h3>\n <p>There are no entities configured for this application.</p>\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <mj-entity-viewer\n [entity]=\"selectedEntity\"\n [viewEntity]=\"selectedViewEntity\"\n [viewMode]=\"state.viewMode\"\n [filterText]=\"debouncedFilterText\"\n [selectedRecordId]=\"state.selectedRecordId\"\n [config]=\"viewerConfig\"\n [gridState]=\"currentGridState\"\n [timelineConfig]=\"currentTimelineConfig\"\n (viewModeChange)=\"onViewModeChanged($event)\"\n (filterTextChange)=\"onFilterTextChanged($event)\"\n (recordSelected)=\"onViewerRecordSelected($event)\"\n (recordOpened)=\"onViewerRecordOpened($event)\"\n (dataLoaded)=\"onDataLoaded($event)\"\n (filteredCountChanged)=\"onFilteredCountChanged($event)\"\n (gridStateChanged)=\"onGridStateChanged($event)\">\n </mj-entity-viewer>\n }\n </div>\n </div>\n\n <!-- Detail Panel (Right - Slide In) -->\n @if (state.detailPanelOpen && selectedRecord) {\n <div class=\"detail-panel\" [style.width.px]=\"state.detailPanelWidth\">\n <mj-entity-record-detail-panel\n [entity]=\"detailPanelEntity\"\n [record]=\"selectedRecord\"\n (close)=\"onDetailPanelClosed()\"\n (openRecord)=\"onOpenRecord($event)\"\n (navigateToRelated)=\"onNavigateToRelated($event)\"\n (openRelatedRecord)=\"onOpenRelatedRecord($event)\"\n (openForeignKeyRecord)=\"onOpenForeignKeyRecord($event)\">\n </mj-entity-record-detail-panel>\n </div>\n }\n\n <!-- View Configuration Panel -->\n <mj-view-config-panel\n [entity]=\"selectedEntity\"\n [viewEntity]=\"selectedViewEntity\"\n [isOpen]=\"state.viewConfigPanelOpen\"\n [currentGridState]=\"currentGridState\"\n [externalFilterState]=\"filterDialogState\"\n [isSaving]=\"isSavingView\"\n (close)=\"onCloseViewConfigPanel()\"\n (save)=\"onSaveView($event)\"\n (delete)=\"onDeleteView()\"\n (openFilterDialogRequest)=\"onOpenFilterDialogRequest($event)\">\n </mj-view-config-panel>\n\n <!-- Filter Dialog (rendered at dashboard level for full viewport width) -->\n <mj-filter-dialog\n [isOpen]=\"isFilterDialogOpen\"\n [fields]=\"filterDialogFields\"\n [filter]=\"filterDialogState\"\n [disabled]=\"filterDialogDisabled\"\n (close)=\"onCloseFilterDialog()\"\n (apply)=\"onFilterApplied($event)\">\n </mj-filter-dialog>\n\n <!-- Excel Export Component (hidden, used for export functionality) -->\n <kendo-excelexport #excelExport [data]=\"exportData\" [fileName]=\"exportFileName\">\n @for (col of exportColumns; track col.Name) {\n <kendo-excelexport-column [field]=\"col.Name\" [title]=\"col.DisplayName\"></kendo-excelexport-column>\n }\n </kendo-excelexport>\n</div>\n", styles: [".data-explorer-container {\n display: flex;\n height: 100%;\n width: 100%;\n background: #f5f7fa;\n overflow: hidden;\n}\n\n.navigation-panel {\n flex-shrink: 0;\n height: 100%;\n background: white;\n border-right: 1px solid #e0e0e0;\n transition: width 0.2s ease-in-out;\n overflow: hidden;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.04);\n}\n.navigation-panel.collapsed {\n width: 48px;\n}\n\n.content-area {\n flex: 1;\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 0;\n overflow: hidden;\n background: #f5f7fa;\n}\n\n/* Breadcrumb Bar */\n.breadcrumb-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: white;\n border-bottom: 1px solid #eee;\n flex-shrink: 0;\n font-size: 13px;\n min-height: 40px;\n}\n\n.breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 6px;\n color: #666;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.15s ease;\n max-width: 200px;\n}\n\n.breadcrumb-item.clickable {\n cursor: pointer;\n}\n\n.breadcrumb-item.clickable:hover {\n background: #f0f0f0;\n color: #1976d2;\n}\n\n.breadcrumb-item.current {\n color: #1a1a1a;\n font-weight: 500;\n cursor: default;\n}\n\n.breadcrumb-icon {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n.breadcrumb-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.breadcrumb-separator {\n font-size: 10px;\n color: #ccc;\n flex-shrink: 0;\n}\n\n.content-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\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/* View Selector within header */\n.header-left ::ng-deep mj-view-selector {\n margin-left: 8px;\n}\n\n.entity-icon {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: #1a1a1a;\n}\n\n.record-count {\n font-size: 13px;\n color: #666;\n font-weight: 500;\n}\n\n.header-center {\n flex: 1;\n max-width: 600px;\n}\n\n.smart-filter-container {\n position: relative;\n width: 100%;\n}\n\n.smart-filter-input {\n width: 100%;\n padding: 10px 40px 10px 16px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n font-size: 14px;\n background: #fafafa;\n transition: all 0.15s ease;\n}\n.smart-filter-input:focus {\n outline: none;\n border-color: #1976d2;\n background: white;\n box-shadow: 0 0 0 3px rgba(25, 118, 210, 0.1);\n}\n.smart-filter-input::placeholder {\n color: #999;\n}\n\n.clear-filter-btn {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #757575;\n transition: all 0.15s ease;\n}\n.clear-filter-btn:hover {\n background: #e0e0e0;\n color: #424242;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.view-mode-toggle {\n display: flex;\n background: #f0f0f0;\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: #666;\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: #333;\n}\n.toggle-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Timeline Date Field Selector - Styled Dropdown */\n.date-field-selector-container {\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.date-field-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.date-field-selector-wrapper {\n position: relative;\n}\n\n.date-field-selector-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--background-alt, #f5f5f5);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--text-primary, #333);\n transition: all 0.15s ease;\n min-width: 120px;\n max-width: 200px;\n}\n\n.date-field-selector-button:hover:not(:disabled) {\n background: var(--background-hover, #e8e8e8);\n border-color: var(--border-color-hover, #ccc);\n}\n\n.date-field-selector-button:disabled {\n cursor: default;\n opacity: 0.8;\n}\n\n.date-field-selector-button.open {\n background: var(--background-active, #e0e0e0);\n border-color: var(--primary-color, #007bff);\n}\n\n.date-field-icon {\n color: var(--text-secondary, #666);\n font-size: 12px;\n}\n\n.date-field-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.date-field-arrow {\n color: var(--text-secondary, #666);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.date-field-arrow.rotated {\n transform: rotate(180deg);\n}\n\n.date-field-dropdown-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n min-width: 180px;\n max-width: 280px;\n max-height: 300px;\n overflow-y: auto;\n background: var(--background-panel, #fff);\n border: 1px solid var(--border-color, #e0e0e0);\n border-radius: 8px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n z-index: 1000;\n}\n\n.date-field-dropdown-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n cursor: pointer;\n transition: background 0.1s ease;\n font-size: 13px;\n}\n\n.date-field-dropdown-item:hover {\n background: var(--background-hover, #f5f5f5);\n}\n\n.date-field-dropdown-item.selected {\n background: var(--primary-light, #e6f0ff);\n}\n\n.date-field-dropdown-item.selected:hover {\n background: var(--primary-light-hover, #d6e4f9);\n}\n\n.date-field-dropdown-item .item-icon {\n color: var(--text-secondary, #666);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.date-field-dropdown-item .item-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.date-field-dropdown-item .selected-check {\n color: var(--primary-color, #007bff);\n font-size: 12px;\n}\n\n/* Timeline Orientation Toggle */\n.timeline-orientation-toggle {\n display: flex;\n background: #f0f0f0;\n border-radius: 8px;\n padding: 3px;\n}\n\n.content-body {\n flex: 1;\n overflow: hidden;\n padding: 20px 24px;\n display: flex;\n flex-direction: column;\n}\n\n.loading-container,\n.loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n gap: 16px;\n background: white;\n border-radius: 8px;\n}\n\n.loading-spinner {\n font-size: 32px;\n color: #1976d2;\n}\n\n.loading-message {\n margin: 0;\n font-size: 14px;\n color: #666;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: #757575;\n background: white;\n border-radius: 8px;\n padding: 40px;\n}\n\n.empty-icon {\n font-size: 64px;\n color: #e0e0e0;\n margin-bottom: 24px;\n}\n\n.empty-state h3 {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 600;\n color: #333;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n color: #666;\n}\n\n/* Entity Home View - Card Grid */\n.entity-home-view {\n flex: 1;\n overflow: auto;\n padding: 4px;\n}\n\n.entity-card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n padding: 0;\n}\n\n.entity-card {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 20px;\n background: white;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 1px solid #e8e8e8;\n}\n\n.entity-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);\n border-color: #1976d2;\n}\n\n.entity-card:active {\n transform: translateY(0);\n}\n\n.entity-card-icon {\n width: 48px;\n height: 48px;\n border-radius: 10px;\n background: linear-gradient(135deg, #e3f2fd, #bbdefb);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.entity-card-icon i {\n font-size: 20px;\n color: #1976d2;\n}\n\n.entity-card:hover .entity-card-icon {\n background: linear-gradient(135deg, #1976d2, #1565c0);\n}\n\n.entity-card:hover .entity-card-icon i {\n color: white;\n}\n\n.entity-card-content {\n flex: 1;\n min-width: 0;\n}\n\n.entity-card-title {\n margin: 0 0 6px 0;\n font-size: 15px;\n font-weight: 600;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.entity-card-description {\n margin: 0;\n font-size: 13px;\n color: #666;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.detail-panel {\n flex-shrink: 0;\n height: 100%;\n background: white;\n border-left: 1px solid #e0e0e0;\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: slideIn 0.2s ease-out;\n}\n\n@keyframes slideIn {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n:host ::ng-deep mj-explorer-grid-view,\n:host ::ng-deep mj-explorer-cards-view {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n HOME SCREEN STYLES\n ============================================ */\n\n/* Home-level header adjustments */\n.content-header.home-header {\n border-bottom: none;\n background: transparent;\n box-shadow: none;\n padding: 24px 24px 16px;\n}\n\n.content-body.home-content {\n padding-top: 0;\n}\n\n/* Smart filter with search icon */\n.filter-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: #999;\n font-size: 14px;\n pointer-events: none;\n}\n\n.smart-filter-container .smart-filter-input {\n padding-left: 40px;\n}\n\n/* ============================================\n HOME SECTIONS\n ============================================ */\n\n.home-section {\n margin-bottom: 28px;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 14px;\n padding-left: 4px;\n}\n\n.section-icon {\n font-size: 14px;\n color: #1976d2;\n width: 20px;\n text-align: center;\n}\n\n.section-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-count {\n font-size: 12px;\n color: #888;\n font-weight: 500;\n margin-left: 8px;\n}\n\n/* ============================================\n TWO-COLUMN LAYOUT (Entities left, Records right)\n ============================================ */\n\n.home-two-column-layout {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 24px;\n margin-bottom: 28px;\n}\n\n/* When only one column has content, let it take full width */\n.home-two-column-layout.single-column {\n grid-template-columns: 1fr;\n}\n\n.home-column {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n/* Section header with inline toggle */\n.section-header-with-toggle {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 14px;\n padding-left: 4px;\n}\n\n.section-header-left {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* Inline Common/All toggle (compact) */\n.inline-toggle {\n display: flex;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 2px;\n}\n\n.inline-toggle .toggle-btn {\n width: auto;\n height: 26px;\n padding: 0 10px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.15s ease;\n}\n\n.inline-toggle .toggle-btn:hover {\n color: #333;\n}\n\n.inline-toggle .toggle-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* ============================================\n COMPACT ENTITY CARDS (Recent/Favorites rows)\n ============================================ */\n\n.entity-card-row {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n padding: 0;\n}\n\n.entity-card.compact {\n flex: 0 0 auto;\n width: auto;\n min-width: 180px;\n max-width: 280px;\n padding: 12px 16px;\n gap: 12px;\n}\n\n.entity-card.compact .entity-card-icon {\n width: 36px;\n height: 36px;\n border-radius: 8px;\n}\n\n.entity-card.compact .entity-card-icon i {\n font-size: 16px;\n}\n\n.entity-card.compact .entity-card-title {\n margin: 0;\n font-size: 14px;\n}\n\n.entity-card.compact .entity-card-content {\n display: flex;\n align-items: center;\n}\n\n/* ============================================\n FAVORITE BUTTON\n ============================================ */\n\n.favorite-btn {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ccc;\n transition: all 0.15s ease;\n margin-left: auto;\n}\n\n.favorite-btn:hover {\n background: rgba(255, 193, 7, 0.1);\n color: #ffc107;\n transform: scale(1.1);\n}\n\n.favorite-btn.favorited {\n color: #ffc107;\n}\n\n.favorite-btn.favorited:hover {\n background: rgba(255, 193, 7, 0.15);\n color: #ffb300;\n}\n\n.entity-card .favorite-btn {\n opacity: 0;\n transition: opacity 0.15s ease, background 0.15s ease, color 0.15s ease, transform 0.15s ease;\n}\n\n.entity-card:hover .favorite-btn {\n opacity: 1;\n}\n\n.entity-card .favorite-btn.favorited {\n opacity: 1;\n}\n\n/* ============================================\n RECENT RECORDS LIST\n ============================================ */\n\n.recent-records-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n background: white;\n border-radius: 10px;\n padding: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.recent-record-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.recent-record-item:hover {\n background: #f5f7fa;\n}\n\n.recent-record-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: linear-gradient(135deg, #e8f5e9, #c8e6c9);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.recent-record-icon i {\n font-size: 14px;\n color: #4caf50;\n}\n\n.recent-record-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recent-record-name {\n font-size: 14px;\n font-weight: 500;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.recent-record-entity {\n font-size: 12px;\n color: #888;\n}\n\n.recent-record-time {\n font-size: 11px;\n color: #aaa;\n flex-shrink: 0;\n}\n\n/* ============================================\n ENTITY LIST (for Recent/Favorite Entities)\n ============================================ */\n\n.entity-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n background: white;\n border-radius: 10px;\n padding: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.entity-list-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.entity-list-item:hover {\n background: #f5f7fa;\n}\n\n.entity-list-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n background: linear-gradient(135deg, #e3f2fd, #bbdefb);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.entity-list-icon i {\n font-size: 14px;\n color: #1976d2;\n}\n\n.entity-list-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-list-name {\n font-size: 14px;\n font-weight: 500;\n color: #1a1a1a;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.entity-list-item .favorite-btn {\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.entity-list-item:hover .favorite-btn {\n opacity: 1;\n}\n\n.entity-list-item .favorite-btn.favorited {\n opacity: 1;\n}\n\n/* ============================================\n ENTITY FILTER STRIP (for Recent Records)\n ============================================ */\n\n.entity-filter-strip {\n display: flex;\n gap: 4px;\n margin-left: auto;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 3px;\n}\n\n.entity-filter-btn {\n width: 28px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.entity-filter-btn:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.05);\n}\n\n.entity-filter-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* ============================================\n COMMON/ALL TOGGLE WITH LABELS\n ============================================ */\n\n.view-mode-toggle .toggle-btn {\n width: auto;\n padding: 0 12px;\n gap: 6px;\n}\n\n.toggle-label {\n font-size: 12px;\n font-weight: 500;\n}\n\n/* ============================================\n EMPTY STATE VARIANTS\n ============================================ */\n\n.empty-state.small {\n height: auto;\n padding: 32px;\n background: #fafafa;\n}\n\n.empty-state.small .empty-icon {\n font-size: 40px;\n margin-bottom: 16px;\n}\n\n.empty-state.small h3 {\n font-size: 16px;\n}\n\n.empty-state.small p {\n font-size: 13px;\n}\n\n/* ============================================\n RESPONSIVE STYLES\n ============================================ */\n\n@media (max-width: 1200px) {\n .entity-card-grid {\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n }\n}\n\n@media (max-width: 900px) {\n .content-header {\n flex-wrap: wrap;\n gap: 12px;\n }\n\n .header-center {\n order: 3;\n flex-basis: 100%;\n max-width: 100%;\n }\n\n .entity-card.compact {\n min-width: 160px;\n }\n\n /* Stack two-column layout on smaller screens */\n .home-two-column-layout {\n grid-template-columns: 1fr;\n gap: 20px;\n }\n}\n\n@media (max-width: 600px) {\n .data-explorer-container {\n flex-direction: column;\n }\n\n .navigation-panel {\n display: none;\n }\n\n .content-header {\n padding: 12px 16px;\n }\n\n .content-body {\n padding: 12px 16px;\n }\n\n .entity-card-grid {\n grid-template-columns: 1fr;\n gap: 12px;\n }\n\n .entity-card {\n padding: 16px;\n }\n\n .entity-card.compact {\n min-width: 100%;\n max-width: 100%;\n }\n\n .entity-card-row {\n flex-direction: column;\n }\n\n .view-mode-toggle {\n display: none;\n }\n\n .section-title {\n font-size: 13px;\n }\n\n .home-section {\n margin-bottom: 20px;\n }\n}\n"] }]
|
|
2406
2582
|
}], () => [{ type: i1.ExplorerStateService }, { type: i0.ChangeDetectorRef }, { type: i2.Router }, { type: i3.RecentAccessService }, { type: i4.NavigationService }], { filterInputRef: [{
|
|
2407
2583
|
type: ViewChild,
|
|
2408
2584
|
args: ['filterInput']
|
|
@@ -2415,6 +2591,9 @@ export { DataExplorerDashboardComponent };
|
|
|
2415
2591
|
}], viewConfigPanelRef: [{
|
|
2416
2592
|
type: ViewChild,
|
|
2417
2593
|
args: [ViewConfigPanelComponent]
|
|
2594
|
+
}], excelExportRef: [{
|
|
2595
|
+
type: ViewChild,
|
|
2596
|
+
args: ['excelExport', { read: ExcelExportComponent }]
|
|
2418
2597
|
}], entityFilter: [{
|
|
2419
2598
|
type: Input
|
|
2420
2599
|
}], deepLink: [{
|
|
@@ -2427,7 +2606,7 @@ export { DataExplorerDashboardComponent };
|
|
|
2427
2606
|
type: HostListener,
|
|
2428
2607
|
args: ['document:keydown', ['$event']]
|
|
2429
2608
|
}] }); })();
|
|
2430
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DataExplorerDashboardComponent, { className: "DataExplorerDashboardComponent", filePath: "src/DataExplorer/data-explorer-dashboard.component.ts", lineNumber:
|
|
2609
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DataExplorerDashboardComponent, { className: "DataExplorerDashboardComponent", filePath: "src/DataExplorer/data-explorer-dashboard.component.ts", lineNumber: 58 }); })();
|
|
2431
2610
|
/**
|
|
2432
2611
|
* Tree-shaking prevention
|
|
2433
2612
|
*/
|