@memberjunction/ng-dashboards 5.23.0 → 5.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +233 -493
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +7 -7
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +717 -8
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +7166 -1889
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +50 -4
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +759 -491
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +14 -15
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +4 -4
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +5 -5
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +5 -5
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +9 -11
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +62 -7
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +825 -359
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +2 -0
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +4 -5
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +11 -12
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.d.ts +2 -3
- package/dist/Actions/components/code-management.component.d.ts.map +1 -1
- package/dist/Actions/components/code-management.component.js +4 -6
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.d.ts +2 -3
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +4 -6
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +10 -11
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +4 -6
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.d.ts +2 -3
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +4 -6
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +1 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +4 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +4 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +4 -1
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +4 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +4 -1
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -0
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +470 -437
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +4 -4
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -5
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +2 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +3 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +3 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +3 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +3 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +412 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4267 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +39 -4
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +187 -13
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +329 -224
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +76 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +602 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +2 -1
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +2 -1
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -0
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -0
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -0
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +25 -107
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -0
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +2 -0
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +2 -0
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +1 -0
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +9 -10
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +2 -0
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +10 -11
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +2 -0
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/__tests__/analytics-resource.test.d.ts +2 -0
- package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-resource.test.js +181 -0
- package/dist/__tests__/analytics-resource.test.js.map +1 -0
- package/dist/__tests__/scheduling.test.d.ts +2 -0
- package/dist/__tests__/scheduling.test.d.ts.map +1 -0
- package/dist/__tests__/scheduling.test.js +205 -0
- package/dist/__tests__/scheduling.test.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +22 -18
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +29 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +19 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +8 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +2 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +7 -3
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +44 -0
- package/dist/shared/entity-field-display.d.ts.map +1 -0
- package/dist/shared/entity-field-display.js +118 -0
- package/dist/shared/entity-field-display.js.map +1 -0
- package/package.json +47 -46
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -85
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -461
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +0 -1
|
@@ -5,10 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
import { Component, Input, Output, EventEmitter, HostListener, ViewChild } from '@angular/core';
|
|
8
|
-
import { NavigationEnd } from '@angular/router';
|
|
9
8
|
import { trigger, transition, style, animate } from '@angular/animations';
|
|
10
9
|
import { Subject } from 'rxjs';
|
|
11
|
-
import { takeUntil, debounceTime, distinctUntilChanged
|
|
10
|
+
import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
12
11
|
import { BaseDashboard } from '@memberjunction/ng-shared';
|
|
13
12
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
14
13
|
import { Metadata, RunView, EntityFieldTSType } from '@memberjunction/core';
|
|
@@ -17,20 +16,19 @@ import { UserInfoEngine } from '@memberjunction/core-entities';
|
|
|
17
16
|
import { EntityViewerComponent, ViewConfigPanelComponent, buildCompositeKey, buildPkString } from '@memberjunction/ng-entity-viewer';
|
|
18
17
|
import { ViewSelectorComponent } from './components/view-selector/view-selector.component';
|
|
19
18
|
import { createEmptyFilter } from '@memberjunction/ng-filter-builder';
|
|
19
|
+
import { UserViewEngine } from '@memberjunction/core-entities';
|
|
20
20
|
import { MJEventType, MJGlobal } from '@memberjunction/global';
|
|
21
21
|
import * as i0 from "@angular/core";
|
|
22
22
|
import * as i1 from "./services/explorer-state.service";
|
|
23
|
-
import * as i2 from "@
|
|
24
|
-
import * as i3 from "@memberjunction/ng-
|
|
25
|
-
import * as i4 from "@
|
|
26
|
-
import * as i5 from "@memberjunction/ng-
|
|
27
|
-
import * as i6 from "@
|
|
28
|
-
import * as i7 from "
|
|
29
|
-
import * as i8 from "
|
|
30
|
-
import * as i9 from "./components/
|
|
31
|
-
import * as i10 from "
|
|
32
|
-
import * as i11 from "./components/filter-dialog/filter-dialog.component";
|
|
33
|
-
import * as i12 from "@angular/common";
|
|
23
|
+
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
24
|
+
import * as i3 from "@memberjunction/ng-export-service";
|
|
25
|
+
import * as i4 from "@angular/forms";
|
|
26
|
+
import * as i5 from "@memberjunction/ng-entity-viewer";
|
|
27
|
+
import * as i6 from "@memberjunction/ng-list-management";
|
|
28
|
+
import * as i7 from "./components/navigation-panel/navigation-panel.component";
|
|
29
|
+
import * as i8 from "./components/view-selector/view-selector.component";
|
|
30
|
+
import * as i9 from "./components/filter-dialog/filter-dialog.component";
|
|
31
|
+
import * as i10 from "@angular/common";
|
|
34
32
|
const _c0 = ["filterInput"];
|
|
35
33
|
const _forTrack0 = ($index, $item) => $item.label;
|
|
36
34
|
const _forTrack1 = ($index, $item) => $item.name;
|
|
@@ -196,129 +194,141 @@ function DataExplorerDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf
|
|
|
196
194
|
i0.ɵɵadvance(2);
|
|
197
195
|
i0.ɵɵconditional(ctx_r1.liveFilterText ? 4 : -1);
|
|
198
196
|
} }
|
|
199
|
-
function
|
|
200
|
-
const
|
|
201
|
-
i0.ɵɵelementStart(0, "
|
|
202
|
-
i0.ɵɵlistener("click", function
|
|
203
|
-
i0.ɵɵelement(1, "i", 50);
|
|
204
|
-
i0.ɵɵelementEnd();
|
|
205
|
-
} if (rf & 2) {
|
|
206
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
207
|
-
i0.ɵɵclassProp("active", ctx_r1.state.viewMode === "timeline");
|
|
208
|
-
} }
|
|
209
|
-
function DataExplorerDashboardComponent_Conditional_11_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
210
|
-
const _r15 = i0.ɵɵgetCurrentView();
|
|
211
|
-
i0.ɵɵelementStart(0, "div", 62);
|
|
212
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Conditional_6_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.closeDateFieldDropdown()); });
|
|
197
|
+
function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
198
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
199
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
200
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.closeDateFieldDropdown()); });
|
|
213
201
|
i0.ɵɵelementEnd();
|
|
214
202
|
} }
|
|
215
|
-
function
|
|
216
|
-
i0.ɵɵelement(0, "i",
|
|
203
|
+
function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
204
|
+
i0.ɵɵelement(0, "i", 61);
|
|
217
205
|
} if (rf & 2) {
|
|
218
206
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
219
207
|
i0.ɵɵclassProp("rotated", ctx_r1.isDateFieldDropdownOpen);
|
|
220
208
|
} }
|
|
221
|
-
function
|
|
222
|
-
i0.ɵɵelement(0, "i",
|
|
209
|
+
function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_9_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
210
|
+
i0.ɵɵelement(0, "i", 66);
|
|
223
211
|
} }
|
|
224
|
-
function
|
|
225
|
-
const
|
|
226
|
-
i0.ɵɵelementStart(0, "div",
|
|
227
|
-
i0.ɵɵlistener("click", function
|
|
228
|
-
i0.ɵɵelement(1, "i",
|
|
229
|
-
i0.ɵɵelementStart(2, "span",
|
|
212
|
+
function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
213
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
214
|
+
i0.ɵɵelementStart(0, "div", 63);
|
|
215
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_9_For_2_Template_div_click_0_listener() { const field_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.setTimelineDateField(field_r16.name)); });
|
|
216
|
+
i0.ɵɵelement(1, "i", 64);
|
|
217
|
+
i0.ɵɵelementStart(2, "span", 65);
|
|
230
218
|
i0.ɵɵtext(3);
|
|
231
219
|
i0.ɵɵelementEnd();
|
|
232
|
-
i0.ɵɵconditionalCreate(4,
|
|
220
|
+
i0.ɵɵconditionalCreate(4, DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_9_For_2_Conditional_4_Template, 1, 0, "i", 66);
|
|
233
221
|
i0.ɵɵelementEnd();
|
|
234
222
|
} if (rf & 2) {
|
|
235
|
-
const
|
|
223
|
+
const field_r16 = ctx.$implicit;
|
|
236
224
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
237
|
-
i0.ɵɵclassProp("selected",
|
|
225
|
+
i0.ɵɵclassProp("selected", field_r16.name === ctx_r1.effectiveTimelineDateField);
|
|
238
226
|
i0.ɵɵadvance(3);
|
|
239
|
-
i0.ɵɵtextInterpolate(
|
|
227
|
+
i0.ɵɵtextInterpolate(field_r16.displayName);
|
|
240
228
|
i0.ɵɵadvance();
|
|
241
|
-
i0.ɵɵconditional(
|
|
229
|
+
i0.ɵɵconditional(field_r16.name === ctx_r1.effectiveTimelineDateField ? 4 : -1);
|
|
242
230
|
} }
|
|
243
|
-
function
|
|
231
|
+
function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
244
232
|
i0.ɵɵelementStart(0, "div", 58);
|
|
245
|
-
i0.ɵɵrepeaterCreate(1,
|
|
233
|
+
i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_9_For_2_Template, 5, 4, "div", 62, _forTrack1);
|
|
246
234
|
i0.ɵɵelementEnd();
|
|
247
235
|
} if (rf & 2) {
|
|
248
236
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
249
237
|
i0.ɵɵadvance();
|
|
250
238
|
i0.ɵɵrepeater(ctx_r1.availableDateFields);
|
|
251
239
|
} }
|
|
252
|
-
function
|
|
253
|
-
const
|
|
254
|
-
i0.ɵɵelementStart(0, "div", 51);
|
|
255
|
-
i0.ɵɵconditionalCreate(
|
|
256
|
-
i0.ɵɵelementStart(
|
|
257
|
-
i0.ɵɵlistener("click", function
|
|
258
|
-
i0.ɵɵelement(
|
|
259
|
-
i0.ɵɵelementStart(
|
|
260
|
-
i0.ɵɵtext(
|
|
240
|
+
function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
241
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
242
|
+
i0.ɵɵelementStart(0, "div", 43)(1, "div", 51);
|
|
243
|
+
i0.ɵɵconditionalCreate(2, DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_2_Template, 1, 0, "div", 52);
|
|
244
|
+
i0.ɵɵelementStart(3, "div", 53)(4, "button", 54);
|
|
245
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleDateFieldDropdown()); });
|
|
246
|
+
i0.ɵɵelement(5, "i", 55);
|
|
247
|
+
i0.ɵɵelementStart(6, "span", 56);
|
|
248
|
+
i0.ɵɵtext(7);
|
|
261
249
|
i0.ɵɵelementEnd();
|
|
262
|
-
i0.ɵɵconditionalCreate(
|
|
250
|
+
i0.ɵɵconditionalCreate(8, DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_8_Template, 1, 2, "i", 57);
|
|
263
251
|
i0.ɵɵelementEnd();
|
|
264
|
-
i0.ɵɵconditionalCreate(
|
|
252
|
+
i0.ɵɵconditionalCreate(9, DataExplorerDashboardComponent_Conditional_11_Conditional_0_Conditional_9_Template, 3, 0, "div", 58);
|
|
265
253
|
i0.ɵɵelementEnd()();
|
|
266
|
-
i0.ɵɵelementStart(
|
|
267
|
-
i0.ɵɵlistener("click", function
|
|
254
|
+
i0.ɵɵelementStart(10, "button", 59);
|
|
255
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleTimelineOrientation()); });
|
|
268
256
|
i0.ɵɵelement(11, "i");
|
|
269
|
-
i0.ɵɵelementEnd()
|
|
270
|
-
i0.ɵɵelementStart(12, "
|
|
271
|
-
i0.ɵɵlistener("click", function
|
|
272
|
-
i0.ɵɵelement(
|
|
257
|
+
i0.ɵɵelementEnd();
|
|
258
|
+
i0.ɵɵelementStart(12, "button", 59);
|
|
259
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Conditional_0_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleTimelineSortOrder()); });
|
|
260
|
+
i0.ɵɵelement(13, "i");
|
|
273
261
|
i0.ɵɵelementEnd()();
|
|
274
262
|
} if (rf & 2) {
|
|
275
263
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
276
|
-
i0.ɵɵadvance();
|
|
277
|
-
i0.ɵɵconditional(ctx_r1.isDateFieldDropdownOpen ?
|
|
264
|
+
i0.ɵɵadvance(2);
|
|
265
|
+
i0.ɵɵconditional(ctx_r1.isDateFieldDropdownOpen ? 2 : -1);
|
|
278
266
|
i0.ɵɵadvance(2);
|
|
279
267
|
i0.ɵɵclassProp("open", ctx_r1.isDateFieldDropdownOpen);
|
|
280
268
|
i0.ɵɵproperty("disabled", ctx_r1.availableDateFields.length <= 1);
|
|
281
269
|
i0.ɵɵadvance(3);
|
|
282
270
|
i0.ɵɵtextInterpolate(ctx_r1.effectiveTimelineDateFieldDisplayName);
|
|
283
271
|
i0.ɵɵadvance();
|
|
284
|
-
i0.ɵɵconditional(ctx_r1.availableDateFields.length > 1 ?
|
|
272
|
+
i0.ɵɵconditional(ctx_r1.availableDateFields.length > 1 ? 8 : -1);
|
|
273
|
+
i0.ɵɵadvance();
|
|
274
|
+
i0.ɵɵconditional(ctx_r1.isDateFieldDropdownOpen && ctx_r1.availableDateFields.length > 1 ? 9 : -1);
|
|
285
275
|
i0.ɵɵadvance();
|
|
286
|
-
i0.ɵɵconditional(ctx_r1.isDateFieldDropdownOpen && ctx_r1.availableDateFields.length > 1 ? 8 : -1);
|
|
287
|
-
i0.ɵɵadvance(2);
|
|
288
276
|
i0.ɵɵproperty("title", ctx_r1.state.timelineOrientation === "vertical" ? "Switch to Horizontal" : "Switch to Vertical");
|
|
289
277
|
i0.ɵɵadvance();
|
|
290
278
|
i0.ɵɵclassMap(ctx_r1.state.timelineOrientation === "vertical" ? "fa-solid fa-ellipsis-vertical" : "fa-solid fa-ellipsis");
|
|
291
|
-
i0.ɵɵadvance(
|
|
279
|
+
i0.ɵɵadvance();
|
|
292
280
|
i0.ɵɵproperty("title", ctx_r1.state.timelineSortOrder === "desc" ? "Showing Newest First (click for Oldest First)" : "Showing Oldest First (click for Newest First)");
|
|
293
281
|
i0.ɵɵadvance();
|
|
294
282
|
i0.ɵɵclassMap(ctx_r1.state.timelineSortOrder === "desc" ? "fa-solid fa-arrow-down-wide-short" : "fa-solid fa-arrow-up-wide-short");
|
|
295
283
|
} }
|
|
284
|
+
function DataExplorerDashboardComponent_Conditional_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
285
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
286
|
+
i0.ɵɵelementStart(0, "button", 67);
|
|
287
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onViewModeChanged("timeline")); });
|
|
288
|
+
i0.ɵɵelement(1, "i", 68);
|
|
289
|
+
i0.ɵɵelementEnd();
|
|
290
|
+
} if (rf & 2) {
|
|
291
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
292
|
+
i0.ɵɵclassProp("active", ctx_r1.state.viewMode === "timeline");
|
|
293
|
+
} }
|
|
294
|
+
function DataExplorerDashboardComponent_Conditional_11_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
295
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
296
|
+
i0.ɵɵelementStart(0, "button", 69);
|
|
297
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onViewModeChanged("map")); });
|
|
298
|
+
i0.ɵɵelement(1, "i", 70);
|
|
299
|
+
i0.ɵɵelementEnd();
|
|
300
|
+
} if (rf & 2) {
|
|
301
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
302
|
+
i0.ɵɵclassProp("active", ctx_r1.state.viewMode === "map");
|
|
303
|
+
} }
|
|
296
304
|
function DataExplorerDashboardComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
297
305
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
298
|
-
i0.ɵɵ
|
|
299
|
-
i0.ɵɵ
|
|
300
|
-
i0.ɵɵ
|
|
306
|
+
i0.ɵɵconditionalCreate(0, DataExplorerDashboardComponent_Conditional_11_Conditional_0_Template, 14, 13, "div", 43);
|
|
307
|
+
i0.ɵɵelementStart(1, "div", 44)(2, "button", 45);
|
|
308
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewModeChanged("grid")); });
|
|
309
|
+
i0.ɵɵelement(3, "i", 46);
|
|
301
310
|
i0.ɵɵelementEnd();
|
|
302
|
-
i0.ɵɵelementStart(
|
|
303
|
-
i0.ɵɵlistener("click", function
|
|
304
|
-
i0.ɵɵelement(
|
|
311
|
+
i0.ɵɵelementStart(4, "button", 47);
|
|
312
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_11_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewModeChanged("cards")); });
|
|
313
|
+
i0.ɵɵelement(5, "i", 48);
|
|
305
314
|
i0.ɵɵelementEnd();
|
|
306
|
-
i0.ɵɵconditionalCreate(
|
|
315
|
+
i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_11_Conditional_6_Template, 2, 2, "button", 49);
|
|
316
|
+
i0.ɵɵconditionalCreate(7, DataExplorerDashboardComponent_Conditional_11_Conditional_7_Template, 2, 2, "button", 50);
|
|
307
317
|
i0.ɵɵelementEnd();
|
|
308
|
-
i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_11_Conditional_6_Template, 15, 13);
|
|
309
318
|
} if (rf & 2) {
|
|
310
319
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
311
|
-
i0.ɵɵ
|
|
320
|
+
i0.ɵɵconditional(ctx_r1.state.viewMode === "timeline" && ctx_r1.entityHasDateFields ? 0 : -1);
|
|
321
|
+
i0.ɵɵadvance(2);
|
|
312
322
|
i0.ɵɵclassProp("active", ctx_r1.state.viewMode === "grid");
|
|
313
323
|
i0.ɵɵadvance(2);
|
|
314
324
|
i0.ɵɵclassProp("active", ctx_r1.state.viewMode === "cards");
|
|
315
325
|
i0.ɵɵadvance(2);
|
|
316
|
-
i0.ɵɵconditional(ctx_r1.entityHasDateFields ?
|
|
326
|
+
i0.ɵɵconditional(ctx_r1.entityHasDateFields ? 6 : -1);
|
|
317
327
|
i0.ɵɵadvance();
|
|
318
|
-
i0.ɵɵconditional(ctx_r1.
|
|
328
|
+
i0.ɵɵconditional((ctx_r1.selectedEntity == null ? null : ctx_r1.selectedEntity.SupportsGeoCoding) ? 7 : -1);
|
|
319
329
|
} }
|
|
320
330
|
function DataExplorerDashboardComponent_Conditional_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
321
|
-
i0.ɵɵelementStart(0, "span",
|
|
331
|
+
i0.ɵɵelementStart(0, "span", 73);
|
|
322
332
|
i0.ɵɵtext(1);
|
|
323
333
|
i0.ɵɵelementEnd();
|
|
324
334
|
} if (rf & 2) {
|
|
@@ -327,11 +337,11 @@ function DataExplorerDashboardComponent_Conditional_12_Conditional_2_Template(rf
|
|
|
327
337
|
i0.ɵɵtextInterpolate(ctx_r1.recentRecords.length + ctx_r1.favoriteRecords.length);
|
|
328
338
|
} }
|
|
329
339
|
function DataExplorerDashboardComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
330
|
-
const
|
|
331
|
-
i0.ɵɵelementStart(0, "button",
|
|
332
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
333
|
-
i0.ɵɵelement(1, "i",
|
|
334
|
-
i0.ɵɵconditionalCreate(2, DataExplorerDashboardComponent_Conditional_12_Conditional_2_Template, 2, 1, "span",
|
|
340
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
341
|
+
i0.ɵɵelementStart(0, "button", 71);
|
|
342
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessPanel()); });
|
|
343
|
+
i0.ɵɵelement(1, "i", 72);
|
|
344
|
+
i0.ɵɵconditionalCreate(2, DataExplorerDashboardComponent_Conditional_12_Conditional_2_Template, 2, 1, "span", 73);
|
|
335
345
|
i0.ɵɵelementEnd();
|
|
336
346
|
} if (rf & 2) {
|
|
337
347
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -340,19 +350,19 @@ function DataExplorerDashboardComponent_Conditional_12_Template(rf, ctx) { if (r
|
|
|
340
350
|
i0.ɵɵconditional(ctx_r1.recentRecords.length + ctx_r1.favoriteRecords.length > 0 ? 2 : -1);
|
|
341
351
|
} }
|
|
342
352
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
343
|
-
i0.ɵɵelementStart(0, "div",
|
|
344
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
353
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
354
|
+
i0.ɵɵelement(1, "mj-loading", 75);
|
|
345
355
|
i0.ɵɵelementEnd();
|
|
346
356
|
} }
|
|
347
357
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
348
|
-
const
|
|
349
|
-
i0.ɵɵelementStart(0, "button",
|
|
350
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
358
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
359
|
+
i0.ɵɵelementStart(0, "button", 107);
|
|
360
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.entityFilterText = ""); });
|
|
351
361
|
i0.ɵɵelement(1, "i", 42);
|
|
352
362
|
i0.ɵɵelementEnd();
|
|
353
363
|
} }
|
|
354
364
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
355
|
-
i0.ɵɵelementStart(0, "span",
|
|
365
|
+
i0.ɵɵelementStart(0, "span", 82);
|
|
356
366
|
i0.ɵɵtext(1, "/");
|
|
357
367
|
i0.ɵɵelementEnd();
|
|
358
368
|
} }
|
|
@@ -363,49 +373,49 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional
|
|
|
363
373
|
i0.ɵɵtextInterpolate1(" across ", ctx_r1.applicationCount, " applications ");
|
|
364
374
|
} }
|
|
365
375
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
366
|
-
i0.ɵɵelementStart(0, "span",
|
|
376
|
+
i0.ɵɵelementStart(0, "span", 113);
|
|
367
377
|
i0.ɵɵtext(1);
|
|
368
378
|
i0.ɵɵelementEnd();
|
|
369
379
|
} if (rf & 2) {
|
|
370
|
-
const
|
|
380
|
+
const entity_r23 = i0.ɵɵnextContext().$implicit;
|
|
371
381
|
i0.ɵɵadvance();
|
|
372
|
-
i0.ɵɵtextInterpolate(
|
|
382
|
+
i0.ɵɵtextInterpolate(entity_r23.Description);
|
|
373
383
|
} }
|
|
374
384
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
375
|
-
const
|
|
376
|
-
i0.ɵɵelementStart(0, "div",
|
|
377
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template_div_click_0_listener() { const
|
|
378
|
-
i0.ɵɵelementStart(1, "div",
|
|
385
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
386
|
+
i0.ɵɵelementStart(0, "div", 109);
|
|
387
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template_div_click_0_listener() { const entity_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r23)); });
|
|
388
|
+
i0.ɵɵelementStart(1, "div", 110);
|
|
379
389
|
i0.ɵɵelement(2, "i");
|
|
380
390
|
i0.ɵɵelementEnd();
|
|
381
|
-
i0.ɵɵelementStart(3, "div",
|
|
391
|
+
i0.ɵɵelementStart(3, "div", 111)(4, "span", 112);
|
|
382
392
|
i0.ɵɵtext(5);
|
|
383
393
|
i0.ɵɵelementEnd();
|
|
384
|
-
i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Conditional_6_Template, 2, 1, "span",
|
|
394
|
+
i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Conditional_6_Template, 2, 1, "span", 113);
|
|
385
395
|
i0.ɵɵelementEnd();
|
|
386
|
-
i0.ɵɵelementStart(7, "button",
|
|
387
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template_button_click_7_listener($event) { const
|
|
396
|
+
i0.ɵɵelementStart(7, "button", 114);
|
|
397
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template_button_click_7_listener($event) { const entity_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleEntityFavorite(entity_r23, $event)); });
|
|
388
398
|
i0.ɵɵelement(8, "i");
|
|
389
399
|
i0.ɵɵelementEnd()();
|
|
390
400
|
} if (rf & 2) {
|
|
391
|
-
const
|
|
401
|
+
const entity_r23 = ctx.$implicit;
|
|
392
402
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
393
|
-
i0.ɵɵproperty("title",
|
|
403
|
+
i0.ɵɵproperty("title", entity_r23.Description || entity_r23.DisplayNameOrName);
|
|
394
404
|
i0.ɵɵadvance(2);
|
|
395
|
-
i0.ɵɵclassMap(ctx_r1.getEntityIcon(
|
|
405
|
+
i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r23));
|
|
396
406
|
i0.ɵɵadvance(3);
|
|
397
|
-
i0.ɵɵtextInterpolate(
|
|
407
|
+
i0.ɵɵtextInterpolate(entity_r23.DisplayNameOrName);
|
|
398
408
|
i0.ɵɵadvance();
|
|
399
|
-
i0.ɵɵconditional(
|
|
409
|
+
i0.ɵɵconditional(entity_r23.Description ? 6 : -1);
|
|
400
410
|
i0.ɵɵadvance();
|
|
401
|
-
i0.ɵɵclassProp("favorited", ctx_r1.isEntityFavorited(
|
|
402
|
-
i0.ɵɵproperty("title", ctx_r1.isEntityFavorited(
|
|
411
|
+
i0.ɵɵclassProp("favorited", ctx_r1.isEntityFavorited(entity_r23));
|
|
412
|
+
i0.ɵɵproperty("title", ctx_r1.isEntityFavorited(entity_r23) ? "Remove from favorites" : "Add to favorites");
|
|
403
413
|
i0.ɵɵadvance();
|
|
404
|
-
i0.ɵɵclassMap(ctx_r1.isEntityFavorited(
|
|
414
|
+
i0.ɵɵclassMap(ctx_r1.isEntityFavorited(entity_r23) ? "fa-solid fa-star" : "fa-regular fa-star");
|
|
405
415
|
} }
|
|
406
416
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
407
|
-
i0.ɵɵelementStart(0, "div",
|
|
408
|
-
i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template, 9, 10, "div",
|
|
417
|
+
i0.ɵɵelementStart(0, "div", 89);
|
|
418
|
+
i0.ɵɵrepeaterCreate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_For_2_Template, 9, 10, "div", 108, _forTrack3);
|
|
409
419
|
i0.ɵɵelementEnd();
|
|
410
420
|
} if (rf & 2) {
|
|
411
421
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -413,96 +423,96 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional
|
|
|
413
423
|
i0.ɵɵrepeater(ctx_r1.flatFilteredEntities);
|
|
414
424
|
} }
|
|
415
425
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
416
|
-
i0.ɵɵelementStart(0, "span",
|
|
426
|
+
i0.ɵɵelementStart(0, "span", 113);
|
|
417
427
|
i0.ɵɵtext(1);
|
|
418
428
|
i0.ɵɵelementEnd();
|
|
419
429
|
} if (rf & 2) {
|
|
420
|
-
const
|
|
430
|
+
const entity_r27 = i0.ɵɵnextContext().$implicit;
|
|
421
431
|
i0.ɵɵadvance();
|
|
422
|
-
i0.ɵɵtextInterpolate(
|
|
432
|
+
i0.ɵɵtextInterpolate(entity_r27.Description);
|
|
423
433
|
} }
|
|
424
434
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
425
|
-
const
|
|
426
|
-
i0.ɵɵelementStart(0, "div",
|
|
427
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template_div_click_0_listener() { const
|
|
428
|
-
i0.ɵɵelementStart(1, "div",
|
|
435
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
436
|
+
i0.ɵɵelementStart(0, "div", 109);
|
|
437
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template_div_click_0_listener() { const entity_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r27)); });
|
|
438
|
+
i0.ɵɵelementStart(1, "div", 110);
|
|
429
439
|
i0.ɵɵelement(2, "i");
|
|
430
440
|
i0.ɵɵelementEnd();
|
|
431
|
-
i0.ɵɵelementStart(3, "div",
|
|
441
|
+
i0.ɵɵelementStart(3, "div", 111)(4, "span", 112);
|
|
432
442
|
i0.ɵɵtext(5);
|
|
433
443
|
i0.ɵɵelementEnd();
|
|
434
|
-
i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Conditional_6_Template, 2, 1, "span",
|
|
444
|
+
i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Conditional_6_Template, 2, 1, "span", 113);
|
|
435
445
|
i0.ɵɵelementEnd();
|
|
436
|
-
i0.ɵɵelementStart(7, "button",
|
|
437
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template_button_click_7_listener($event) { const
|
|
446
|
+
i0.ɵɵelementStart(7, "button", 114);
|
|
447
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template_button_click_7_listener($event) { const entity_r27 = i0.ɵɵrestoreView(_r26).$implicit; const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.toggleEntityFavorite(entity_r27, $event)); });
|
|
438
448
|
i0.ɵɵelement(8, "i");
|
|
439
449
|
i0.ɵɵelementEnd()();
|
|
440
450
|
} if (rf & 2) {
|
|
441
|
-
const
|
|
451
|
+
const entity_r27 = ctx.$implicit;
|
|
442
452
|
const ctx_r1 = i0.ɵɵnextContext(6);
|
|
443
|
-
i0.ɵɵproperty("title",
|
|
453
|
+
i0.ɵɵproperty("title", entity_r27.Description || entity_r27.DisplayNameOrName);
|
|
444
454
|
i0.ɵɵadvance(2);
|
|
445
|
-
i0.ɵɵclassMap(ctx_r1.getEntityIcon(
|
|
455
|
+
i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r27));
|
|
446
456
|
i0.ɵɵadvance(3);
|
|
447
|
-
i0.ɵɵtextInterpolate(
|
|
457
|
+
i0.ɵɵtextInterpolate(entity_r27.DisplayNameOrName);
|
|
448
458
|
i0.ɵɵadvance();
|
|
449
|
-
i0.ɵɵconditional(
|
|
459
|
+
i0.ɵɵconditional(entity_r27.Description ? 6 : -1);
|
|
450
460
|
i0.ɵɵadvance();
|
|
451
|
-
i0.ɵɵclassProp("favorited", ctx_r1.isEntityFavorited(
|
|
452
|
-
i0.ɵɵproperty("title", ctx_r1.isEntityFavorited(
|
|
461
|
+
i0.ɵɵclassProp("favorited", ctx_r1.isEntityFavorited(entity_r27));
|
|
462
|
+
i0.ɵɵproperty("title", ctx_r1.isEntityFavorited(entity_r27) ? "Remove from favorites" : "Add to favorites");
|
|
453
463
|
i0.ɵɵadvance();
|
|
454
|
-
i0.ɵɵclassMap(ctx_r1.isEntityFavorited(
|
|
464
|
+
i0.ɵɵclassMap(ctx_r1.isEntityFavorited(entity_r27) ? "fa-solid fa-star" : "fa-regular fa-star");
|
|
455
465
|
} }
|
|
456
466
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
457
|
-
i0.ɵɵelementStart(0, "div",
|
|
458
|
-
i0.ɵɵrepeaterCreate(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template, 9, 10, "div",
|
|
467
|
+
i0.ɵɵelementStart(0, "div", 121)(1, "div", 89);
|
|
468
|
+
i0.ɵɵrepeaterCreate(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_For_3_Template, 9, 10, "div", 108, _forTrack3);
|
|
459
469
|
i0.ɵɵelementEnd()();
|
|
460
470
|
} if (rf & 2) {
|
|
461
|
-
const
|
|
471
|
+
const group_r25 = i0.ɵɵnextContext().$implicit;
|
|
462
472
|
i0.ɵɵadvance(2);
|
|
463
|
-
i0.ɵɵrepeater(
|
|
473
|
+
i0.ɵɵrepeater(group_r25.entities);
|
|
464
474
|
} }
|
|
465
475
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
466
|
-
const
|
|
467
|
-
i0.ɵɵelementStart(0, "div",
|
|
468
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Template_div_click_1_listener() { const
|
|
469
|
-
i0.ɵɵelementStart(2, "div",
|
|
476
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
477
|
+
i0.ɵɵelementStart(0, "div", 115)(1, "div", 116);
|
|
478
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Template_div_click_1_listener() { const group_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleAppGroup(group_r25.applicationId)); });
|
|
479
|
+
i0.ɵɵelementStart(2, "div", 117);
|
|
470
480
|
i0.ɵɵelement(3, "i");
|
|
471
481
|
i0.ɵɵelementEnd();
|
|
472
|
-
i0.ɵɵelementStart(4, "span",
|
|
482
|
+
i0.ɵɵelementStart(4, "span", 118);
|
|
473
483
|
i0.ɵɵtext(5);
|
|
474
484
|
i0.ɵɵelementEnd();
|
|
475
|
-
i0.ɵɵelementStart(6, "span",
|
|
485
|
+
i0.ɵɵelementStart(6, "span", 119);
|
|
476
486
|
i0.ɵɵtext(7);
|
|
477
487
|
i0.ɵɵelementEnd();
|
|
478
|
-
i0.ɵɵelement(8, "i",
|
|
488
|
+
i0.ɵɵelement(8, "i", 120);
|
|
479
489
|
i0.ɵɵelementEnd();
|
|
480
|
-
i0.ɵɵconditionalCreate(9, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_Template, 4, 0, "div",
|
|
490
|
+
i0.ɵɵconditionalCreate(9, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Conditional_9_Template, 4, 0, "div", 121);
|
|
481
491
|
i0.ɵɵelementEnd();
|
|
482
492
|
} if (rf & 2) {
|
|
483
|
-
const
|
|
493
|
+
const group_r25 = ctx.$implicit;
|
|
484
494
|
i0.ɵɵadvance(2);
|
|
485
|
-
i0.ɵɵstyleProp("background",
|
|
495
|
+
i0.ɵɵstyleProp("background", group_r25.applicationColor ? group_r25.applicationColor + "15" : null)("color", group_r25.applicationColor || null);
|
|
486
496
|
i0.ɵɵadvance();
|
|
487
|
-
i0.ɵɵclassMap(
|
|
497
|
+
i0.ɵɵclassMap(group_r25.applicationIcon || "fa-solid fa-folder");
|
|
488
498
|
i0.ɵɵadvance(2);
|
|
489
|
-
i0.ɵɵtextInterpolate(
|
|
499
|
+
i0.ɵɵtextInterpolate(group_r25.applicationName);
|
|
490
500
|
i0.ɵɵadvance(2);
|
|
491
|
-
i0.ɵɵtextInterpolate(
|
|
501
|
+
i0.ɵɵtextInterpolate(group_r25.entities.length);
|
|
492
502
|
i0.ɵɵadvance();
|
|
493
|
-
i0.ɵɵclassProp("expanded",
|
|
503
|
+
i0.ɵɵclassProp("expanded", group_r25.isExpanded);
|
|
494
504
|
i0.ɵɵadvance();
|
|
495
|
-
i0.ɵɵconditional(
|
|
505
|
+
i0.ɵɵconditional(group_r25.isExpanded ? 9 : -1);
|
|
496
506
|
} }
|
|
497
507
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
498
|
-
i0.ɵɵrepeaterCreate(0, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Template, 10, 11, "div",
|
|
508
|
+
i0.ɵɵrepeaterCreate(0, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_For_1_Template, 10, 11, "div", 115, _forTrack5);
|
|
499
509
|
} if (rf & 2) {
|
|
500
510
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
501
511
|
i0.ɵɵrepeater(ctx_r1.filteredAppEntityGroups);
|
|
502
512
|
} }
|
|
503
513
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
504
|
-
i0.ɵɵelementStart(0, "div",
|
|
505
|
-
i0.ɵɵelement(1, "i",
|
|
514
|
+
i0.ɵɵelementStart(0, "div", 90);
|
|
515
|
+
i0.ɵɵelement(1, "i", 122);
|
|
506
516
|
i0.ɵɵelementStart(2, "p");
|
|
507
517
|
i0.ɵɵtext(3);
|
|
508
518
|
i0.ɵɵelementEnd()();
|
|
@@ -512,8 +522,8 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional
|
|
|
512
522
|
i0.ɵɵtextInterpolate1("No entities match \"", ctx_r1.entityFilterText, "\"");
|
|
513
523
|
} }
|
|
514
524
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
515
|
-
i0.ɵɵelementStart(0, "div",
|
|
516
|
-
i0.ɵɵelement(1, "i",
|
|
525
|
+
i0.ɵɵelementStart(0, "div", 91);
|
|
526
|
+
i0.ɵɵelement(1, "i", 123);
|
|
517
527
|
i0.ɵɵelementStart(2, "h3");
|
|
518
528
|
i0.ɵɵtext(3, "No Entities Available");
|
|
519
529
|
i0.ɵɵelementEnd();
|
|
@@ -522,167 +532,167 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional
|
|
|
522
532
|
i0.ɵɵelementEnd()();
|
|
523
533
|
} }
|
|
524
534
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_40_Template(rf, ctx) { if (rf & 1) {
|
|
525
|
-
const
|
|
526
|
-
i0.ɵɵelementStart(0, "div",
|
|
527
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_40_Template_div_click_0_listener() { const
|
|
528
|
-
i0.ɵɵelementStart(1, "div",
|
|
535
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
536
|
+
i0.ɵɵelementStart(0, "div", 124);
|
|
537
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_40_Template_div_click_0_listener() { const record_r29 = i0.ɵɵrestoreView(_r28).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRecentRecordClick(record_r29)); });
|
|
538
|
+
i0.ɵɵelementStart(1, "div", 125);
|
|
529
539
|
i0.ɵɵelement(2, "i");
|
|
530
540
|
i0.ɵɵelementEnd();
|
|
531
|
-
i0.ɵɵelementStart(3, "div",
|
|
541
|
+
i0.ɵɵelementStart(3, "div", 126)(4, "div", 127);
|
|
532
542
|
i0.ɵɵtext(5);
|
|
533
543
|
i0.ɵɵelementEnd();
|
|
534
|
-
i0.ɵɵelementStart(6, "div",
|
|
544
|
+
i0.ɵɵelementStart(6, "div", 128);
|
|
535
545
|
i0.ɵɵtext(7);
|
|
536
546
|
i0.ɵɵelementEnd()();
|
|
537
|
-
i0.ɵɵelementStart(8, "span",
|
|
547
|
+
i0.ɵɵelementStart(8, "span", 129);
|
|
538
548
|
i0.ɵɵtext(9);
|
|
539
549
|
i0.ɵɵelementEnd()();
|
|
540
550
|
} if (rf & 2) {
|
|
541
|
-
const
|
|
551
|
+
const record_r29 = ctx.$implicit;
|
|
542
552
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
543
553
|
i0.ɵɵadvance(2);
|
|
544
|
-
i0.ɵɵclassMap(ctx_r1.getEntityIconById(
|
|
554
|
+
i0.ɵɵclassMap(ctx_r1.getEntityIconById(record_r29.entityId));
|
|
545
555
|
i0.ɵɵadvance(3);
|
|
546
|
-
i0.ɵɵtextInterpolate(
|
|
556
|
+
i0.ɵɵtextInterpolate(record_r29.recordName || record_r29.recordId);
|
|
547
557
|
i0.ɵɵadvance(2);
|
|
548
|
-
i0.ɵɵtextInterpolate(
|
|
558
|
+
i0.ɵɵtextInterpolate(record_r29.entityName);
|
|
549
559
|
i0.ɵɵadvance(2);
|
|
550
|
-
i0.ɵɵtextInterpolate(ctx_r1.formatRelativeTime(
|
|
560
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatRelativeTime(record_r29.latestAt));
|
|
551
561
|
} }
|
|
552
562
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_41_Template(rf, ctx) { if (rf & 1) {
|
|
553
|
-
i0.ɵɵelementStart(0, "div",
|
|
563
|
+
i0.ɵɵelementStart(0, "div", 104);
|
|
554
564
|
i0.ɵɵtext(1, "No recent records");
|
|
555
565
|
i0.ɵɵelementEnd();
|
|
556
566
|
} }
|
|
557
567
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_52_Template(rf, ctx) { if (rf & 1) {
|
|
558
|
-
const
|
|
559
|
-
i0.ɵɵelementStart(0, "div",
|
|
560
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_52_Template_div_click_0_listener() { const
|
|
561
|
-
i0.ɵɵelementStart(1, "div",
|
|
568
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
569
|
+
i0.ɵɵelementStart(0, "div", 124);
|
|
570
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_52_Template_div_click_0_listener() { const entity_r31 = i0.ɵɵrestoreView(_r30).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onEntitySelected(entity_r31)); });
|
|
571
|
+
i0.ɵɵelementStart(1, "div", 125);
|
|
562
572
|
i0.ɵɵelement(2, "i");
|
|
563
573
|
i0.ɵɵelementEnd();
|
|
564
|
-
i0.ɵɵelementStart(3, "div",
|
|
574
|
+
i0.ɵɵelementStart(3, "div", 126)(4, "div", 127);
|
|
565
575
|
i0.ɵɵtext(5);
|
|
566
576
|
i0.ɵɵelementEnd()()();
|
|
567
577
|
} if (rf & 2) {
|
|
568
|
-
const
|
|
578
|
+
const entity_r31 = ctx.$implicit;
|
|
569
579
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
570
580
|
i0.ɵɵadvance(2);
|
|
571
|
-
i0.ɵɵclassMap(ctx_r1.getEntityIcon(
|
|
581
|
+
i0.ɵɵclassMap(ctx_r1.getEntityIcon(entity_r31));
|
|
572
582
|
i0.ɵɵadvance(3);
|
|
573
|
-
i0.ɵɵtextInterpolate(
|
|
583
|
+
i0.ɵɵtextInterpolate(entity_r31.DisplayNameOrName);
|
|
574
584
|
} }
|
|
575
585
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
576
|
-
i0.ɵɵelementStart(0, "div",
|
|
586
|
+
i0.ɵɵelementStart(0, "div", 104);
|
|
577
587
|
i0.ɵɵtext(1, "No recent entities");
|
|
578
588
|
i0.ɵɵelementEnd();
|
|
579
589
|
} }
|
|
580
590
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_64_Template(rf, ctx) { if (rf & 1) {
|
|
581
|
-
const
|
|
582
|
-
i0.ɵɵelementStart(0, "div",
|
|
583
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_64_Template_div_click_0_listener() { const
|
|
584
|
-
i0.ɵɵelementStart(1, "div",
|
|
591
|
+
const _r32 = i0.ɵɵgetCurrentView();
|
|
592
|
+
i0.ɵɵelementStart(0, "div", 124);
|
|
593
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_64_Template_div_click_0_listener() { const record_r33 = i0.ɵɵrestoreView(_r32).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onFavoriteRecordClick(record_r33)); });
|
|
594
|
+
i0.ɵɵelementStart(1, "div", 125);
|
|
585
595
|
i0.ɵɵelement(2, "i");
|
|
586
596
|
i0.ɵɵelementEnd();
|
|
587
|
-
i0.ɵɵelementStart(3, "div",
|
|
597
|
+
i0.ɵɵelementStart(3, "div", 126)(4, "div", 127);
|
|
588
598
|
i0.ɵɵtext(5);
|
|
589
599
|
i0.ɵɵelementEnd();
|
|
590
|
-
i0.ɵɵelementStart(6, "div",
|
|
600
|
+
i0.ɵɵelementStart(6, "div", 128);
|
|
591
601
|
i0.ɵɵtext(7);
|
|
592
602
|
i0.ɵɵelementEnd()()();
|
|
593
603
|
} if (rf & 2) {
|
|
594
|
-
const
|
|
604
|
+
const record_r33 = ctx.$implicit;
|
|
595
605
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
596
606
|
i0.ɵɵadvance(2);
|
|
597
|
-
i0.ɵɵclassMap(ctx_r1.getEntityIconById(
|
|
607
|
+
i0.ɵɵclassMap(ctx_r1.getEntityIconById(record_r33.entityId));
|
|
598
608
|
i0.ɵɵadvance(3);
|
|
599
|
-
i0.ɵɵtextInterpolate(
|
|
609
|
+
i0.ɵɵtextInterpolate(record_r33.recordName || record_r33.recordId);
|
|
600
610
|
i0.ɵɵadvance(2);
|
|
601
|
-
i0.ɵɵtextInterpolate(
|
|
611
|
+
i0.ɵɵtextInterpolate(record_r33.entityName);
|
|
602
612
|
} }
|
|
603
613
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_65_Template(rf, ctx) { if (rf & 1) {
|
|
604
|
-
i0.ɵɵelementStart(0, "div",
|
|
614
|
+
i0.ɵɵelementStart(0, "div", 104);
|
|
605
615
|
i0.ɵɵtext(1, "No favorite records");
|
|
606
616
|
i0.ɵɵelementEnd();
|
|
607
617
|
} }
|
|
608
618
|
function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
609
|
-
const
|
|
610
|
-
i0.ɵɵelementStart(0, "div",
|
|
611
|
-
i0.ɵɵelement(3, "i",
|
|
612
|
-
i0.ɵɵelementStart(4, "input",
|
|
613
|
-
i0.ɵɵtwoWayListener("ngModelChange", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(
|
|
619
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
620
|
+
i0.ɵɵelementStart(0, "div", 76)(1, "div", 77)(2, "div", 78);
|
|
621
|
+
i0.ɵɵelement(3, "i", 79);
|
|
622
|
+
i0.ɵɵelementStart(4, "input", 80, 0);
|
|
623
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.entityFilterText, $event) || (ctx_r1.entityFilterText = $event); return i0.ɵɵresetView($event); });
|
|
614
624
|
i0.ɵɵelementEnd();
|
|
615
|
-
i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template, 2, 0, "button",
|
|
625
|
+
i0.ɵɵconditionalCreate(6, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_6_Template, 2, 0, "button", 81)(7, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_7_Template, 2, 0, "span", 82);
|
|
616
626
|
i0.ɵɵelementEnd();
|
|
617
|
-
i0.ɵɵelementStart(8, "div",
|
|
627
|
+
i0.ɵɵelementStart(8, "div", 83)(9, "span", 84);
|
|
618
628
|
i0.ɵɵtext(10);
|
|
619
629
|
i0.ɵɵconditionalCreate(11, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_11_Template, 1, 1);
|
|
620
630
|
i0.ɵɵelementEnd();
|
|
621
|
-
i0.ɵɵelementStart(12, "div",
|
|
622
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_13_listener() { i0.ɵɵrestoreView(
|
|
631
|
+
i0.ɵɵelementStart(12, "div", 85)(13, "button", 86);
|
|
632
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.setHomeViewMode("all")); });
|
|
623
633
|
i0.ɵɵtext(14, " All Entities ");
|
|
624
634
|
i0.ɵɵelementEnd();
|
|
625
|
-
i0.ɵɵelementStart(15, "button",
|
|
626
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(
|
|
627
|
-
i0.ɵɵelement(16, "i",
|
|
635
|
+
i0.ɵɵelementStart(15, "button", 86);
|
|
636
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.setHomeViewMode("favorites")); });
|
|
637
|
+
i0.ɵɵelement(16, "i", 87);
|
|
628
638
|
i0.ɵɵtext(17, " My Favorites ");
|
|
629
639
|
i0.ɵɵelementEnd()()()();
|
|
630
|
-
i0.ɵɵelementStart(18, "div",
|
|
631
|
-
i0.ɵɵconditionalCreate(19, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_Template, 3, 0, "div",
|
|
632
|
-
i0.ɵɵconditionalCreate(21, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_21_Template, 4, 1, "div",
|
|
633
|
-
i0.ɵɵconditionalCreate(22, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_22_Template, 6, 0, "div",
|
|
640
|
+
i0.ɵɵelementStart(18, "div", 88);
|
|
641
|
+
i0.ɵɵconditionalCreate(19, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_19_Template, 3, 0, "div", 89)(20, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_20_Template, 2, 0);
|
|
642
|
+
i0.ɵɵconditionalCreate(21, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_21_Template, 4, 1, "div", 90);
|
|
643
|
+
i0.ɵɵconditionalCreate(22, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_22_Template, 6, 0, "div", 91);
|
|
634
644
|
i0.ɵɵelementEnd()();
|
|
635
|
-
i0.ɵɵelementStart(23, "div",
|
|
645
|
+
i0.ɵɵelementStart(23, "div", 92)(24, "div", 93)(25, "h3");
|
|
636
646
|
i0.ɵɵtext(26, "Quick Access");
|
|
637
647
|
i0.ɵɵelementEnd();
|
|
638
|
-
i0.ɵɵelementStart(27, "button",
|
|
639
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_27_listener() { i0.ɵɵrestoreView(
|
|
640
|
-
i0.ɵɵelement(28, "i",
|
|
648
|
+
i0.ɵɵelementStart(27, "button", 94);
|
|
649
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_button_click_27_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessPanel()); });
|
|
650
|
+
i0.ɵɵelement(28, "i", 95);
|
|
641
651
|
i0.ɵɵelementEnd()();
|
|
642
|
-
i0.ɵɵelementStart(29, "div",
|
|
643
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_div_click_31_listener() { i0.ɵɵrestoreView(
|
|
644
|
-
i0.ɵɵelement(32, "i",
|
|
652
|
+
i0.ɵɵelementStart(29, "div", 96)(30, "div", 97)(31, "div", 98);
|
|
653
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_div_click_31_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("recentRecords")); });
|
|
654
|
+
i0.ɵɵelement(32, "i", 99);
|
|
645
655
|
i0.ɵɵelementStart(33, "span");
|
|
646
656
|
i0.ɵɵtext(34, "Recent Records");
|
|
647
657
|
i0.ɵɵelementEnd();
|
|
648
|
-
i0.ɵɵelementStart(35, "span",
|
|
658
|
+
i0.ɵɵelementStart(35, "span", 100);
|
|
649
659
|
i0.ɵɵtext(36);
|
|
650
660
|
i0.ɵɵelementEnd();
|
|
651
|
-
i0.ɵɵelement(37, "i",
|
|
661
|
+
i0.ɵɵelement(37, "i", 101);
|
|
652
662
|
i0.ɵɵelementEnd();
|
|
653
|
-
i0.ɵɵelementStart(38, "div",
|
|
654
|
-
i0.ɵɵrepeaterCreate(39, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_40_Template, 10, 5, "div",
|
|
655
|
-
i0.ɵɵconditionalCreate(41, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_41_Template, 2, 0, "div",
|
|
663
|
+
i0.ɵɵelementStart(38, "div", 102);
|
|
664
|
+
i0.ɵɵrepeaterCreate(39, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_40_Template, 10, 5, "div", 103, _forTrack2);
|
|
665
|
+
i0.ɵɵconditionalCreate(41, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_41_Template, 2, 0, "div", 104);
|
|
656
666
|
i0.ɵɵelementEnd()();
|
|
657
|
-
i0.ɵɵelementStart(42, "div",
|
|
658
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_div_click_43_listener() { i0.ɵɵrestoreView(
|
|
659
|
-
i0.ɵɵelement(44, "i",
|
|
667
|
+
i0.ɵɵelementStart(42, "div", 97)(43, "div", 98);
|
|
668
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_div_click_43_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("recentEntities")); });
|
|
669
|
+
i0.ɵɵelement(44, "i", 105);
|
|
660
670
|
i0.ɵɵelementStart(45, "span");
|
|
661
671
|
i0.ɵɵtext(46, "Recent Entities");
|
|
662
672
|
i0.ɵɵelementEnd();
|
|
663
|
-
i0.ɵɵelementStart(47, "span",
|
|
673
|
+
i0.ɵɵelementStart(47, "span", 100);
|
|
664
674
|
i0.ɵɵtext(48);
|
|
665
675
|
i0.ɵɵelementEnd();
|
|
666
|
-
i0.ɵɵelement(49, "i",
|
|
676
|
+
i0.ɵɵelement(49, "i", 101);
|
|
667
677
|
i0.ɵɵelementEnd();
|
|
668
|
-
i0.ɵɵelementStart(50, "div",
|
|
669
|
-
i0.ɵɵrepeaterCreate(51, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_52_Template, 6, 3, "div",
|
|
670
|
-
i0.ɵɵconditionalCreate(53, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_53_Template, 2, 0, "div",
|
|
678
|
+
i0.ɵɵelementStart(50, "div", 102);
|
|
679
|
+
i0.ɵɵrepeaterCreate(51, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_52_Template, 6, 3, "div", 103, _forTrack3);
|
|
680
|
+
i0.ɵɵconditionalCreate(53, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_53_Template, 2, 0, "div", 104);
|
|
671
681
|
i0.ɵɵelementEnd()();
|
|
672
|
-
i0.ɵɵelementStart(54, "div",
|
|
673
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_div_click_55_listener() { i0.ɵɵrestoreView(
|
|
674
|
-
i0.ɵɵelement(56, "i",
|
|
682
|
+
i0.ɵɵelementStart(54, "div", 97)(55, "div", 98);
|
|
683
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template_div_click_55_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleQuickAccessSection("favoriteRecords")); });
|
|
684
|
+
i0.ɵɵelement(56, "i", 106);
|
|
675
685
|
i0.ɵɵelementStart(57, "span");
|
|
676
686
|
i0.ɵɵtext(58, "Favorite Records");
|
|
677
687
|
i0.ɵɵelementEnd();
|
|
678
|
-
i0.ɵɵelementStart(59, "span",
|
|
688
|
+
i0.ɵɵelementStart(59, "span", 100);
|
|
679
689
|
i0.ɵɵtext(60);
|
|
680
690
|
i0.ɵɵelementEnd();
|
|
681
|
-
i0.ɵɵelement(61, "i",
|
|
691
|
+
i0.ɵɵelement(61, "i", 101);
|
|
682
692
|
i0.ɵɵelementEnd();
|
|
683
|
-
i0.ɵɵelementStart(62, "div",
|
|
684
|
-
i0.ɵɵrepeaterCreate(63, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_64_Template, 8, 4, "div",
|
|
685
|
-
i0.ɵɵconditionalCreate(65, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_65_Template, 2, 0, "div",
|
|
693
|
+
i0.ɵɵelementStart(62, "div", 102);
|
|
694
|
+
i0.ɵɵrepeaterCreate(63, DataExplorerDashboardComponent_Conditional_14_Conditional_2_For_64_Template, 8, 4, "div", 103, _forTrack4);
|
|
695
|
+
i0.ɵɵconditionalCreate(65, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Conditional_65_Template, 2, 0, "div", 104);
|
|
686
696
|
i0.ɵɵelementEnd()()()();
|
|
687
697
|
} if (rf & 2) {
|
|
688
698
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -734,7 +744,7 @@ function DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template(rf
|
|
|
734
744
|
} }
|
|
735
745
|
function DataExplorerDashboardComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
736
746
|
i0.ɵɵelementStart(0, "div", 13);
|
|
737
|
-
i0.ɵɵconditionalCreate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_1_Template, 2, 0, "div",
|
|
747
|
+
i0.ɵɵconditionalCreate(1, DataExplorerDashboardComponent_Conditional_14_Conditional_1_Template, 2, 0, "div", 74)(2, DataExplorerDashboardComponent_Conditional_14_Conditional_2_Template, 66, 27);
|
|
738
748
|
i0.ɵɵelementEnd();
|
|
739
749
|
} if (rf & 2) {
|
|
740
750
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -742,24 +752,24 @@ function DataExplorerDashboardComponent_Conditional_14_Template(rf, ctx) { if (r
|
|
|
742
752
|
i0.ɵɵconditional(ctx_r1.isLoadingEntities ? 1 : 2);
|
|
743
753
|
} }
|
|
744
754
|
function DataExplorerDashboardComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
745
|
-
const
|
|
746
|
-
i0.ɵɵelementStart(0, "mj-entity-viewer",
|
|
747
|
-
i0.ɵɵlistener("viewModeChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_viewModeChange_0_listener($event) { i0.ɵɵrestoreView(
|
|
755
|
+
const _r34 = i0.ɵɵgetCurrentView();
|
|
756
|
+
i0.ɵɵelementStart(0, "mj-entity-viewer", 130, 1);
|
|
757
|
+
i0.ɵɵlistener("viewModeChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_viewModeChange_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewModeChanged($event)); })("filterTextChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_filterTextChange_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilterTextChanged($event)); })("recordSelected", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_recordSelected_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewerRecordSelected($event)); })("recordOpened", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_recordOpened_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewerRecordOpened($event)); })("dataLoaded", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_dataLoaded_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDataLoaded($event)); })("filteredCountChanged", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_filteredCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilteredCountChanged($event)); })("gridStateChanged", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_gridStateChanged_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onGridStateChanged($event)); })("selectionChanged", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_selectionChanged_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSelectionChanged($event)); })("addToListRequested", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_addToListRequested_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAddToListRequested($event)); })("mapRenderModeChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_mapRenderModeChange_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMapRenderModeChange($event)); })("mapDisplayStateChange", function DataExplorerDashboardComponent_Conditional_15_Template_mj_entity_viewer_mapDisplayStateChange_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMapDisplayStateChange($event)); });
|
|
748
758
|
i0.ɵɵelementEnd();
|
|
749
759
|
} if (rf & 2) {
|
|
750
760
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
751
|
-
i0.ɵɵproperty("entity", ctx_r1.selectedEntity)("viewEntity", ctx_r1.selectedViewEntity)("viewMode", ctx_r1.state.viewMode)("filterText", ctx_r1.debouncedFilterText)("selectedRecordId", ctx_r1.state.selectedRecordId)("config", ctx_r1.viewerConfig)("gridState", ctx_r1.currentGridState)("timelineConfig", ctx_r1.currentTimelineConfig)("gridSelectionMode", "checkbox")("showGridToolbar", false)("showAddToListButton", false);
|
|
761
|
+
i0.ɵɵproperty("entity", ctx_r1.selectedEntity)("viewEntity", ctx_r1.selectedViewEntity)("viewMode", ctx_r1.state.viewMode)("filterText", ctx_r1.debouncedFilterText)("selectedRecordId", ctx_r1.state.selectedRecordId)("config", ctx_r1.viewerConfig)("gridState", ctx_r1.currentGridState)("timelineConfig", ctx_r1.currentTimelineConfig)("gridSelectionMode", "checkbox")("showGridToolbar", false)("showAddToListButton", false)("mapRenderMode", ctx_r1.state.mapRenderMode || "point")("mapDisplayState", ctx_r1.mapDisplayState);
|
|
752
762
|
} }
|
|
753
763
|
function DataExplorerDashboardComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
754
|
-
const
|
|
755
|
-
i0.ɵɵelementStart(0, "div",
|
|
756
|
-
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_16_Template_button_click_2_listener() { i0.ɵɵrestoreView(
|
|
764
|
+
const _r35 = i0.ɵɵgetCurrentView();
|
|
765
|
+
i0.ɵɵelementStart(0, "div", 131)(1, "div", 132)(2, "button", 133);
|
|
766
|
+
i0.ɵɵlistener("click", function DataExplorerDashboardComponent_Conditional_16_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openListManagementDialog()); });
|
|
757
767
|
i0.ɵɵelement(3, "i", 35);
|
|
758
768
|
i0.ɵɵelementStart(4, "span");
|
|
759
769
|
i0.ɵɵtext(5, "Add to List");
|
|
760
770
|
i0.ɵɵelementEnd()()();
|
|
761
|
-
i0.ɵɵelementStart(6, "mj-entity-record-detail-panel",
|
|
762
|
-
i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_close_6_listener() { i0.ɵɵrestoreView(
|
|
771
|
+
i0.ɵɵelementStart(6, "mj-entity-record-detail-panel", 134);
|
|
772
|
+
i0.ɵɵlistener("close", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_close_6_listener() { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDetailPanelClosed()); })("openRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openRecord_6_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRecord($event)); })("navigateToRelated", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_navigateToRelated_6_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavigateToRelated($event)); })("openRelatedRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openRelatedRecord_6_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenRelatedRecord($event)); })("openForeignKeyRecord", function DataExplorerDashboardComponent_Conditional_16_Template_mj_entity_record_detail_panel_openForeignKeyRecord_6_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenForeignKeyRecord($event)); });
|
|
763
773
|
i0.ɵɵelementEnd()();
|
|
764
774
|
} if (rf & 2) {
|
|
765
775
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -768,9 +778,9 @@ function DataExplorerDashboardComponent_Conditional_16_Template(rf, ctx) { if (r
|
|
|
768
778
|
i0.ɵɵproperty("entity", ctx_r1.detailPanelEntity)("record", ctx_r1.selectedRecord);
|
|
769
779
|
} }
|
|
770
780
|
function DataExplorerDashboardComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
771
|
-
const
|
|
772
|
-
i0.ɵɵelementStart(0, "mj-list-management-dialog",
|
|
773
|
-
i0.ɵɵlistener("complete", function DataExplorerDashboardComponent_Conditional_20_Template_mj_list_management_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(
|
|
781
|
+
const _r36 = i0.ɵɵgetCurrentView();
|
|
782
|
+
i0.ɵɵelementStart(0, "mj-list-management-dialog", 135);
|
|
783
|
+
i0.ɵɵlistener("complete", function DataExplorerDashboardComponent_Conditional_20_Template_mj_list_management_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onListManagementComplete($event)); })("cancel", function DataExplorerDashboardComponent_Conditional_20_Template_mj_list_management_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r36); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onListManagementCancel()); });
|
|
774
784
|
i0.ɵɵelementEnd();
|
|
775
785
|
} if (rf & 2) {
|
|
776
786
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -786,9 +796,7 @@ function DataExplorerDashboardComponent_Conditional_20_Template(rf, ctx) { if (r
|
|
|
786
796
|
let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extends BaseDashboard {
|
|
787
797
|
stateService;
|
|
788
798
|
cdr;
|
|
789
|
-
router;
|
|
790
799
|
recentAccessService;
|
|
791
|
-
navigationService;
|
|
792
800
|
exportService;
|
|
793
801
|
ngZone;
|
|
794
802
|
destroy$ = new Subject();
|
|
@@ -821,6 +829,12 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
821
829
|
* Use this alongside contextName for a fully customized header (e.g., "fa-solid fa-users" for CRM).
|
|
822
830
|
*/
|
|
823
831
|
contextIcon = null;
|
|
832
|
+
/**
|
|
833
|
+
* Initial query params forwarded from the resource wrapper.
|
|
834
|
+
* On hard refresh, the shell delivers params to the wrapper (which has Data.Configuration.queryParams),
|
|
835
|
+
* not to this inner dashboard component. This input bridges that gap.
|
|
836
|
+
*/
|
|
837
|
+
initialQueryParams = {};
|
|
824
838
|
/**
|
|
825
839
|
* Emitted when the display title should change (entity selected, record opened, etc.)
|
|
826
840
|
*/
|
|
@@ -860,10 +874,6 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
860
874
|
isLoadingEntities = true;
|
|
861
875
|
// Date field dropdown state
|
|
862
876
|
isDateFieldDropdownOpen = false;
|
|
863
|
-
// Flag to skip URL updates during initialization (when applying deep link)
|
|
864
|
-
skipUrlUpdates = true;
|
|
865
|
-
// Track the last URL we navigated to, to avoid reacting to our own navigation
|
|
866
|
-
lastNavigatedUrl = '';
|
|
867
877
|
// Recent records from User Record Logs
|
|
868
878
|
recentRecords = [];
|
|
869
879
|
// Favorite records from User Favorites (non-entity favorites)
|
|
@@ -1205,25 +1215,30 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1205
1215
|
filterDialogDisabled = false;
|
|
1206
1216
|
// View save state
|
|
1207
1217
|
isSavingView = false;
|
|
1208
|
-
constructor(stateService, cdr,
|
|
1218
|
+
constructor(stateService, cdr, recentAccessService, exportService, ngZone) {
|
|
1209
1219
|
super();
|
|
1210
1220
|
this.stateService = stateService;
|
|
1211
1221
|
this.cdr = cdr;
|
|
1212
|
-
this.router = router;
|
|
1213
1222
|
this.recentAccessService = recentAccessService;
|
|
1214
|
-
this.navigationService = navigationService;
|
|
1215
1223
|
this.exportService = exportService;
|
|
1216
1224
|
this.ngZone = ngZone;
|
|
1217
1225
|
this.state = this.stateService.CurrentState;
|
|
1218
1226
|
}
|
|
1219
1227
|
async ngOnInit() {
|
|
1228
|
+
super.ngOnInit();
|
|
1220
1229
|
// Ensure UserInfoEngine is configured before we try to access user settings
|
|
1221
1230
|
// This prevents race conditions where we try to load default view settings
|
|
1222
1231
|
// before the user settings have been loaded from the server
|
|
1223
1232
|
await UserInfoEngine.Instance.Config(false);
|
|
1224
|
-
//
|
|
1225
|
-
//
|
|
1226
|
-
|
|
1233
|
+
// Read initial query params — prefer params forwarded from the resource wrapper
|
|
1234
|
+
// (which has Data.Configuration.queryParams from the shell), then fall back to
|
|
1235
|
+
// this component's own GetQueryParams() for cases where the dashboard is used standalone.
|
|
1236
|
+
const wrapperParams = this.initialQueryParams && Object.keys(this.initialQueryParams).length > 0
|
|
1237
|
+
? this.initialQueryParams
|
|
1238
|
+
: null;
|
|
1239
|
+
const ownParams = this.GetQueryParams();
|
|
1240
|
+
const rawParams = wrapperParams || (Object.keys(ownParams).length > 0 ? ownParams : {});
|
|
1241
|
+
const urlState = this.buildDeepLinkFromParams(rawParams);
|
|
1227
1242
|
// Set context for state service (enables context-specific settings)
|
|
1228
1243
|
await this.stateService.setContext(this.entityFilter);
|
|
1229
1244
|
this.state = this.stateService.CurrentState;
|
|
@@ -1235,11 +1250,9 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1235
1250
|
await this.loadEntities(urlState);
|
|
1236
1251
|
// Apply URL state after entities are loaded
|
|
1237
1252
|
if (urlState) {
|
|
1238
|
-
|
|
1239
|
-
this.applyUrlState(urlState);
|
|
1253
|
+
await this.applyUrlState(urlState);
|
|
1240
1254
|
}
|
|
1241
1255
|
else if (this.deepLink) {
|
|
1242
|
-
// No URL state but @Input deepLink provided - use that
|
|
1243
1256
|
await this.applyDeepLink(this.deepLink);
|
|
1244
1257
|
}
|
|
1245
1258
|
// Subscribe to state changes
|
|
@@ -1248,6 +1261,15 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1248
1261
|
.subscribe(state => {
|
|
1249
1262
|
const entityChanged = state.selectedEntityName !== this.state.selectedEntityName;
|
|
1250
1263
|
this.state = state;
|
|
1264
|
+
// Self-correct map mode: if a URL-sourced mode is pending and state
|
|
1265
|
+
// has diverged (e.g., reset to 'point' by some init step), re-apply it.
|
|
1266
|
+
// _pendingMapMode stays alive until the map component emits real state
|
|
1267
|
+
// via onMapDisplayStateChange (user interaction), NOT on first state match.
|
|
1268
|
+
if (this._pendingMapMode && state.mapRenderMode !== this._pendingMapMode) {
|
|
1269
|
+
const mode = this._pendingMapMode;
|
|
1270
|
+
this.stateService.updateState({ mapRenderMode: mode });
|
|
1271
|
+
return; // Let the next subscription fire handle the rest
|
|
1272
|
+
}
|
|
1251
1273
|
// When entity changes, clear user search text and update title
|
|
1252
1274
|
if (entityChanged) {
|
|
1253
1275
|
this.liveFilterText = '';
|
|
@@ -1255,10 +1277,8 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1255
1277
|
this.emitDisplayName();
|
|
1256
1278
|
}
|
|
1257
1279
|
this.onStateChanged();
|
|
1258
|
-
// Update URL to reflect current state (for deep linking)
|
|
1259
|
-
|
|
1260
|
-
this.updateUrl();
|
|
1261
|
-
}
|
|
1280
|
+
// Update URL query params to reflect current state (for deep linking)
|
|
1281
|
+
this.pushCurrentStateToUrl();
|
|
1262
1282
|
this.cdr.detectChanges();
|
|
1263
1283
|
});
|
|
1264
1284
|
// Subscribe to breadcrumb changes
|
|
@@ -1270,9 +1290,9 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1270
1290
|
});
|
|
1271
1291
|
// Setup debounced filter - 500ms delay allows comfortable typing before triggering search
|
|
1272
1292
|
// IMPORTANT: Do NOT call setSmartFilterPrompt here. Updating the state service triggers
|
|
1273
|
-
// URL updates via
|
|
1274
|
-
//
|
|
1275
|
-
// to the entity-viewer via [filterText] binding — no state service involvement needed.
|
|
1293
|
+
// URL updates (via pushCurrentStateToUrl → UpdateQueryParams), which in turn can trigger
|
|
1294
|
+
// OnQueryParamsChanged, which would clear the filter text. The debouncedFilterText flows
|
|
1295
|
+
// directly to the entity-viewer via [filterText] binding — no state service involvement needed.
|
|
1276
1296
|
this.filterInput$
|
|
1277
1297
|
.pipe(debounceTime(500), distinctUntilChanged(), takeUntil(this.destroy$))
|
|
1278
1298
|
.subscribe(filterText => {
|
|
@@ -1294,25 +1314,8 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1294
1314
|
this.favoriteRecords = records;
|
|
1295
1315
|
this.cdr.detectChanges();
|
|
1296
1316
|
});
|
|
1297
|
-
//
|
|
1298
|
-
this.
|
|
1299
|
-
.pipe(filter((event) => event instanceof NavigationEnd), takeUntil(this.destroy$))
|
|
1300
|
-
.subscribe(event => {
|
|
1301
|
-
// Only react to navigation events that weren't triggered by us
|
|
1302
|
-
// Normalize URLs by decoding to handle + vs %20 encoding differences
|
|
1303
|
-
// Note: decodeURIComponent doesn't decode +, so we also replace + with space
|
|
1304
|
-
const currentUrl = event.urlAfterRedirects || event.url;
|
|
1305
|
-
const normalizedCurrentUrl = decodeURIComponent(currentUrl).replace(/\+/g, ' ');
|
|
1306
|
-
const normalizedLastUrl = decodeURIComponent(this.lastNavigatedUrl).replace(/\+/g, ' ');
|
|
1307
|
-
const isExternal = normalizedCurrentUrl !== normalizedLastUrl;
|
|
1308
|
-
if (isExternal) {
|
|
1309
|
-
this.onExternalNavigation(currentUrl);
|
|
1310
|
-
}
|
|
1311
|
-
});
|
|
1312
|
-
// Enable URL updates now that initialization is complete
|
|
1313
|
-
this.skipUrlUpdates = false;
|
|
1314
|
-
// Update URL to reflect current state (whether from URL, deepLink, or persisted)
|
|
1315
|
-
this.updateUrl();
|
|
1317
|
+
// Push initial state to URL (covers deepLink and persisted state)
|
|
1318
|
+
this.pushCurrentStateToUrl();
|
|
1316
1319
|
// Notify that loading is complete (for resource wrapper integration)
|
|
1317
1320
|
this.NotifyLoadComplete();
|
|
1318
1321
|
}
|
|
@@ -1622,7 +1625,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1622
1625
|
return null;
|
|
1623
1626
|
}
|
|
1624
1627
|
try {
|
|
1625
|
-
const parsed =
|
|
1628
|
+
const parsed = view.GridStateObject;
|
|
1626
1629
|
// Validate structure - expect columnSettings array
|
|
1627
1630
|
if (parsed && Array.isArray(parsed.columnSettings)) {
|
|
1628
1631
|
// Validate columns and sorts against current entity to prevent stale
|
|
@@ -1767,17 +1770,17 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1767
1770
|
newView.UserID = md.CurrentUser.ID;
|
|
1768
1771
|
newView.IsShared = event.isShared;
|
|
1769
1772
|
newView.IsDefault = false;
|
|
1770
|
-
// Set
|
|
1773
|
+
// Set state via typed object setters
|
|
1771
1774
|
if (gridState) {
|
|
1772
|
-
newView.
|
|
1775
|
+
newView.GridStateObject = gridState;
|
|
1773
1776
|
}
|
|
1774
1777
|
if (sortState) {
|
|
1775
|
-
newView.
|
|
1778
|
+
newView.SortStateObject = sortState;
|
|
1776
1779
|
}
|
|
1777
1780
|
// Set Smart Filter settings
|
|
1778
1781
|
newView.SmartFilterEnabled = event.smartFilterEnabled;
|
|
1779
1782
|
newView.SmartFilterPrompt = event.smartFilterPrompt;
|
|
1780
|
-
// BUG-008: Always set FilterState consistently
|
|
1783
|
+
// BUG-008: Always set FilterState consistently (raw string — Kendo CompositeFilterDescriptor shape)
|
|
1781
1784
|
newView.FilterState = filterStateJson;
|
|
1782
1785
|
const saved = await newView.Save();
|
|
1783
1786
|
if (saved) {
|
|
@@ -1806,17 +1809,17 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1806
1809
|
this.selectedViewEntity.Name = event.name;
|
|
1807
1810
|
this.selectedViewEntity.Description = event.description;
|
|
1808
1811
|
this.selectedViewEntity.IsShared = event.isShared;
|
|
1809
|
-
// Update
|
|
1812
|
+
// Update state via typed object setters
|
|
1810
1813
|
if (gridState) {
|
|
1811
|
-
this.selectedViewEntity.
|
|
1814
|
+
this.selectedViewEntity.GridStateObject = gridState;
|
|
1812
1815
|
}
|
|
1813
1816
|
if (sortState) {
|
|
1814
|
-
this.selectedViewEntity.
|
|
1817
|
+
this.selectedViewEntity.SortStateObject = sortState;
|
|
1815
1818
|
}
|
|
1816
1819
|
// Update Smart Filter settings
|
|
1817
1820
|
this.selectedViewEntity.SmartFilterEnabled = event.smartFilterEnabled;
|
|
1818
1821
|
this.selectedViewEntity.SmartFilterPrompt = event.smartFilterPrompt;
|
|
1819
|
-
// BUG-008: Always set FilterState consistently
|
|
1822
|
+
// BUG-008: Always set FilterState consistently (raw string — Kendo CompositeFilterDescriptor shape)
|
|
1820
1823
|
this.selectedViewEntity.FilterState = filterStateJson;
|
|
1821
1824
|
const saved = await this.selectedViewEntity.Save();
|
|
1822
1825
|
if (saved) {
|
|
@@ -1929,7 +1932,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1929
1932
|
DisplayName: col.displayName,
|
|
1930
1933
|
userDisplayName: col.userDisplayName, // Include user-defined column alias
|
|
1931
1934
|
hidden: false, // Visible columns only
|
|
1932
|
-
width: col.width ||
|
|
1935
|
+
width: col.width || undefined,
|
|
1933
1936
|
orderIndex: idx,
|
|
1934
1937
|
format: col.format // Include column format settings
|
|
1935
1938
|
}));
|
|
@@ -1947,7 +1950,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1947
1950
|
Name: f.Name,
|
|
1948
1951
|
DisplayName: f.DisplayNameOrName,
|
|
1949
1952
|
hidden: false,
|
|
1950
|
-
width: f.DefaultColumnWidth ||
|
|
1953
|
+
width: f.DefaultColumnWidth || undefined,
|
|
1951
1954
|
orderIndex: idx
|
|
1952
1955
|
}));
|
|
1953
1956
|
if (columnSettings.length === 0) {
|
|
@@ -1996,7 +1999,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
1996
1999
|
if (event.sortItems && event.sortItems.length > 0) {
|
|
1997
2000
|
return event.sortItems.map(item => ({
|
|
1998
2001
|
field: item.field,
|
|
1999
|
-
direction: item.direction
|
|
2002
|
+
direction: item.direction
|
|
2000
2003
|
}));
|
|
2001
2004
|
}
|
|
2002
2005
|
// Fallback to deprecated sortField for backward compatibility
|
|
@@ -2165,20 +2168,20 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
2165
2168
|
let sortCount = 0;
|
|
2166
2169
|
let aggregateCount = 0;
|
|
2167
2170
|
try {
|
|
2168
|
-
const gridState = view.
|
|
2169
|
-
if (Array.isArray(gridState)) {
|
|
2170
|
-
columnCount = gridState.filter((c) => !c
|
|
2171
|
+
const gridState = view.GridStateObject;
|
|
2172
|
+
if (gridState?.columnSettings && Array.isArray(gridState.columnSettings)) {
|
|
2173
|
+
columnCount = gridState.columnSettings.filter((c) => !c.hidden).length;
|
|
2171
2174
|
}
|
|
2172
2175
|
}
|
|
2173
2176
|
catch { /* ignore */ }
|
|
2174
2177
|
try {
|
|
2175
|
-
const filterState = view.
|
|
2178
|
+
const filterState = view.FilterStateObject;
|
|
2176
2179
|
if (filterState?.filters?.length)
|
|
2177
2180
|
filterCount = filterState.filters.length;
|
|
2178
2181
|
}
|
|
2179
2182
|
catch { /* ignore */ }
|
|
2180
2183
|
try {
|
|
2181
|
-
const sortState = view.
|
|
2184
|
+
const sortState = view.SortStateObject;
|
|
2182
2185
|
if (Array.isArray(sortState))
|
|
2183
2186
|
sortCount = sortState.length;
|
|
2184
2187
|
}
|
|
@@ -2321,6 +2324,41 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
2321
2324
|
this.stateService.setViewModified(true);
|
|
2322
2325
|
}
|
|
2323
2326
|
}
|
|
2327
|
+
/**
|
|
2328
|
+
* Get the current map display state for passing to the EntityViewer/MapView.
|
|
2329
|
+
*/
|
|
2330
|
+
get mapDisplayState() {
|
|
2331
|
+
if (this.state.mapZoom == null) {
|
|
2332
|
+
return null;
|
|
2333
|
+
}
|
|
2334
|
+
return {
|
|
2335
|
+
ZoomLevel: this.state.mapZoom,
|
|
2336
|
+
CenterLat: this.state.mapCenterLat ?? 20,
|
|
2337
|
+
CenterLng: this.state.mapCenterLng ?? 0
|
|
2338
|
+
};
|
|
2339
|
+
}
|
|
2340
|
+
/**
|
|
2341
|
+
* Handle map display state changes from the map component.
|
|
2342
|
+
* Persists zoom, center, and render mode across page reloads.
|
|
2343
|
+
*/
|
|
2344
|
+
/**
|
|
2345
|
+
* Handle map render mode change (user clicked mode button in map component).
|
|
2346
|
+
*/
|
|
2347
|
+
onMapRenderModeChange(mode) {
|
|
2348
|
+
this._pendingMapMode = null; // User-initiated — clear any pending URL mode
|
|
2349
|
+
this.stateService.updateState({ mapRenderMode: mode });
|
|
2350
|
+
}
|
|
2351
|
+
/**
|
|
2352
|
+
* Handle map display state change (zoom/pan — fires on moveend).
|
|
2353
|
+
*/
|
|
2354
|
+
onMapDisplayStateChange(state) {
|
|
2355
|
+
this._pendingMapMode = null; // Map is interactive now — clear pending
|
|
2356
|
+
this.stateService.updateState({
|
|
2357
|
+
mapZoom: state.ZoomLevel ?? null,
|
|
2358
|
+
mapCenterLat: state.CenterLat ?? null,
|
|
2359
|
+
mapCenterLng: state.CenterLng ?? null
|
|
2360
|
+
});
|
|
2361
|
+
}
|
|
2324
2362
|
/**
|
|
2325
2363
|
* Handle smart filter change from dashboard header
|
|
2326
2364
|
*/
|
|
@@ -2820,6 +2858,12 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
2820
2858
|
}
|
|
2821
2859
|
/** Record ID to select once data loads (from deep link) */
|
|
2822
2860
|
pendingRecordSelection = null;
|
|
2861
|
+
/**
|
|
2862
|
+
* Pending map mode from URL that must survive initialization state resets.
|
|
2863
|
+
* Set during applyUrlState, cleared once state matches or after first successful re-apply.
|
|
2864
|
+
* The state subscription self-corrects: any time state diverges from this value, it re-applies.
|
|
2865
|
+
*/
|
|
2866
|
+
_pendingMapMode = null;
|
|
2823
2867
|
// ========================================
|
|
2824
2868
|
// BREADCRUMB NAVIGATION
|
|
2825
2869
|
// ========================================
|
|
@@ -2893,50 +2937,98 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
2893
2937
|
return `fa-solid fa-${icon}`;
|
|
2894
2938
|
}
|
|
2895
2939
|
// ========================================
|
|
2896
|
-
// URL DEEP LINKING
|
|
2940
|
+
// URL DEEP LINKING (Framework Query Param Lifecycle)
|
|
2897
2941
|
// ========================================
|
|
2898
2942
|
/**
|
|
2899
|
-
*
|
|
2943
|
+
* Build a DataExplorerDeepLink from framework query params.
|
|
2900
2944
|
* Returns null if no relevant params found.
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
const queryIndex = url.indexOf('?');
|
|
2911
|
-
if (queryIndex === -1) {
|
|
2912
|
-
return null;
|
|
2913
|
-
}
|
|
2914
|
-
const queryString = url.substring(queryIndex + 1);
|
|
2915
|
-
const params = new URLSearchParams(queryString);
|
|
2916
|
-
const entity = params.get('entity');
|
|
2917
|
-
const record = params.get('record');
|
|
2918
|
-
const filter = params.get('filter');
|
|
2919
|
-
const view = params.get('view');
|
|
2920
|
-
// If no params, return null
|
|
2921
|
-
if (!entity && !record && !filter && !view) {
|
|
2945
|
+
*/
|
|
2946
|
+
buildDeepLinkFromParams(params) {
|
|
2947
|
+
const entity = params['entity'] || null;
|
|
2948
|
+
const record = params['record'] || null;
|
|
2949
|
+
const filterParam = params['filter'] || null;
|
|
2950
|
+
const view = params['view'] || null;
|
|
2951
|
+
const viewId = params['viewId'] || null;
|
|
2952
|
+
const mapMode = params['mapMode'] || null;
|
|
2953
|
+
if (!entity && !record && !filterParam && !view && !viewId && !mapMode) {
|
|
2922
2954
|
return null;
|
|
2923
2955
|
}
|
|
2924
2956
|
return {
|
|
2925
2957
|
entity: entity || undefined,
|
|
2926
2958
|
record: record || undefined,
|
|
2927
|
-
filter:
|
|
2928
|
-
viewMode: view || undefined
|
|
2959
|
+
filter: filterParam || undefined,
|
|
2960
|
+
viewMode: view || undefined,
|
|
2961
|
+
viewId: viewId || undefined,
|
|
2962
|
+
mapMode: mapMode || undefined
|
|
2929
2963
|
};
|
|
2930
2964
|
}
|
|
2965
|
+
/**
|
|
2966
|
+
* React to back/forward navigation or deep-link entry.
|
|
2967
|
+
* The base class calls this when query params change via popstate or deeplink.
|
|
2968
|
+
*/
|
|
2969
|
+
OnQueryParamsChanged(params, _source) {
|
|
2970
|
+
this.applyParams(params);
|
|
2971
|
+
}
|
|
2972
|
+
/**
|
|
2973
|
+
* Public entry point for the resource wrapper to forward query param changes.
|
|
2974
|
+
* The wrapper receives OnQueryParamsChanged from the framework and delegates here.
|
|
2975
|
+
*/
|
|
2976
|
+
HandleQueryParamsChanged(params, _source) {
|
|
2977
|
+
this.applyParams(params);
|
|
2978
|
+
}
|
|
2979
|
+
/**
|
|
2980
|
+
* Apply a params map (from framework query params) to the component state.
|
|
2981
|
+
*/
|
|
2982
|
+
async applyParams(params) {
|
|
2983
|
+
const deepLink = this.buildDeepLinkFromParams(params);
|
|
2984
|
+
if (deepLink) {
|
|
2985
|
+
await this.applyUrlState(deepLink);
|
|
2986
|
+
}
|
|
2987
|
+
else {
|
|
2988
|
+
// No params — go to home view
|
|
2989
|
+
this.selectedEntity = null;
|
|
2990
|
+
this.selectedRecord = null;
|
|
2991
|
+
this.detailPanelEntity = null;
|
|
2992
|
+
this.stateService.selectEntity(null);
|
|
2993
|
+
this.stateService.closeDetailPanel();
|
|
2994
|
+
this.cdr.detectChanges();
|
|
2995
|
+
}
|
|
2996
|
+
}
|
|
2997
|
+
/**
|
|
2998
|
+
* Push current navigation state to the URL via the framework.
|
|
2999
|
+
* Called whenever state changes so users can bookmark/share URLs.
|
|
3000
|
+
*/
|
|
3001
|
+
pushCurrentStateToUrl() {
|
|
3002
|
+
const hasEntity = !!this.state.selectedEntityName;
|
|
3003
|
+
const hasViewId = !!(this.state.selectedViewId && hasEntity);
|
|
3004
|
+
const queryParams = {
|
|
3005
|
+
entity: this.state.selectedEntityName || null,
|
|
3006
|
+
record: (this.state.selectedRecordId && hasEntity) ? this.state.selectedRecordId : null,
|
|
3007
|
+
filter: null, // Never in URL — filters live in saved views (DB), not query strings
|
|
3008
|
+
view: (this.state.viewMode && this.state.viewMode !== 'grid') ? this.state.viewMode : null,
|
|
3009
|
+
viewId: hasViewId ? this.state.selectedViewId : null,
|
|
3010
|
+
mapMode: this.state.viewMode === 'map' ? (this.state.mapRenderMode || 'point') : null
|
|
3011
|
+
};
|
|
3012
|
+
this.UpdateQueryParams(queryParams);
|
|
3013
|
+
}
|
|
2931
3014
|
/**
|
|
2932
3015
|
* Apply URL state to the component.
|
|
2933
3016
|
* Used both during init and for popstate handling.
|
|
2934
3017
|
*/
|
|
2935
|
-
applyUrlState(urlState) {
|
|
2936
|
-
//
|
|
3018
|
+
async applyUrlState(urlState) {
|
|
3019
|
+
// Store URL-sourced map mode BEFORE switching to map view — various init steps
|
|
3020
|
+
// can reset mapRenderMode to 'point'. The state subscription self-corrects using this.
|
|
3021
|
+
if (urlState.mapMode && ['point', 'choropleth', 'heatmap'].includes(urlState.mapMode)) {
|
|
3022
|
+
this._pendingMapMode = urlState.mapMode;
|
|
3023
|
+
}
|
|
3024
|
+
// Apply view mode (may trigger map component creation if switching to 'map')
|
|
2937
3025
|
if (urlState.viewMode) {
|
|
2938
3026
|
this.stateService.setViewMode(urlState.viewMode);
|
|
2939
3027
|
}
|
|
3028
|
+
// Apply map render mode to state
|
|
3029
|
+
if (this._pendingMapMode) {
|
|
3030
|
+
this.stateService.updateState({ mapRenderMode: this._pendingMapMode });
|
|
3031
|
+
}
|
|
2940
3032
|
// Navigate to entity if specified
|
|
2941
3033
|
if (urlState.entity) {
|
|
2942
3034
|
const entity = this.entities.find(e => e.Name.toLowerCase() === urlState.entity.toLowerCase());
|
|
@@ -2948,12 +3040,19 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
2948
3040
|
this.selectedEntity = entity;
|
|
2949
3041
|
this.stateService.selectEntity(entity.Name);
|
|
2950
3042
|
}
|
|
2951
|
-
//
|
|
2952
|
-
if (urlState.
|
|
2953
|
-
this.
|
|
3043
|
+
// Restore saved view by ID if specified
|
|
3044
|
+
if (urlState.viewId) {
|
|
3045
|
+
await this.restoreViewFromUrl(urlState.viewId, entity);
|
|
2954
3046
|
}
|
|
2955
|
-
else
|
|
2956
|
-
//
|
|
3047
|
+
else {
|
|
3048
|
+
// No specific view — clear view selection to use default
|
|
3049
|
+
this.selectedViewEntity = null;
|
|
3050
|
+
this.stateService.selectView(null);
|
|
3051
|
+
this.currentGridState = this.loadUserDefaultGridState();
|
|
3052
|
+
}
|
|
3053
|
+
// Filters live in saved views (DB), never in URL query strings.
|
|
3054
|
+
// Clear smart filter on entity change when no specific view is selected.
|
|
3055
|
+
if (entityChanged && !urlState.viewId) {
|
|
2957
3056
|
this.stateService.setSmartFilterPrompt('');
|
|
2958
3057
|
}
|
|
2959
3058
|
// User search text is always cleared when applying URL state
|
|
@@ -3004,111 +3103,43 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
3004
3103
|
this.cdr.detectChanges();
|
|
3005
3104
|
}
|
|
3006
3105
|
/**
|
|
3007
|
-
*
|
|
3008
|
-
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
|
|
3106
|
+
* Restore a saved view from the URL's viewId parameter.
|
|
3107
|
+
* Looks up the view by ID, sets it as selected, and applies its grid state and filters.
|
|
3108
|
+
* Must be async because UserViewEngine's cache may not be populated yet on cold page loads.
|
|
3109
|
+
*/
|
|
3110
|
+
async restoreViewFromUrl(viewId, entity) {
|
|
3111
|
+
// Ensure the view engine cache is populated before querying —
|
|
3112
|
+
// on hard refresh, the cache may be empty and GetAccessibleViewsForEntity returns []
|
|
3113
|
+
await UserViewEngine.Instance.Config(false);
|
|
3114
|
+
const accessibleViews = UserViewEngine.Instance.GetAccessibleViewsForEntity(entity.ID);
|
|
3115
|
+
const view = accessibleViews.find(v => UUIDsEqual(v.ID, viewId)) || null;
|
|
3116
|
+
if (view) {
|
|
3117
|
+
this.selectedViewEntity = view;
|
|
3118
|
+
this.stateService.selectView(viewId);
|
|
3119
|
+
this.currentGridState = this.parseViewGridState(view);
|
|
3120
|
+
// Apply the view's smart filter if it has one
|
|
3121
|
+
if (view.SmartFilterEnabled && view.SmartFilterPrompt) {
|
|
3122
|
+
this.stateService.setSmartFilterPrompt(view.SmartFilterPrompt);
|
|
3123
|
+
}
|
|
3012
3124
|
}
|
|
3013
3125
|
else {
|
|
3014
|
-
|
|
3126
|
+
console.warn('[DataExplorer] restoreViewFromUrl: view NOT FOUND, falling back to default. viewId=', viewId);
|
|
3127
|
+
this.selectedViewEntity = null;
|
|
3128
|
+
this.stateService.selectView(null);
|
|
3129
|
+
this.currentGridState = this.loadUserDefaultGridState();
|
|
3015
3130
|
}
|
|
3131
|
+
this.cdr.detectChanges();
|
|
3016
3132
|
}
|
|
3017
3133
|
/**
|
|
3018
|
-
*
|
|
3019
|
-
* This enables deep linking - users can bookmark or share URLs to specific views.
|
|
3020
|
-
* Called immediately on state changes (not debounced).
|
|
3021
|
-
* Uses NavigationService for proper URL management that respects app-scoped routes.
|
|
3134
|
+
* Emit the current display name based on selected entity/record.
|
|
3022
3135
|
*/
|
|
3023
|
-
|
|
3024
|
-
const queryParams = {};
|
|
3025
|
-
// Add entity if selected
|
|
3136
|
+
emitDisplayName() {
|
|
3026
3137
|
if (this.state.selectedEntityName) {
|
|
3027
|
-
|
|
3028
|
-
}
|
|
3029
|
-
else {
|
|
3030
|
-
queryParams['entity'] = null;
|
|
3031
|
-
}
|
|
3032
|
-
// Add record if selected (only if entity is also selected)
|
|
3033
|
-
if (this.state.selectedRecordId && this.state.selectedEntityName) {
|
|
3034
|
-
queryParams['record'] = this.state.selectedRecordId;
|
|
3035
|
-
}
|
|
3036
|
-
else {
|
|
3037
|
-
queryParams['record'] = null;
|
|
3038
|
-
}
|
|
3039
|
-
// Add filter if present (only if entity is also selected)
|
|
3040
|
-
if (this.state.smartFilterPrompt && this.state.selectedEntityName) {
|
|
3041
|
-
queryParams['filter'] = this.state.smartFilterPrompt;
|
|
3042
|
-
}
|
|
3043
|
-
else {
|
|
3044
|
-
queryParams['filter'] = null;
|
|
3045
|
-
}
|
|
3046
|
-
// Add view mode if not default (grid is default)
|
|
3047
|
-
if (this.state.viewMode && this.state.viewMode !== 'grid') {
|
|
3048
|
-
queryParams['view'] = this.state.viewMode;
|
|
3049
|
-
}
|
|
3050
|
-
else {
|
|
3051
|
-
queryParams['view'] = null;
|
|
3052
|
-
}
|
|
3053
|
-
// Use NavigationService to update query params properly
|
|
3054
|
-
this.navigationService.UpdateActiveTabQueryParams(queryParams);
|
|
3055
|
-
}
|
|
3056
|
-
/**
|
|
3057
|
-
* Handle external navigation (back/forward buttons).
|
|
3058
|
-
* Parses the URL and applies the state without triggering a new navigation.
|
|
3059
|
-
*/
|
|
3060
|
-
onExternalNavigation(url) {
|
|
3061
|
-
// Check if this URL is for our component (contains our base path)
|
|
3062
|
-
const currentPath = this.router.url.split('?')[0];
|
|
3063
|
-
const newPath = url.split('?')[0];
|
|
3064
|
-
// Only handle if we're still on the same base path (same dashboard instance)
|
|
3065
|
-
if (currentPath !== newPath) {
|
|
3066
|
-
return; // Different route entirely, shell will handle it
|
|
3067
|
-
}
|
|
3068
|
-
// Parse the new URL state
|
|
3069
|
-
const urlState = this.parseUrlFromString(url);
|
|
3070
|
-
// Apply the state without triggering URL updates
|
|
3071
|
-
this.skipUrlUpdates = true;
|
|
3072
|
-
if (urlState) {
|
|
3073
|
-
this.applyUrlState(urlState);
|
|
3138
|
+
this.DisplayNameChanged.emit(this.state.selectedEntityName);
|
|
3074
3139
|
}
|
|
3075
3140
|
else {
|
|
3076
|
-
|
|
3077
|
-
this.selectedEntity = null;
|
|
3078
|
-
this.selectedRecord = null;
|
|
3079
|
-
this.detailPanelEntity = null;
|
|
3080
|
-
this.stateService.selectEntity(null);
|
|
3081
|
-
this.stateService.closeDetailPanel();
|
|
3082
|
-
}
|
|
3083
|
-
this.skipUrlUpdates = false;
|
|
3084
|
-
// Update the tracked URL
|
|
3085
|
-
this.lastNavigatedUrl = url;
|
|
3086
|
-
this.cdr.detectChanges();
|
|
3087
|
-
}
|
|
3088
|
-
/**
|
|
3089
|
-
* Parse URL state from a URL string (used for external navigation).
|
|
3090
|
-
*/
|
|
3091
|
-
parseUrlFromString(url) {
|
|
3092
|
-
const queryIndex = url.indexOf('?');
|
|
3093
|
-
if (queryIndex === -1) {
|
|
3094
|
-
return null;
|
|
3095
|
-
}
|
|
3096
|
-
const queryString = url.substring(queryIndex + 1);
|
|
3097
|
-
const params = new URLSearchParams(queryString);
|
|
3098
|
-
const entity = params.get('entity');
|
|
3099
|
-
const record = params.get('record');
|
|
3100
|
-
const filterParam = params.get('filter');
|
|
3101
|
-
const view = params.get('view');
|
|
3102
|
-
// If no params, return null
|
|
3103
|
-
if (!entity && !record && !filterParam && !view) {
|
|
3104
|
-
return null;
|
|
3141
|
+
this.DisplayNameChanged.emit('Data');
|
|
3105
3142
|
}
|
|
3106
|
-
return {
|
|
3107
|
-
entity: entity || undefined,
|
|
3108
|
-
record: record || undefined,
|
|
3109
|
-
filter: filterParam || undefined,
|
|
3110
|
-
viewMode: view || undefined
|
|
3111
|
-
};
|
|
3112
3143
|
}
|
|
3113
3144
|
// ========================================
|
|
3114
3145
|
// HOME SCREEN ACTIONS
|
|
@@ -3497,7 +3528,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
3497
3528
|
this.listManagementConfig = null;
|
|
3498
3529
|
this.cdr.detectChanges();
|
|
3499
3530
|
}
|
|
3500
|
-
static ɵfac = function DataExplorerDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DataExplorerDashboardComponent)(i0.ɵɵdirectiveInject(i1.ExplorerStateService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.
|
|
3531
|
+
static ɵfac = function DataExplorerDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DataExplorerDashboardComponent)(i0.ɵɵdirectiveInject(i1.ExplorerStateService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.RecentAccessService), i0.ɵɵdirectiveInject(i3.ExportService), i0.ɵɵdirectiveInject(i0.NgZone)); };
|
|
3501
3532
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataExplorerDashboardComponent, selectors: [["mj-data-explorer-dashboard"]], viewQuery: function DataExplorerDashboardComponent_Query(rf, ctx) { if (rf & 1) {
|
|
3502
3533
|
i0.ɵɵviewQuery(_c0, 5)(ViewSelectorComponent, 5)(EntityViewerComponent, 5)(ViewConfigPanelComponent, 5);
|
|
3503
3534
|
} if (rf & 2) {
|
|
@@ -3508,7 +3539,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
3508
3539
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewConfigPanelRef = _t.first);
|
|
3509
3540
|
} }, hostBindings: function DataExplorerDashboardComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
3510
3541
|
i0.ɵɵlistener("keydown", function DataExplorerDashboardComponent_keydown_HostBindingHandler($event) { return ctx.handleKeyboardShortcut($event); }, i0.ɵɵresolveDocument);
|
|
3511
|
-
} }, inputs: { entityFilter: "entityFilter", deepLink: "deepLink", contextName: "contextName", contextIcon: "contextIcon" }, outputs: { DisplayNameChanged: "DisplayNameChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 24, vars: 40, consts: [["filterInput", ""], ["entityViewer", ""], [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"], ["title", "Recents & Favorites", 1, "header-action-btn", 3, "active"], [1, "content-body"], [1, "home-view-concept-d"], [3, "entity", "viewEntity", "viewMode", "filterText", "selectedRecordId", "config", "gridState", "timelineConfig", "gridSelectionMode", "showGridToolbar", "showAddToListButton"], [1, "detail-panel", 3, "width"], [3, "close", "save", "saveDefaults", "delete", "duplicate", "openFilterDialogRequest", "entity", "viewEntity", "isOpen", "currentGridState", "externalFilterState", "isSaving", "DefaultSaveAsNew", "PendingNewViewName", "PendingNewViewDescription", "PendingNewViewIsShared"], [3, "close", "apply", "isOpen", "fields", "filter", "disabled"], [3, "closed", "visible", "config"], [3, "config", "visible"], [3, "Save", "Close", "OpenAdvanced", "IsOpen", "ViewEntity", "EntityName", "Summary", "IsSaving", "DefaultSaveAsNew"], [3, "Duplicate", "Cancel", "IsOpen", "SourceViewName", "Summary"], [3, "Action", "Cancel", "IsOpen", "ViewName"], [1, "navigation-panel"], [3, "entitySelected", "toggleCollapse", "sectionToggled", "openRecord", "selectRecord", "expandAndFocus", "entities", "appEntityGroups", "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", "duplicateViewRequested", "quickSaveRequested", "revertRequested", "entity", "selectedViewId", "viewModified"], [1, "header-action-btn", 3, "click", "disabled", "title"], [1, "fa-solid", "fa-list-check"], [1, "selection-badge"], [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, "input", "value"], [1, "clear-filter-btn"], [1, "clear-filter-btn", 3, "click"], [1, "fa-solid", "fa-times"], [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", "
|
|
3542
|
+
} }, inputs: { entityFilter: "entityFilter", deepLink: "deepLink", contextName: "contextName", contextIcon: "contextIcon", initialQueryParams: "initialQueryParams" }, outputs: { DisplayNameChanged: "DisplayNameChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 24, vars: 40, consts: [["filterInput", ""], ["entityViewer", ""], [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"], ["title", "Recents & Favorites", 1, "header-action-btn", 3, "active"], [1, "content-body"], [1, "home-view-concept-d"], [3, "entity", "viewEntity", "viewMode", "filterText", "selectedRecordId", "config", "gridState", "timelineConfig", "gridSelectionMode", "showGridToolbar", "showAddToListButton", "mapRenderMode", "mapDisplayState"], [1, "detail-panel", 3, "width"], [3, "close", "save", "saveDefaults", "delete", "duplicate", "openFilterDialogRequest", "entity", "viewEntity", "isOpen", "currentGridState", "externalFilterState", "isSaving", "DefaultSaveAsNew", "PendingNewViewName", "PendingNewViewDescription", "PendingNewViewIsShared"], [3, "close", "apply", "isOpen", "fields", "filter", "disabled"], [3, "closed", "visible", "config"], [3, "config", "visible"], [3, "Save", "Close", "OpenAdvanced", "IsOpen", "ViewEntity", "EntityName", "Summary", "IsSaving", "DefaultSaveAsNew"], [3, "Duplicate", "Cancel", "IsOpen", "SourceViewName", "Summary"], [3, "Action", "Cancel", "IsOpen", "ViewName"], [1, "navigation-panel"], [3, "entitySelected", "toggleCollapse", "sectionToggled", "openRecord", "selectRecord", "expandAndFocus", "entities", "appEntityGroups", "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", "duplicateViewRequested", "quickSaveRequested", "revertRequested", "entity", "selectedViewId", "viewModified"], [1, "header-action-btn", 3, "click", "disabled", "title"], [1, "fa-solid", "fa-list-check"], [1, "selection-badge"], [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, "input", "value"], [1, "clear-filter-btn"], [1, "clear-filter-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "view-specific-controls"], [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", "Map View", 1, "toggle-btn", 3, "active"], [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, "view-specific-btn", 3, "click", "title"], [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"], ["title", "Timeline View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-timeline"], ["title", "Map View", 1, "toggle-btn", 3, "click"], [1, "fa-solid", "fa-map-location-dot"], ["title", "Recents & Favorites", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "qa-badge"], [1, "loading-state"], ["text", "Loading entities...", "size", "medium"], [1, "home-main-area"], [1, "search-hero"], [1, "search-hero-container"], [1, "fa-solid", "fa-magnifying-glass", "search-hero-icon"], ["type", "text", "placeholder", "Search entities...", 1, "search-hero-input", 3, "ngModelChange", "ngModel"], [1, "search-hero-clear"], [1, "search-hero-shortcut"], [1, "search-meta-row"], [1, "search-entity-count"], [1, "pill-toggle"], [1, "pill-btn", 3, "click"], [1, "fa-solid", "fa-star"], [1, "entity-groups-area"], [1, "entity-item-grid"], [1, "home-no-results"], [1, "empty-state"], [1, "quick-access-panel"], [1, "qa-header"], [1, "qa-close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "qa-body"], [1, "qa-section"], [1, "qa-section-header", 3, "click"], [1, "fa-solid", "fa-clock-rotate-left", "qa-section-icon"], [1, "qa-section-count"], [1, "fa-solid", "fa-chevron-down", "qa-section-chevron"], [1, "qa-section-body"], [1, "qa-item"], [1, "qa-empty"], [1, "fa-solid", "fa-table", "qa-section-icon"], [1, "fa-solid", "fa-star", "qa-section-icon", 2, "color", "var(--mj-status-warning)"], [1, "search-hero-clear", 3, "click"], [1, "entity-item", 3, "title"], [1, "entity-item", 3, "click", "title"], [1, "entity-item-icon"], [1, "entity-item-text"], [1, "entity-item-name"], [1, "entity-item-desc"], [1, "entity-item-fav", 3, "click", "title"], [1, "app-group"], [1, "app-group-header", 3, "click"], [1, "app-group-icon"], [1, "app-group-name"], [1, "app-group-count"], [1, "fa-solid", "fa-chevron-right", "app-group-chevron"], [1, "app-group-entities"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-database", "empty-icon"], [1, "qa-item", 3, "click"], [1, "qa-item-icon"], [1, "qa-item-info"], [1, "qa-item-name"], [1, "qa-item-meta"], [1, "qa-item-time"], [3, "viewModeChange", "filterTextChange", "recordSelected", "recordOpened", "dataLoaded", "filteredCountChanged", "gridStateChanged", "selectionChanged", "addToListRequested", "mapRenderModeChange", "mapDisplayStateChange", "entity", "viewEntity", "viewMode", "filterText", "selectedRecordId", "config", "gridState", "timelineConfig", "gridSelectionMode", "showGridToolbar", "showAddToListButton", "mapRenderMode", "mapDisplayState"], [1, "detail-panel"], [1, "detail-panel-actions"], ["title", "Add to List", 1, "detail-action-btn", 3, "click"], [3, "close", "openRecord", "navigateToRelated", "openRelatedRecord", "openForeignKeyRecord", "entity", "record"], [3, "complete", "cancel", "config", "visible"]], template: function DataExplorerDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
3512
3543
|
i0.ɵɵelementStart(0, "div", 2);
|
|
3513
3544
|
i0.ɵɵconditionalCreate(1, DataExplorerDashboardComponent_Conditional_1_Template, 2, 16, "div", 3);
|
|
3514
3545
|
i0.ɵɵelementStart(2, "div", 4);
|
|
@@ -3520,11 +3551,11 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
3520
3551
|
i0.ɵɵconditionalCreate(9, DataExplorerDashboardComponent_Conditional_9_Template, 5, 2, "div", 9);
|
|
3521
3552
|
i0.ɵɵelementEnd();
|
|
3522
3553
|
i0.ɵɵelementStart(10, "div", 10);
|
|
3523
|
-
i0.ɵɵconditionalCreate(11, DataExplorerDashboardComponent_Conditional_11_Template,
|
|
3554
|
+
i0.ɵɵconditionalCreate(11, DataExplorerDashboardComponent_Conditional_11_Template, 8, 7);
|
|
3524
3555
|
i0.ɵɵconditionalCreate(12, DataExplorerDashboardComponent_Conditional_12_Template, 3, 3, "button", 11);
|
|
3525
3556
|
i0.ɵɵelementEnd()();
|
|
3526
3557
|
i0.ɵɵelementStart(13, "div", 12);
|
|
3527
|
-
i0.ɵɵconditionalCreate(14, DataExplorerDashboardComponent_Conditional_14_Template, 3, 1, "div", 13)(15, DataExplorerDashboardComponent_Conditional_15_Template, 2,
|
|
3558
|
+
i0.ɵɵconditionalCreate(14, DataExplorerDashboardComponent_Conditional_14_Template, 3, 1, "div", 13)(15, DataExplorerDashboardComponent_Conditional_15_Template, 2, 13, "mj-entity-viewer", 14);
|
|
3528
3559
|
i0.ɵɵelementEnd()();
|
|
3529
3560
|
i0.ɵɵconditionalCreate(16, DataExplorerDashboardComponent_Conditional_16_Template, 7, 4, "div", 15);
|
|
3530
3561
|
i0.ɵɵelementStart(17, "mj-view-config-panel", 16);
|
|
@@ -3581,7 +3612,7 @@ let DataExplorerDashboardComponent = class DataExplorerDashboardComponent extend
|
|
|
3581
3612
|
i0.ɵɵproperty("IsOpen", ctx.showDuplicateDialog)("SourceViewName", ctx.duplicateSourceViewName)("Summary", ctx.duplicateSummary);
|
|
3582
3613
|
i0.ɵɵadvance();
|
|
3583
3614
|
i0.ɵɵproperty("IsOpen", ctx.showSharedViewWarning)("ViewName", (ctx.selectedViewEntity == null ? null : ctx.selectedViewEntity.Name) ?? "");
|
|
3584
|
-
} }, dependencies: [i6.DefaultValueAccessor, i6.NgControlStatus, i6.NgModel, i7.EntityViewerComponent, i7.EntityRecordDetailPanelComponent, i7.ViewConfigPanelComponent, i7.QuickSaveDialogComponent, i7.DuplicateViewDialogComponent, i7.SharedViewWarningDialogComponent, i3.LoadingComponent, i5.ExportDialogComponent, i8.ListManagementDialogComponent, i9.NavigationPanelComponent, i10.ViewSelectorComponent, i11.FilterDialogComponent, i12.DecimalPipe], styles: [".data-explorer-container[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.navigation-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\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: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\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: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\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: var(--mj-border-strong);\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: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left[_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: var(--mj-brand-primary);\n}\n\n.entity-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\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 var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n}\n.smart-filter-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n.smart-filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\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: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n.clear-filter-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\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: var(--mj-bg-surface-sunken);\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: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.header-action-btn[_ngcontent-%COMP%] {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n margin-left: 8px;\n}\n.header-action-btn[_ngcontent-%COMP%]:hover:not(.disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n.header-action-btn.disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.header-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n.selection-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 11px;\n font-weight: 600;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\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(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\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(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\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(--mj-bg-surface-active);\n border-color: var(--mj-brand-primary);\n}\n\n.date-field-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\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(--mj-bg-surface-card);\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\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(--mj-brand-primary);\n font-size: 12px;\n}\n\n\n\n.timeline-orientation-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\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: var(--mj-bg-surface);\n border-radius: 8px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n\n.loading-message[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\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: var(--mj-text-muted);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 40px;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: var(--mj-border-default);\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: var(--mj-text-primary);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n\n.home-view-concept-d[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n.home-main-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.home-main-area.panel-open[_ngcontent-%COMP%] {\n margin-right: 320px;\n}\n\n\n\n\n\n\n.search-hero[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n padding: 36px 40px 24px;\n text-align: center;\n}\n\n.search-hero-container[_ngcontent-%COMP%] {\n position: relative;\n max-width: 600px;\n margin: 0 auto;\n}\n\n.search-hero-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 14px 18px 14px 44px;\n font-size: 15px;\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n outline: none;\n transition: all 0.2s;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n font-family: inherit;\n}\n\n.search-hero-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1), 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.search-hero-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-primary);\n}\n\n.search-hero-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-primary);\n font-size: 15px;\n pointer-events: none;\n}\n\n.search-hero-shortcut[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 2px 7px;\n border-radius: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.search-hero-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\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: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.search-hero-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n\n\n.search-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: 16px;\n}\n\n.search-entity-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.pill-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n}\n\n.pill-btn[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pill-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pill-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pill-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n\n\n\n.entity-groups-area[_ngcontent-%COMP%] {\n padding: 12px 40px 60px;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.app-group[_ngcontent-%COMP%] {\n margin-bottom: 4px;\n}\n\n.app-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.12s;\n user-select: none;\n}\n\n.app-group-header[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.025);\n}\n\n.app-group-icon[_ngcontent-%COMP%] {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 17px;\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.app-group-name[_ngcontent-%COMP%] {\n font-size: 21px;\n font-weight: 600;\n flex: 1;\n}\n\n.app-group-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n padding: 2px 9px;\n border-radius: 10px;\n}\n\n.app-group-chevron[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s;\n}\n\n.app-group-chevron.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.app-group-entities[_ngcontent-%COMP%] {\n padding: 4px 14px 10px 60px;\n}\n\n\n\n\n\n\n.entity-item-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n\n.entity-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.entity-item[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.entity-item-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover .entity-item-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.entity-item-text[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.entity-item-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.entity-item-fav[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n opacity: 0;\n transition: opacity 0.12s;\n font-size: 11px;\n cursor: pointer;\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n align-self: center;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover .entity-item-fav[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.entity-item-fav.favorited[_ngcontent-%COMP%] {\n opacity: 1;\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n\n.quick-access-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n width: 320px;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 50;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n}\n\n.quick-access-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.qa-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n}\n\n.qa-close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n}\n\n.qa-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.qa-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n user-select: none;\n}\n\n.qa-section-header[_ngcontent-%COMP%] .qa-section-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.qa-section-header[_ngcontent-%COMP%] .qa-section-count[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n padding: 0 6px;\n border-radius: 8px;\n font-size: 10px;\n margin-left: auto;\n}\n\n.qa-section-header[_ngcontent-%COMP%] .qa-section-chevron[_ngcontent-%COMP%] {\n font-size: 10px;\n transition: transform 0.15s;\n}\n\n.qa-section.collapsed[_ngcontent-%COMP%] .qa-section-chevron[_ngcontent-%COMP%] {\n transform: rotate(-90deg);\n}\n\n.qa-section-body[_ngcontent-%COMP%] {\n padding: 0 8px 8px;\n}\n\n.qa-section.collapsed[_ngcontent-%COMP%] .qa-section-body[_ngcontent-%COMP%] {\n display: none;\n}\n\n.qa-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.08s;\n}\n\n.qa-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-item-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.qa-item-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.qa-item-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.qa-item-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.qa-item-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.qa-empty[_ngcontent-%COMP%] {\n padding: 20px 16px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n\n\n.qa-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n padding: 0 5px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n}\n\n\n\n.home-no-results[_ngcontent-%COMP%] {\n text-align: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n}\n\n.home-no-results[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n margin-bottom: 10px;\n display: block;\n}\n\n.home-no-results[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin: 0;\n}\n\n.detail-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\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 display: flex;\n flex-direction: column;\n}\n\n.detail-panel[_ngcontent-%COMP%] mj-entity-record-detail-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: hidden;\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\n\n\n.detail-panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.detail-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.detail-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\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: 16px 24px 8px;\n}\n\n.content-body.home-content[_ngcontent-%COMP%] {\n padding: 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: var(--mj-text-muted);\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.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: var(--mj-bg-surface-card);\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-item-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(200px, 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 .search-hero[_ngcontent-%COMP%] {\n padding: 24px 16px 16px;\n }\n\n .entity-groups-area[_ngcontent-%COMP%] {\n padding: 8px 16px 40px;\n }\n\n .app-group-entities[_ngcontent-%COMP%] {\n padding-left: 36px;\n }\n\n .home-main-area.panel-open[_ngcontent-%COMP%] {\n margin-right: 0;\n }\n\n .quick-access-panel[_ngcontent-%COMP%] {\n width: 100%;\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-item-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .view-mode-toggle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .app-group-name[_ngcontent-%COMP%] {\n font-size: 17px;\n }\n\n .entity-item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n}"], data: { animation: [
|
|
3615
|
+
} }, dependencies: [i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel, i5.EntityViewerComponent, i5.EntityRecordDetailPanelComponent, i5.ViewConfigPanelComponent, i5.QuickSaveDialogComponent, i5.DuplicateViewDialogComponent, i5.SharedViewWarningDialogComponent, i2.LoadingComponent, i3.ExportDialogComponent, i6.ListManagementDialogComponent, i7.NavigationPanelComponent, i8.ViewSelectorComponent, i9.FilterDialogComponent, i10.DecimalPipe], styles: [".data-explorer-container[_ngcontent-%COMP%] {\n display: flex;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.navigation-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\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: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\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: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\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: var(--mj-border-strong);\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: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n position: relative;\n z-index: 1100; \n\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: var(--mj-brand-primary);\n}\n\n.entity-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\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 var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n}\n.smart-filter-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n.smart-filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\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: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n.clear-filter-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\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: var(--mj-bg-surface-sunken);\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: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.header-action-btn[_ngcontent-%COMP%] {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n margin-left: 8px;\n}\n.header-action-btn[_ngcontent-%COMP%]:hover:not(.disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n.header-action-btn.disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.header-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n.selection-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 11px;\n font-weight: 600;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\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(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\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(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\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(--mj-bg-surface-active);\n border-color: var(--mj-brand-primary);\n}\n\n.date-field-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\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(--mj-bg-surface-card);\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item.selected[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\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(--mj-brand-primary);\n font-size: 12px;\n}\n\n\n\n\n.view-specific-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.view-specific-btn[_ngcontent-%COMP%] {\n width: 30px;\n height: 30px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.view-specific-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.timeline-orientation-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\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: var(--mj-bg-surface);\n border-radius: 8px;\n}\n\n.loading-spinner[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n\n.loading-message[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\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: var(--mj-text-muted);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 40px;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: var(--mj-border-default);\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: var(--mj-text-primary);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n\n.home-view-concept-d[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n.home-main-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.home-main-area.panel-open[_ngcontent-%COMP%] {\n margin-right: 320px;\n}\n\n\n\n\n\n\n.search-hero[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n padding: 36px 40px 24px;\n text-align: center;\n}\n\n.search-hero-container[_ngcontent-%COMP%] {\n position: relative;\n max-width: 600px;\n margin: 0 auto;\n}\n\n.search-hero-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 14px 18px 14px 44px;\n font-size: 15px;\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n outline: none;\n transition: all 0.2s;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n font-family: inherit;\n}\n\n.search-hero-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1), 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.search-hero-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-primary);\n}\n\n.search-hero-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-primary);\n font-size: 15px;\n pointer-events: none;\n}\n\n.search-hero-shortcut[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 2px 7px;\n border-radius: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.search-hero-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 14px;\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: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.search-hero-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n\n\n.search-meta-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: 16px;\n}\n\n.search-entity-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.pill-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n}\n\n.pill-btn[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pill-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pill-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pill-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n\n\n\n\n.entity-groups-area[_ngcontent-%COMP%] {\n padding: 12px 40px 60px;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.app-group[_ngcontent-%COMP%] {\n margin-bottom: 4px;\n}\n\n.app-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.12s;\n user-select: none;\n}\n\n.app-group-header[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.025);\n}\n\n.app-group-icon[_ngcontent-%COMP%] {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 17px;\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.app-group-name[_ngcontent-%COMP%] {\n font-size: 21px;\n font-weight: 600;\n flex: 1;\n}\n\n.app-group-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n padding: 2px 9px;\n border-radius: 10px;\n}\n\n.app-group-chevron[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s;\n}\n\n.app-group-chevron.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.app-group-entities[_ngcontent-%COMP%] {\n padding: 4px 14px 10px 60px;\n}\n\n\n\n\n\n\n.entity-item-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n\n.entity-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.entity-item[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.entity-item-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover .entity-item-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.entity-item-text[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.entity-item-desc[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.entity-item-fav[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n opacity: 0;\n transition: opacity 0.12s;\n font-size: 11px;\n cursor: pointer;\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n align-self: center;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover .entity-item-fav[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.entity-item-fav.favorited[_ngcontent-%COMP%] {\n opacity: 1;\n color: var(--mj-status-warning);\n}\n\n\n\n\n\n\n.quick-access-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n width: 320px;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 50;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n}\n\n.quick-access-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.qa-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n}\n\n.qa-close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n}\n\n.qa-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.qa-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n user-select: none;\n}\n\n.qa-section-header[_ngcontent-%COMP%] .qa-section-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.qa-section-header[_ngcontent-%COMP%] .qa-section-count[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n padding: 0 6px;\n border-radius: 8px;\n font-size: 10px;\n margin-left: auto;\n}\n\n.qa-section-header[_ngcontent-%COMP%] .qa-section-chevron[_ngcontent-%COMP%] {\n font-size: 10px;\n transition: transform 0.15s;\n}\n\n.qa-section.collapsed[_ngcontent-%COMP%] .qa-section-chevron[_ngcontent-%COMP%] {\n transform: rotate(-90deg);\n}\n\n.qa-section-body[_ngcontent-%COMP%] {\n padding: 0 8px 8px;\n}\n\n.qa-section.collapsed[_ngcontent-%COMP%] .qa-section-body[_ngcontent-%COMP%] {\n display: none;\n}\n\n.qa-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.08s;\n}\n\n.qa-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-item-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.qa-item-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.qa-item-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.qa-item-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.qa-item-time[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.qa-empty[_ngcontent-%COMP%] {\n padding: 20px 16px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n\n\n.qa-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n padding: 0 5px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n}\n\n\n\n.home-no-results[_ngcontent-%COMP%] {\n text-align: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n}\n\n.home-no-results[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n margin-bottom: 10px;\n display: block;\n}\n\n.home-no-results[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n margin: 0;\n}\n\n.detail-panel[_ngcontent-%COMP%] {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\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 display: flex;\n flex-direction: column;\n}\n\n.detail-panel[_ngcontent-%COMP%] mj-entity-record-detail-panel[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: hidden;\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\n\n\n.detail-panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.detail-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.detail-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\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: 16px 24px 8px;\n}\n\n.content-body.home-content[_ngcontent-%COMP%] {\n padding: 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: var(--mj-text-muted);\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.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: var(--mj-bg-surface-card);\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-item-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(200px, 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 .search-hero[_ngcontent-%COMP%] {\n padding: 24px 16px 16px;\n }\n\n .entity-groups-area[_ngcontent-%COMP%] {\n padding: 8px 16px 40px;\n }\n\n .app-group-entities[_ngcontent-%COMP%] {\n padding-left: 36px;\n }\n\n .home-main-area.panel-open[_ngcontent-%COMP%] {\n margin-right: 0;\n }\n\n .quick-access-panel[_ngcontent-%COMP%] {\n width: 100%;\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-item-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .view-mode-toggle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .app-group-name[_ngcontent-%COMP%] {\n font-size: 17px;\n }\n\n .entity-item-name[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n}"], data: { animation: [
|
|
3585
3616
|
trigger('slideInLeft', [
|
|
3586
3617
|
transition(':enter', [
|
|
3587
3618
|
style({ transform: 'translateX(-100%)', opacity: 0 }),
|
|
@@ -3609,8 +3640,8 @@ export { DataExplorerDashboardComponent };
|
|
|
3609
3640
|
animate('200ms ease-in', style({ transform: 'translateX(-100%)', opacity: 0 }))
|
|
3610
3641
|
])
|
|
3611
3642
|
])
|
|
3612
|
-
], 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 [appEntityGroups]=\"appEntityGroups\"\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.DisplayNameOrName }}</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 (duplicateViewRequested)=\"onDuplicateView($event)\"\n (quickSaveRequested)=\"onQuickSaveRequested($event)\"\n (revertRequested)=\"onRevertView()\">\n </mj-view-selector>\n\n <!-- Add to List Button -->\n <button\n class=\"header-action-btn\"\n [class.disabled]=\"!hasSelectedRecords\"\n [disabled]=\"!hasSelectedRecords\"\n (click)=\"onAddToListClick()\"\n [title]=\"hasSelectedRecords ? 'Add ' + selectedRecords.length + ' selected record(s) to a list' : 'Select records to add to a list'\">\n <i class=\"fa-solid fa-list-check\"></i>\n @if (hasSelectedRecords) {\n <span class=\"selection-badge\">{{ selectedRecords.length }}</span>\n }\n </button>\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 [value]=\"liveFilterText\"\n (input)=\"onFilterInputChanged(filterInput.value)\"\n />\n @if (liveFilterText) {\n <button class=\"clear-filter-btn\" (click)=\"clearRecordFilter()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n <!-- Home-level search moved to search hero section -->\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 @if (!selectedEntity) {\n <!-- Quick Access panel toggle -->\n <button\n class=\"header-action-btn\"\n [class.active]=\"state.quickAccessPanelOpen\"\n (click)=\"toggleQuickAccessPanel()\"\n title=\"Recents & Favorites\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n @if (recentRecords.length + favoriteRecords.length > 0) {\n <span class=\"qa-badge\">{{ recentRecords.length + favoriteRecords.length }}</span>\n }\n </button>\n }\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 <!-- Concept D: Application Groups + Search-First Home View -->\n <div class=\"home-view-concept-d\">\n @if (isLoadingEntities) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading entities...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <div class=\"home-main-area\" [class.panel-open]=\"state.quickAccessPanelOpen\">\n <!-- Search Hero -->\n <div class=\"search-hero\">\n <div class=\"search-hero-container\">\n <i class=\"fa-solid fa-magnifying-glass search-hero-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"search-hero-input\"\n placeholder=\"Search entities...\"\n [(ngModel)]=\"entityFilterText\"\n />\n @if (entityFilterText) {\n <button class=\"search-hero-clear\" (click)=\"entityFilterText = ''\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n } @else {\n <span class=\"search-hero-shortcut\">/</span>\n }\n </div>\n\n <!-- Meta row: entity count + All/Favorites pills -->\n <div class=\"search-meta-row\">\n <span class=\"search-entity-count\">\n {{ filteredEntityCount }} entities\n @if (applicationCount > 0) {\n across {{ applicationCount }} applications\n }\n </span>\n <div class=\"pill-toggle\">\n <button\n class=\"pill-btn\"\n [class.active]=\"state.homeViewMode === 'all'\"\n (click)=\"setHomeViewMode('all')\">\n All Entities\n </button>\n <button\n class=\"pill-btn\"\n [class.active]=\"state.homeViewMode === 'favorites'\"\n (click)=\"setHomeViewMode('favorites')\">\n <i class=\"fa-solid fa-star\"></i> My Favorites\n </button>\n </div>\n </div>\n </div>\n\n <!-- Entity Groups Area -->\n <div class=\"entity-groups-area\">\n @if (entityFilter?.applicationId) {\n <!-- Single-app mode: flat entity grid (no grouping) -->\n <div class=\"entity-item-grid\">\n @for (entity of flatFilteredEntities; track entity.ID) {\n <div\n class=\"entity-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.DisplayNameOrName\">\n <div class=\"entity-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-item-text\">\n <span class=\"entity-item-name\">{{ entity.DisplayNameOrName }}</span>\n @if (entity.Description) {\n <span class=\"entity-item-desc\">{{ entity.Description }}</span>\n }\n </div>\n <button\n class=\"entity-item-fav\"\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 } @else {\n <!-- Multi-app mode: grouped by application -->\n @for (group of filteredAppEntityGroups; track group.applicationId) {\n <div class=\"app-group\">\n <div class=\"app-group-header\" (click)=\"toggleAppGroup(group.applicationId)\">\n <div\n class=\"app-group-icon\"\n [style.background]=\"group.applicationColor ? group.applicationColor + '15' : null\"\n [style.color]=\"group.applicationColor || null\">\n <i [class]=\"group.applicationIcon || 'fa-solid fa-folder'\"></i>\n </div>\n <span class=\"app-group-name\">{{ group.applicationName }}</span>\n <span class=\"app-group-count\">{{ group.entities.length }}</span>\n <i class=\"fa-solid fa-chevron-right app-group-chevron\"\n [class.expanded]=\"group.isExpanded\"></i>\n </div>\n @if (group.isExpanded) {\n <div class=\"app-group-entities\">\n <div class=\"entity-item-grid\">\n @for (entity of group.entities; track entity.ID) {\n <div\n class=\"entity-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.DisplayNameOrName\">\n <div class=\"entity-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-item-text\">\n <span class=\"entity-item-name\">{{ entity.DisplayNameOrName }}</span>\n @if (entity.Description) {\n <span class=\"entity-item-desc\">{{ entity.Description }}</span>\n }\n </div>\n <button\n class=\"entity-item-fav\"\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 </div>\n }\n }\n\n <!-- No results -->\n @if (filteredEntityCount === 0 && entities.length > 0) {\n <div class=\"home-no-results\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\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 </div>\n\n <!-- Quick Access Panel (right slide-in) -->\n <div class=\"quick-access-panel\" [class.open]=\"state.quickAccessPanelOpen\">\n <div class=\"qa-header\">\n <h3>Quick Access</h3>\n <button class=\"qa-close-btn\" (click)=\"toggleQuickAccessPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"qa-body\">\n <!-- Recent Records (max 3) -->\n <div class=\"qa-section\" [class.collapsed]=\"!isQuickAccessSectionExpanded('recentRecords')\">\n <div class=\"qa-section-header\" (click)=\"toggleQuickAccessSection('recentRecords')\">\n <i class=\"fa-solid fa-clock-rotate-left qa-section-icon\"></i>\n <span>Recent Records</span>\n <span class=\"qa-section-count\">{{ quickAccessRecentRecords.length }}</span>\n <i class=\"fa-solid fa-chevron-down qa-section-chevron\"></i>\n </div>\n <div class=\"qa-section-body\">\n @for (record of quickAccessRecentRecords; track record.entityId + '|' + record.recordId) {\n <div class=\"qa-item\" (click)=\"onRecentRecordClick(record)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ record.recordName || record.recordId }}</div>\n <div class=\"qa-item-meta\">{{ record.entityName }}</div>\n </div>\n <span class=\"qa-item-time\">{{ formatRelativeTime(record.latestAt) }}</span>\n </div>\n }\n @if (quickAccessRecentRecords.length === 0) {\n <div class=\"qa-empty\">No recent records</div>\n }\n </div>\n </div>\n\n <!-- Recent Entities (max 3) -->\n <div class=\"qa-section\" [class.collapsed]=\"!isQuickAccessSectionExpanded('recentEntities')\">\n <div class=\"qa-section-header\" (click)=\"toggleQuickAccessSection('recentEntities')\">\n <i class=\"fa-solid fa-table qa-section-icon\"></i>\n <span>Recent Entities</span>\n <span class=\"qa-section-count\">{{ quickAccessRecentEntities.length }}</span>\n <i class=\"fa-solid fa-chevron-down qa-section-chevron\"></i>\n </div>\n <div class=\"qa-section-body\">\n @for (entity of quickAccessRecentEntities; track entity.ID) {\n <div class=\"qa-item\" (click)=\"onEntitySelected(entity)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ entity.DisplayNameOrName }}</div>\n </div>\n </div>\n }\n @if (quickAccessRecentEntities.length === 0) {\n <div class=\"qa-empty\">No recent entities</div>\n }\n </div>\n </div>\n\n <!-- Favorite Records (max 3) -->\n <div class=\"qa-section\" [class.collapsed]=\"!isQuickAccessSectionExpanded('favoriteRecords')\">\n <div class=\"qa-section-header\" (click)=\"toggleQuickAccessSection('favoriteRecords')\">\n <i class=\"fa-solid fa-star qa-section-icon\" style=\"color: var(--mj-status-warning);\"></i>\n <span>Favorite Records</span>\n <span class=\"qa-section-count\">{{ quickAccessFavoriteRecords.length }}</span>\n <i class=\"fa-solid fa-chevron-down qa-section-chevron\"></i>\n </div>\n <div class=\"qa-section-body\">\n @for (record of quickAccessFavoriteRecords; track record.userFavoriteId) {\n <div class=\"qa-item\" (click)=\"onFavoriteRecordClick(record)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ record.recordName || record.recordId }}</div>\n <div class=\"qa-item-meta\">{{ record.entityName }}</div>\n </div>\n </div>\n }\n @if (quickAccessFavoriteRecords.length === 0) {\n <div class=\"qa-empty\">No favorite records</div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n <mj-entity-viewer\n #entityViewer\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 [gridSelectionMode]=\"'checkbox'\"\n [showGridToolbar]=\"false\"\n [showAddToListButton]=\"false\"\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 (selectionChanged)=\"onSelectionChanged($event)\"\n (addToListRequested)=\"onAddToListRequested($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 <!-- Detail Panel Actions Bar -->\n <div class=\"detail-panel-actions\">\n <button\n class=\"detail-action-btn\"\n (click)=\"openListManagementDialog()\"\n title=\"Add to List\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span>Add to List</span>\n </button>\n </div>\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 [DefaultSaveAsNew]=\"defaultSaveAsNew\"\n [PendingNewViewName]=\"pendingNewViewName\"\n [PendingNewViewDescription]=\"pendingNewViewDescription\"\n [PendingNewViewIsShared]=\"pendingNewViewIsShared\"\n (close)=\"onCloseViewConfigPanel()\"\n (save)=\"onSaveView($event)\"\n (saveDefaults)=\"onSaveDefaultViewSettings($event)\"\n (delete)=\"onDeleteView()\"\n (duplicate)=\"onDuplicateFromPanel()\"\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 <!-- Export Dialog -->\n <mj-export-dialog\n [visible]=\"showExportDialog\"\n [config]=\"exportDialogConfig\"\n (closed)=\"onExportDialogClosed($event)\">\n </mj-export-dialog>\n\n <!-- List Management Dialog -->\n @if (showListManagementDialog && listManagementConfig) {\n <mj-list-management-dialog\n [config]=\"listManagementConfig\"\n [visible]=\"showListManagementDialog\"\n (complete)=\"onListManagementComplete($event)\"\n (cancel)=\"onListManagementCancel()\">\n </mj-list-management-dialog>\n }\n\n <!-- Quick Save Dialog (F-001) -->\n <mj-quick-save-dialog\n [IsOpen]=\"showQuickSaveDialog\"\n [ViewEntity]=\"selectedViewEntity\"\n [EntityName]=\"selectedEntity?.DisplayNameOrName ?? ''\"\n [Summary]=\"quickSaveSummary\"\n [IsSaving]=\"isSavingView\"\n [DefaultSaveAsNew]=\"defaultSaveAsNew\"\n (Save)=\"onQuickSave($event)\"\n (Close)=\"onQuickSaveClose()\"\n (OpenAdvanced)=\"onQuickSaveOpenAdvanced($event)\">\n </mj-quick-save-dialog>\n\n <!-- Duplicate View Dialog (F-005) -->\n <mj-duplicate-view-dialog\n [IsOpen]=\"showDuplicateDialog\"\n [SourceViewName]=\"duplicateSourceViewName\"\n [Summary]=\"duplicateSummary\"\n (Duplicate)=\"onDuplicateConfirmed($event)\"\n (Cancel)=\"onDuplicateCancel()\">\n </mj-duplicate-view-dialog>\n\n <!-- Shared View Warning Dialog (view-creation-flow Scenario 5) -->\n <mj-shared-view-warning-dialog\n [IsOpen]=\"showSharedViewWarning\"\n [ViewName]=\"selectedViewEntity?.Name ?? ''\"\n (Action)=\"onSharedViewAction($event)\"\n (Cancel)=\"onSharedViewWarningCancel()\">\n </mj-shared-view-warning-dialog>\n</div>\n", styles: [".data-explorer-container {\n display: flex;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.navigation-panel {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\n}\n\n/* Breadcrumb Bar */\n.breadcrumb-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\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: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current {\n color: var(--mj-text-primary);\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: var(--mj-border-strong);\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: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n}\n\n.header-left {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-shrink: 0;\n flex-wrap: wrap;\n}\n\n/* 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: var(--mj-brand-primary);\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.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 var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n}\n.smart-filter-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n.smart-filter-input::placeholder {\n color: var(--mj-text-muted);\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: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n.clear-filter-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\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: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Header Action Button (Add to List, etc.) */\n.header-action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n margin-left: 8px;\n}\n.header-action-btn:hover:not(.disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n.header-action-btn.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.header-action-btn i {\n font-size: 14px;\n}\n.selection-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 11px;\n font-weight: 600;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\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(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\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(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\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(--mj-bg-surface-active);\n border-color: var(--mj-brand-primary);\n}\n\n.date-field-icon {\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\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(--mj-bg-surface-card);\n}\n\n.date-field-dropdown-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item.selected:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item .item-icon {\n color: var(--mj-text-secondary);\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(--mj-brand-primary);\n font-size: 12px;\n}\n\n/* Timeline Orientation Toggle */\n.timeline-orientation-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\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: var(--mj-bg-surface);\n border-radius: 8px;\n}\n\n.loading-spinner {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n\n.loading-message {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\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: var(--mj-text-muted);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 40px;\n}\n\n.empty-icon {\n font-size: 64px;\n color: var(--mj-border-default);\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: var(--mj-text-primary);\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n color: var(--mj-text-secondary);\n}\n\n/* ============================================\n CONCEPT D: HOME VIEW LAYOUT\n ============================================ */\n\n.home-view-concept-d {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n.home-main-area {\n flex: 1;\n overflow-y: auto;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.home-main-area.panel-open {\n margin-right: 320px;\n}\n\n/* ============================================\n SEARCH HERO\n ============================================ */\n\n.search-hero {\n background: var(--mj-bg-surface);\n padding: 36px 40px 24px;\n text-align: center;\n}\n\n.search-hero-container {\n position: relative;\n max-width: 600px;\n margin: 0 auto;\n}\n\n.search-hero-input {\n width: 100%;\n padding: 14px 18px 14px 44px;\n font-size: 15px;\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n outline: none;\n transition: all 0.2s;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n font-family: inherit;\n}\n\n.search-hero-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1), 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.search-hero-input::placeholder {\n color: var(--mj-text-primary);\n}\n\n.search-hero-icon {\n position: absolute;\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-primary);\n font-size: 15px;\n pointer-events: none;\n}\n\n.search-hero-shortcut {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 2px 7px;\n border-radius: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.search-hero-clear {\n position: absolute;\n right: 14px;\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: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.search-hero-clear:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n/* Meta row: entity count + pills */\n.search-meta-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: 16px;\n}\n\n.search-entity-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.pill-toggle {\n display: flex;\n gap: 6px;\n}\n\n.pill-btn {\n padding: 6px 16px;\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pill-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pill-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pill-btn i {\n font-size: 11px;\n}\n\n/* ============================================\n APPLICATION GROUPS\n ============================================ */\n\n.entity-groups-area {\n padding: 12px 40px 60px;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.app-group {\n margin-bottom: 4px;\n}\n\n.app-group-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.12s;\n user-select: none;\n}\n\n.app-group-header:hover {\n background: rgba(0, 0, 0, 0.025);\n}\n\n.app-group-icon {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 17px;\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.app-group-name {\n font-size: 21px;\n font-weight: 600;\n flex: 1;\n}\n\n.app-group-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n padding: 2px 9px;\n border-radius: 10px;\n}\n\n.app-group-chevron {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s;\n}\n\n.app-group-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.app-group-entities {\n padding: 4px 14px 10px 60px;\n}\n\n/* ============================================\n ENTITY ITEM GRID (pills)\n ============================================ */\n\n.entity-item-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n\n.entity-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.entity-item:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.entity-item-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.entity-item:hover .entity-item-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.entity-item-text {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-item-name {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.entity-item-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.entity-item-fav {\n color: var(--mj-text-muted);\n opacity: 0;\n transition: opacity 0.12s;\n font-size: 11px;\n cursor: pointer;\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n align-self: center;\n}\n\n.entity-item:hover .entity-item-fav {\n opacity: 1;\n}\n\n.entity-item-fav.favorited {\n opacity: 1;\n color: var(--mj-status-warning);\n}\n\n/* ============================================\n QUICK ACCESS PANEL (right slide-in)\n ============================================ */\n\n.quick-access-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 320px;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 50;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n}\n\n.quick-access-panel.open {\n transform: translateX(0);\n}\n\n.qa-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-header h3 {\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n}\n\n.qa-close-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n}\n\n.qa-close-btn:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-body {\n flex: 1;\n overflow-y: auto;\n}\n\n.qa-section {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n user-select: none;\n}\n\n.qa-section-header .qa-section-icon {\n font-size: 12px;\n}\n\n.qa-section-header .qa-section-count {\n background: var(--mj-bg-surface-card);\n padding: 0 6px;\n border-radius: 8px;\n font-size: 10px;\n margin-left: auto;\n}\n\n.qa-section-header .qa-section-chevron {\n font-size: 10px;\n transition: transform 0.15s;\n}\n\n.qa-section.collapsed .qa-section-chevron {\n transform: rotate(-90deg);\n}\n\n.qa-section-body {\n padding: 0 8px 8px;\n}\n\n.qa-section.collapsed .qa-section-body {\n display: none;\n}\n\n.qa-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.08s;\n}\n\n.qa-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-item-icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.qa-item-info {\n flex: 1;\n min-width: 0;\n}\n\n.qa-item-name {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.qa-item-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.qa-item-time {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.qa-empty {\n padding: 20px 16px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n/* Quick Access toggle button badge */\n.qa-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n padding: 0 5px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n}\n\n/* No results state for home view */\n.home-no-results {\n text-align: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n}\n\n.home-no-results i {\n font-size: 28px;\n margin-bottom: 10px;\n display: block;\n}\n\n.home-no-results p {\n font-size: 14px;\n margin: 0;\n}\n\n.detail-panel {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n.detail-panel mj-entity-record-detail-panel {\n flex: 1;\n min-height: 0;\n overflow: hidden;\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\n/* Detail Panel Actions Bar */\n.detail-panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.detail-action-btn:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.detail-action-btn i {\n font-size: 12px;\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: 16px 24px 8px;\n}\n\n.content-body.home-content {\n padding: 0;\n}\n\n/* Smart filter with search icon (entity-level filter) */\n.filter-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\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 VIEW MODE TOGGLE OVERRIDES\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: var(--mj-bg-surface-card);\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-item-grid {\n grid-template-columns: repeat(auto-fill, minmax(200px, 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 .search-hero {\n padding: 24px 16px 16px;\n }\n\n .entity-groups-area {\n padding: 8px 16px 40px;\n }\n\n .app-group-entities {\n padding-left: 36px;\n }\n\n .home-main-area.panel-open {\n margin-right: 0;\n }\n\n .quick-access-panel {\n width: 100%;\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-item-grid {\n grid-template-columns: 1fr;\n }\n\n .view-mode-toggle {\n display: none;\n }\n\n .app-group-name {\n font-size: 17px;\n }\n\n .entity-item-name {\n font-size: 14px;\n }\n}\n"] }]
|
|
3613
|
-
}], () => [{ type: i1.ExplorerStateService }, { type: i0.ChangeDetectorRef }, { type: i2.
|
|
3643
|
+
], 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 [appEntityGroups]=\"appEntityGroups\"\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.DisplayNameOrName }}</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 (duplicateViewRequested)=\"onDuplicateView($event)\"\n (quickSaveRequested)=\"onQuickSaveRequested($event)\"\n (revertRequested)=\"onRevertView()\">\n </mj-view-selector>\n\n <!-- Add to List Button -->\n <button\n class=\"header-action-btn\"\n [class.disabled]=\"!hasSelectedRecords\"\n [disabled]=\"!hasSelectedRecords\"\n (click)=\"onAddToListClick()\"\n [title]=\"hasSelectedRecords ? 'Add ' + selectedRecords.length + ' selected record(s) to a list' : 'Select records to add to a list'\">\n <i class=\"fa-solid fa-list-check\"></i>\n @if (hasSelectedRecords) {\n <span class=\"selection-badge\">{{ selectedRecords.length }}</span>\n }\n </button>\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 [value]=\"liveFilterText\"\n (input)=\"onFilterInputChanged(filterInput.value)\"\n />\n @if (liveFilterText) {\n <button class=\"clear-filter-btn\" (click)=\"clearRecordFilter()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n <!-- Home-level search moved to search hero section -->\n </div>\n\n <div class=\"header-right\">\n @if (selectedEntity) {\n <!-- View-specific controls \u2014 positioned LEFT of the view mode toggle -->\n <!-- These controls are contextual to the active view mode -->\n @if (state.viewMode === 'timeline' && entityHasDateFields) {\n <div class=\"view-specific-controls\">\n <!-- Date Field Selector -->\n <div class=\"date-field-selector-container\">\n @if (isDateFieldDropdownOpen) {\n <div class=\"date-field-backdrop\" (click)=\"closeDateFieldDropdown()\"></div>\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 @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 <!-- Orientation Toggle -->\n <button\n class=\"view-specific-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 <!-- Sort Order Toggle -->\n <button\n class=\"view-specific-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 <!-- View Mode Toggle \u2014 always rightmost in the header -->\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 @if (selectedEntity?.SupportsGeoCoding) {\n <button\n class=\"toggle-btn\"\n [class.active]=\"state.viewMode === 'map'\"\n (click)=\"onViewModeChanged('map')\"\n title=\"Map View\">\n <i class=\"fa-solid fa-map-location-dot\"></i>\n </button>\n }\n </div>\n }\n @if (!selectedEntity) {\n <!-- Quick Access panel toggle -->\n <button\n class=\"header-action-btn\"\n [class.active]=\"state.quickAccessPanelOpen\"\n (click)=\"toggleQuickAccessPanel()\"\n title=\"Recents & Favorites\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n @if (recentRecords.length + favoriteRecords.length > 0) {\n <span class=\"qa-badge\">{{ recentRecords.length + favoriteRecords.length }}</span>\n }\n </button>\n }\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 <!-- Concept D: Application Groups + Search-First Home View -->\n <div class=\"home-view-concept-d\">\n @if (isLoadingEntities) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading entities...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <div class=\"home-main-area\" [class.panel-open]=\"state.quickAccessPanelOpen\">\n <!-- Search Hero -->\n <div class=\"search-hero\">\n <div class=\"search-hero-container\">\n <i class=\"fa-solid fa-magnifying-glass search-hero-icon\"></i>\n <input\n #filterInput\n type=\"text\"\n class=\"search-hero-input\"\n placeholder=\"Search entities...\"\n [(ngModel)]=\"entityFilterText\"\n />\n @if (entityFilterText) {\n <button class=\"search-hero-clear\" (click)=\"entityFilterText = ''\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n } @else {\n <span class=\"search-hero-shortcut\">/</span>\n }\n </div>\n\n <!-- Meta row: entity count + All/Favorites pills -->\n <div class=\"search-meta-row\">\n <span class=\"search-entity-count\">\n {{ filteredEntityCount }} entities\n @if (applicationCount > 0) {\n across {{ applicationCount }} applications\n }\n </span>\n <div class=\"pill-toggle\">\n <button\n class=\"pill-btn\"\n [class.active]=\"state.homeViewMode === 'all'\"\n (click)=\"setHomeViewMode('all')\">\n All Entities\n </button>\n <button\n class=\"pill-btn\"\n [class.active]=\"state.homeViewMode === 'favorites'\"\n (click)=\"setHomeViewMode('favorites')\">\n <i class=\"fa-solid fa-star\"></i> My Favorites\n </button>\n </div>\n </div>\n </div>\n\n <!-- Entity Groups Area -->\n <div class=\"entity-groups-area\">\n @if (entityFilter?.applicationId) {\n <!-- Single-app mode: flat entity grid (no grouping) -->\n <div class=\"entity-item-grid\">\n @for (entity of flatFilteredEntities; track entity.ID) {\n <div\n class=\"entity-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.DisplayNameOrName\">\n <div class=\"entity-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-item-text\">\n <span class=\"entity-item-name\">{{ entity.DisplayNameOrName }}</span>\n @if (entity.Description) {\n <span class=\"entity-item-desc\">{{ entity.Description }}</span>\n }\n </div>\n <button\n class=\"entity-item-fav\"\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 } @else {\n <!-- Multi-app mode: grouped by application -->\n @for (group of filteredAppEntityGroups; track group.applicationId) {\n <div class=\"app-group\">\n <div class=\"app-group-header\" (click)=\"toggleAppGroup(group.applicationId)\">\n <div\n class=\"app-group-icon\"\n [style.background]=\"group.applicationColor ? group.applicationColor + '15' : null\"\n [style.color]=\"group.applicationColor || null\">\n <i [class]=\"group.applicationIcon || 'fa-solid fa-folder'\"></i>\n </div>\n <span class=\"app-group-name\">{{ group.applicationName }}</span>\n <span class=\"app-group-count\">{{ group.entities.length }}</span>\n <i class=\"fa-solid fa-chevron-right app-group-chevron\"\n [class.expanded]=\"group.isExpanded\"></i>\n </div>\n @if (group.isExpanded) {\n <div class=\"app-group-entities\">\n <div class=\"entity-item-grid\">\n @for (entity of group.entities; track entity.ID) {\n <div\n class=\"entity-item\"\n (click)=\"onEntitySelected(entity)\"\n [title]=\"entity.Description || entity.DisplayNameOrName\">\n <div class=\"entity-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"entity-item-text\">\n <span class=\"entity-item-name\">{{ entity.DisplayNameOrName }}</span>\n @if (entity.Description) {\n <span class=\"entity-item-desc\">{{ entity.Description }}</span>\n }\n </div>\n <button\n class=\"entity-item-fav\"\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 </div>\n }\n }\n\n <!-- No results -->\n @if (filteredEntityCount === 0 && entities.length > 0) {\n <div class=\"home-no-results\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\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 </div>\n\n <!-- Quick Access Panel (right slide-in) -->\n <div class=\"quick-access-panel\" [class.open]=\"state.quickAccessPanelOpen\">\n <div class=\"qa-header\">\n <h3>Quick Access</h3>\n <button class=\"qa-close-btn\" (click)=\"toggleQuickAccessPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"qa-body\">\n <!-- Recent Records (max 3) -->\n <div class=\"qa-section\" [class.collapsed]=\"!isQuickAccessSectionExpanded('recentRecords')\">\n <div class=\"qa-section-header\" (click)=\"toggleQuickAccessSection('recentRecords')\">\n <i class=\"fa-solid fa-clock-rotate-left qa-section-icon\"></i>\n <span>Recent Records</span>\n <span class=\"qa-section-count\">{{ quickAccessRecentRecords.length }}</span>\n <i class=\"fa-solid fa-chevron-down qa-section-chevron\"></i>\n </div>\n <div class=\"qa-section-body\">\n @for (record of quickAccessRecentRecords; track record.entityId + '|' + record.recordId) {\n <div class=\"qa-item\" (click)=\"onRecentRecordClick(record)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ record.recordName || record.recordId }}</div>\n <div class=\"qa-item-meta\">{{ record.entityName }}</div>\n </div>\n <span class=\"qa-item-time\">{{ formatRelativeTime(record.latestAt) }}</span>\n </div>\n }\n @if (quickAccessRecentRecords.length === 0) {\n <div class=\"qa-empty\">No recent records</div>\n }\n </div>\n </div>\n\n <!-- Recent Entities (max 3) -->\n <div class=\"qa-section\" [class.collapsed]=\"!isQuickAccessSectionExpanded('recentEntities')\">\n <div class=\"qa-section-header\" (click)=\"toggleQuickAccessSection('recentEntities')\">\n <i class=\"fa-solid fa-table qa-section-icon\"></i>\n <span>Recent Entities</span>\n <span class=\"qa-section-count\">{{ quickAccessRecentEntities.length }}</span>\n <i class=\"fa-solid fa-chevron-down qa-section-chevron\"></i>\n </div>\n <div class=\"qa-section-body\">\n @for (entity of quickAccessRecentEntities; track entity.ID) {\n <div class=\"qa-item\" (click)=\"onEntitySelected(entity)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIcon(entity)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ entity.DisplayNameOrName }}</div>\n </div>\n </div>\n }\n @if (quickAccessRecentEntities.length === 0) {\n <div class=\"qa-empty\">No recent entities</div>\n }\n </div>\n </div>\n\n <!-- Favorite Records (max 3) -->\n <div class=\"qa-section\" [class.collapsed]=\"!isQuickAccessSectionExpanded('favoriteRecords')\">\n <div class=\"qa-section-header\" (click)=\"toggleQuickAccessSection('favoriteRecords')\">\n <i class=\"fa-solid fa-star qa-section-icon\" style=\"color: var(--mj-status-warning);\"></i>\n <span>Favorite Records</span>\n <span class=\"qa-section-count\">{{ quickAccessFavoriteRecords.length }}</span>\n <i class=\"fa-solid fa-chevron-down qa-section-chevron\"></i>\n </div>\n <div class=\"qa-section-body\">\n @for (record of quickAccessFavoriteRecords; track record.userFavoriteId) {\n <div class=\"qa-item\" (click)=\"onFavoriteRecordClick(record)\">\n <div class=\"qa-item-icon\">\n <i [class]=\"getEntityIconById(record.entityId)\"></i>\n </div>\n <div class=\"qa-item-info\">\n <div class=\"qa-item-name\">{{ record.recordName || record.recordId }}</div>\n <div class=\"qa-item-meta\">{{ record.entityName }}</div>\n </div>\n </div>\n }\n @if (quickAccessFavoriteRecords.length === 0) {\n <div class=\"qa-empty\">No favorite records</div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n } @else {\n <mj-entity-viewer\n #entityViewer\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 [gridSelectionMode]=\"'checkbox'\"\n [showGridToolbar]=\"false\"\n [showAddToListButton]=\"false\"\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 (selectionChanged)=\"onSelectionChanged($event)\"\n (addToListRequested)=\"onAddToListRequested($event)\"\n [mapRenderMode]=\"state.mapRenderMode || 'point'\"\n [mapDisplayState]=\"mapDisplayState\"\n (mapRenderModeChange)=\"onMapRenderModeChange($event)\"\n (mapDisplayStateChange)=\"onMapDisplayStateChange($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 <!-- Detail Panel Actions Bar -->\n <div class=\"detail-panel-actions\">\n <button\n class=\"detail-action-btn\"\n (click)=\"openListManagementDialog()\"\n title=\"Add to List\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span>Add to List</span>\n </button>\n </div>\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 [DefaultSaveAsNew]=\"defaultSaveAsNew\"\n [PendingNewViewName]=\"pendingNewViewName\"\n [PendingNewViewDescription]=\"pendingNewViewDescription\"\n [PendingNewViewIsShared]=\"pendingNewViewIsShared\"\n (close)=\"onCloseViewConfigPanel()\"\n (save)=\"onSaveView($event)\"\n (saveDefaults)=\"onSaveDefaultViewSettings($event)\"\n (delete)=\"onDeleteView()\"\n (duplicate)=\"onDuplicateFromPanel()\"\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 <!-- Export Dialog -->\n <mj-export-dialog\n [visible]=\"showExportDialog\"\n [config]=\"exportDialogConfig\"\n (closed)=\"onExportDialogClosed($event)\">\n </mj-export-dialog>\n\n <!-- List Management Dialog -->\n @if (showListManagementDialog && listManagementConfig) {\n <mj-list-management-dialog\n [config]=\"listManagementConfig\"\n [visible]=\"showListManagementDialog\"\n (complete)=\"onListManagementComplete($event)\"\n (cancel)=\"onListManagementCancel()\">\n </mj-list-management-dialog>\n }\n\n <!-- Quick Save Dialog (F-001) -->\n <mj-quick-save-dialog\n [IsOpen]=\"showQuickSaveDialog\"\n [ViewEntity]=\"selectedViewEntity\"\n [EntityName]=\"selectedEntity?.DisplayNameOrName ?? ''\"\n [Summary]=\"quickSaveSummary\"\n [IsSaving]=\"isSavingView\"\n [DefaultSaveAsNew]=\"defaultSaveAsNew\"\n (Save)=\"onQuickSave($event)\"\n (Close)=\"onQuickSaveClose()\"\n (OpenAdvanced)=\"onQuickSaveOpenAdvanced($event)\">\n </mj-quick-save-dialog>\n\n <!-- Duplicate View Dialog (F-005) -->\n <mj-duplicate-view-dialog\n [IsOpen]=\"showDuplicateDialog\"\n [SourceViewName]=\"duplicateSourceViewName\"\n [Summary]=\"duplicateSummary\"\n (Duplicate)=\"onDuplicateConfirmed($event)\"\n (Cancel)=\"onDuplicateCancel()\">\n </mj-duplicate-view-dialog>\n\n <!-- Shared View Warning Dialog (view-creation-flow Scenario 5) -->\n <mj-shared-view-warning-dialog\n [IsOpen]=\"showSharedViewWarning\"\n [ViewName]=\"selectedViewEntity?.Name ?? ''\"\n (Action)=\"onSharedViewAction($event)\"\n (Cancel)=\"onSharedViewWarningCancel()\">\n </mj-shared-view-warning-dialog>\n</div>\n", styles: [".data-explorer-container {\n display: flex;\n height: 100%;\n width: 100%;\n background: var(--mj-bg-surface-card);\n overflow: hidden;\n}\n\n.navigation-panel {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\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: var(--mj-bg-surface-card);\n}\n\n/* Breadcrumb Bar */\n.breadcrumb-bar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\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: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current {\n color: var(--mj-text-primary);\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: var(--mj-border-strong);\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: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n gap: 24px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n position: relative;\n z-index: 1100; /* Above Leaflet map containers (z-index ~400-1000) so dropdowns render on top */\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: var(--mj-brand-primary);\n}\n\n.entity-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.record-count {\n font-size: 13px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.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 var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n}\n.smart-filter-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n.smart-filter-input::placeholder {\n color: var(--mj-text-muted);\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: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n.clear-filter-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\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: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n padding: 3px;\n}\n\n.toggle-btn {\n width: 36px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n.toggle-btn:hover {\n color: var(--mj-text-primary);\n}\n.toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Header Action Button (Add to List, etc.) */\n.header-action-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n margin-left: 8px;\n}\n.header-action-btn:hover:not(.disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n.header-action-btn.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n.header-action-btn i {\n font-size: 14px;\n}\n.selection-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 11px;\n font-weight: 600;\n border-radius: 9px;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\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(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-primary);\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(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\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(--mj-bg-surface-active);\n border-color: var(--mj-brand-primary);\n}\n\n.date-field-icon {\n color: var(--mj-text-secondary);\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(--mj-text-secondary);\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(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\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(--mj-bg-surface-card);\n}\n\n.date-field-dropdown-item.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item.selected:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n}\n\n.date-field-dropdown-item .item-icon {\n color: var(--mj-text-secondary);\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(--mj-brand-primary);\n font-size: 12px;\n}\n\n/* View-specific controls \u2014 contextual controls for the active view mode.\n Positioned LEFT of the view mode toggle with a subtle visual separator. */\n.view-specific-controls {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n border: 1px solid var(--mj-border-subtle);\n}\n\n.view-specific-btn {\n width: 30px;\n height: 30px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.view-specific-btn:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n/* Legacy \u2014 keep for backward compat but no longer used in template */\n.timeline-orientation-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\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: var(--mj-bg-surface);\n border-radius: 8px;\n}\n\n.loading-spinner {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n\n.loading-message {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\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: var(--mj-text-muted);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 40px;\n}\n\n.empty-icon {\n font-size: 64px;\n color: var(--mj-border-default);\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: var(--mj-text-primary);\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n max-width: 400px;\n color: var(--mj-text-secondary);\n}\n\n/* ============================================\n CONCEPT D: HOME VIEW LAYOUT\n ============================================ */\n\n.home-view-concept-d {\n flex: 1;\n display: flex;\n overflow: hidden;\n}\n\n.home-main-area {\n flex: 1;\n overflow-y: auto;\n transition: margin-right 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.home-main-area.panel-open {\n margin-right: 320px;\n}\n\n/* ============================================\n SEARCH HERO\n ============================================ */\n\n.search-hero {\n background: var(--mj-bg-surface);\n padding: 36px 40px 24px;\n text-align: center;\n}\n\n.search-hero-container {\n position: relative;\n max-width: 600px;\n margin: 0 auto;\n}\n\n.search-hero-input {\n width: 100%;\n padding: 14px 18px 14px 44px;\n font-size: 15px;\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n outline: none;\n transition: all 0.2s;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n font-family: inherit;\n}\n\n.search-hero-input:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 12px 40px rgba(0, 0, 0, 0.1), 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.search-hero-input::placeholder {\n color: var(--mj-text-primary);\n}\n\n.search-hero-icon {\n position: absolute;\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-primary);\n font-size: 15px;\n pointer-events: none;\n}\n\n.search-hero-shortcut {\n position: absolute;\n right: 14px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 2px 7px;\n border-radius: 5px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.search-hero-clear {\n position: absolute;\n right: 14px;\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: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.search-hero-clear:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n/* Meta row: entity count + pills */\n.search-meta-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n margin-top: 16px;\n}\n\n.search-entity-count {\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.pill-toggle {\n display: flex;\n gap: 6px;\n}\n\n.pill-btn {\n padding: 6px 16px;\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n font-size: 13px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s;\n font-family: inherit;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.pill-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pill-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.pill-btn i {\n font-size: 11px;\n}\n\n/* ============================================\n APPLICATION GROUPS\n ============================================ */\n\n.entity-groups-area {\n padding: 12px 40px 60px;\n max-width: 1200px;\n margin: 0 auto;\n}\n\n.app-group {\n margin-bottom: 4px;\n}\n\n.app-group-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n cursor: pointer;\n border-radius: 8px;\n transition: background 0.12s;\n user-select: none;\n}\n\n.app-group-header:hover {\n background: rgba(0, 0, 0, 0.025);\n}\n\n.app-group-icon {\n width: 38px;\n height: 38px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 17px;\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.app-group-name {\n font-size: 21px;\n font-weight: 600;\n flex: 1;\n}\n\n.app-group-count {\n font-size: 12px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n padding: 2px 9px;\n border-radius: 10px;\n}\n\n.app-group-chevron {\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: transform 0.2s;\n}\n\n.app-group-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.app-group-entities {\n padding: 4px 14px 10px 60px;\n}\n\n/* ============================================\n ENTITY ITEM GRID (pills)\n ============================================ */\n\n.entity-item-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n\n.entity-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 10px 14px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n}\n\n.entity-item:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 40%, var(--mj-bg-surface));\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.entity-item-icon {\n width: 32px;\n height: 32px;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.entity-item:hover .entity-item-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.entity-item-text {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.entity-item-name {\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.entity-item-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.3;\n}\n\n.entity-item-fav {\n color: var(--mj-text-muted);\n opacity: 0;\n transition: opacity 0.12s;\n font-size: 11px;\n cursor: pointer;\n flex-shrink: 0;\n background: none;\n border: none;\n padding: 4px;\n align-self: center;\n}\n\n.entity-item:hover .entity-item-fav {\n opacity: 1;\n}\n\n.entity-item-fav.favorited {\n opacity: 1;\n color: var(--mj-status-warning);\n}\n\n/* ============================================\n QUICK ACCESS PANEL (right slide-in)\n ============================================ */\n\n.quick-access-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 320px;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 50;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n flex-direction: column;\n}\n\n.quick-access-panel.open {\n transform: translateX(0);\n}\n\n.qa-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-header h3 {\n font-size: 14px;\n font-weight: 600;\n margin: 0;\n}\n\n.qa-close-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 14px;\n padding: 4px;\n border-radius: 4px;\n}\n\n.qa-close-btn:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-body {\n flex: 1;\n overflow-y: auto;\n}\n\n.qa-section {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.qa-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n color: var(--mj-text-muted);\n cursor: pointer;\n user-select: none;\n}\n\n.qa-section-header .qa-section-icon {\n font-size: 12px;\n}\n\n.qa-section-header .qa-section-count {\n background: var(--mj-bg-surface-card);\n padding: 0 6px;\n border-radius: 8px;\n font-size: 10px;\n margin-left: auto;\n}\n\n.qa-section-header .qa-section-chevron {\n font-size: 10px;\n transition: transform 0.15s;\n}\n\n.qa-section.collapsed .qa-section-chevron {\n transform: rotate(-90deg);\n}\n\n.qa-section-body {\n padding: 0 8px 8px;\n}\n\n.qa-section.collapsed .qa-section-body {\n display: none;\n}\n\n.qa-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.08s;\n}\n\n.qa-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.qa-item-icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n flex-shrink: 0;\n}\n\n.qa-item-info {\n flex: 1;\n min-width: 0;\n}\n\n.qa-item-name {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.qa-item-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.qa-item-time {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n\n.qa-empty {\n padding: 20px 16px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n/* Quick Access toggle button badge */\n.qa-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n padding: 0 5px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n}\n\n/* No results state for home view */\n.home-no-results {\n text-align: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n}\n\n.home-no-results i {\n font-size: 28px;\n margin-bottom: 10px;\n display: block;\n}\n\n.home-no-results p {\n font-size: 14px;\n margin: 0;\n}\n\n.detail-panel {\n flex-shrink: 0;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n box-shadow: -4px 0 16px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n animation: slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n.detail-panel mj-entity-record-detail-panel {\n flex: 1;\n min-height: 0;\n overflow: hidden;\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\n/* Detail Panel Actions Bar */\n.detail-panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.detail-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.detail-action-btn:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n transform: translateY(-1px);\n box-shadow: 0 2px 4px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.detail-action-btn i {\n font-size: 12px;\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: 16px 24px 8px;\n}\n\n.content-body.home-content {\n padding: 0;\n}\n\n/* Smart filter with search icon (entity-level filter) */\n.filter-icon {\n position: absolute;\n left: 14px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\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 VIEW MODE TOGGLE OVERRIDES\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: var(--mj-bg-surface-card);\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-item-grid {\n grid-template-columns: repeat(auto-fill, minmax(200px, 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 .search-hero {\n padding: 24px 16px 16px;\n }\n\n .entity-groups-area {\n padding: 8px 16px 40px;\n }\n\n .app-group-entities {\n padding-left: 36px;\n }\n\n .home-main-area.panel-open {\n margin-right: 0;\n }\n\n .quick-access-panel {\n width: 100%;\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-item-grid {\n grid-template-columns: 1fr;\n }\n\n .view-mode-toggle {\n display: none;\n }\n\n .app-group-name {\n font-size: 17px;\n }\n\n .entity-item-name {\n font-size: 14px;\n }\n}\n"] }]
|
|
3644
|
+
}], () => [{ type: i1.ExplorerStateService }, { type: i0.ChangeDetectorRef }, { type: i2.RecentAccessService }, { type: i3.ExportService }, { type: i0.NgZone }], { filterInputRef: [{
|
|
3614
3645
|
type: ViewChild,
|
|
3615
3646
|
args: ['filterInput']
|
|
3616
3647
|
}], viewSelectorRef: [{
|
|
@@ -3630,11 +3661,13 @@ export { DataExplorerDashboardComponent };
|
|
|
3630
3661
|
type: Input
|
|
3631
3662
|
}], contextIcon: [{
|
|
3632
3663
|
type: Input
|
|
3664
|
+
}], initialQueryParams: [{
|
|
3665
|
+
type: Input
|
|
3633
3666
|
}], DisplayNameChanged: [{
|
|
3634
3667
|
type: Output
|
|
3635
3668
|
}], handleKeyboardShortcut: [{
|
|
3636
3669
|
type: HostListener,
|
|
3637
3670
|
args: ['document:keydown', ['$event']]
|
|
3638
3671
|
}] }); })();
|
|
3639
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DataExplorerDashboardComponent, { className: "DataExplorerDashboardComponent", filePath: "src/DataExplorer/data-explorer-dashboard.component.ts", lineNumber:
|
|
3672
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DataExplorerDashboardComponent, { className: "DataExplorerDashboardComponent", filePath: "src/DataExplorer/data-explorer-dashboard.component.ts", lineNumber: 77 }); })();
|
|
3640
3673
|
//# sourceMappingURL=data-explorer-dashboard.component.js.map
|