@memberjunction/ng-entity-viewer 6.1.4 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/aggregate-panel/aggregate-panel.component.d.ts +18 -2
- package/dist/lib/aggregate-panel/aggregate-panel.component.d.ts.map +1 -1
- package/dist/lib/aggregate-panel/aggregate-panel.component.js +47 -18
- package/dist/lib/aggregate-panel/aggregate-panel.component.js.map +1 -1
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.d.ts +22 -0
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.d.ts.map +1 -1
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.js +57 -13
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.js.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.d.ts +68 -5
- package/dist/lib/entity-cards/entity-cards.component.d.ts.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.js +213 -73
- package/dist/lib/entity-cards/entity-cards.component.js.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +156 -14
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.js +432 -138
- package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
- package/dist/lib/entity-data-grid/events/grid-events.js +67 -67
- package/dist/lib/entity-data-grid/events/grid-events.js.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts +112 -8
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +255 -69
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts +11 -0
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.js +45 -8
- package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
- package/dist/lib/pill/pill.component.d.ts +13 -3
- package/dist/lib/pill/pill.component.d.ts.map +1 -1
- package/dist/lib/pill/pill.component.js +34 -10
- package/dist/lib/pill/pill.component.js.map +1 -1
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts +29 -3
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts.map +1 -1
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.js +173 -114
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.js.map +1 -1
- package/dist/lib/recycle-bin/recycle-bin.component.d.ts +4 -0
- package/dist/lib/recycle-bin/recycle-bin.component.d.ts.map +1 -1
- package/dist/lib/recycle-bin/recycle-bin.component.js +10 -2
- package/dist/lib/recycle-bin/recycle-bin.component.js.map +1 -1
- package/dist/lib/utils/aggregate-field.util.d.ts +21 -0
- package/dist/lib/utils/aggregate-field.util.d.ts.map +1 -0
- package/dist/lib/utils/aggregate-field.util.js +40 -0
- package/dist/lib/utils/aggregate-field.util.js.map +1 -0
- package/dist/lib/utils/highlight.util.d.ts +6 -0
- package/dist/lib/utils/highlight.util.d.ts.map +1 -1
- package/dist/lib/utils/highlight.util.js +23 -11
- package/dist/lib/utils/highlight.util.js.map +1 -1
- package/dist/lib/utils/record.util.d.ts +10 -0
- package/dist/lib/utils/record.util.d.ts.map +1 -1
- package/dist/lib/utils/record.util.js +20 -4
- package/dist/lib/utils/record.util.js.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts +22 -2
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.js +54 -14
- package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/lib/view-selector/view-selector.component.js +2 -2
- package/dist/lib/view-types/renderers/cards-view-renderer.component.d.ts +15 -3
- package/dist/lib/view-types/renderers/cards-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/cards-view-renderer.component.js +33 -5
- package/dist/lib/view-types/renderers/cards-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts +160 -5
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.js +576 -36
- package/dist/lib/view-types/renderers/grid-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/renderers/map-view-renderer.component.d.ts +16 -2
- package/dist/lib/view-types/renderers/map-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/map-view-renderer.component.js +37 -9
- package/dist/lib/view-types/renderers/map-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/view-type.contracts.js.map +1 -1
- package/dist/lib/view-workspace/view-workspace.component.d.ts +235 -24
- package/dist/lib/view-workspace/view-workspace.component.d.ts.map +1 -1
- package/dist/lib/view-workspace/view-workspace.component.js +600 -174
- package/dist/lib/view-workspace/view-workspace.component.js.map +1 -1
- package/dist/module.d.ts +5 -4
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +8 -1
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +21 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-workspace.component.js","sourceRoot":"","sources":["../../../src/lib/view-workspace/view-workspace.component.ts","../../../src/lib/view-workspace/view-workspace.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n ChangeDetectorRef,\n ViewChild\n} from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityFieldInfo, EntityInfo, LogError } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n MJUserViewEntityExtended,\n UserInfoEngine,\n ViewGridState,\n MJUserViewEntity_IGridState,\n MJUserViewEntity_IGridColumnSetting,\n MJUserViewEntity_IGridSortSetting,\n MJUserViewEntity_ISortStateItem\n} from '@memberjunction/core-entities';\nimport { CompositeFilterDescriptor, FilterFieldInfo } from '@memberjunction/ng-filter-builder';\nimport { ExportDialogConfig, ExportDialogResult } from '@memberjunction/ng-export-service';\nimport { ExportColumn } from '@memberjunction/export-engine';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport {\n RecordSelectedEvent,\n RecordOpenedEvent,\n ViewConfigSummary,\n QuickSaveEvent,\n QuickSaveAdvancedEvent,\n DataLoadedEvent,\n FilteredCountChangedEvent,\n EntityViewerConfig,\n SortState,\n SortDirection\n} from '../types';\nimport { EntityViewerComponent } from '../entity-viewer/entity-viewer.component';\nimport { ViewRelatedRecordNavigation } from '../view-types';\nimport { ViewSelectorComponent, ViewSelectedEvent, SaveViewRequestedEvent } from '../view-selector/view-selector.component';\nimport { ViewConfigPanelComponent, ViewSaveEvent } from '../view-config-panel/view-config-panel.component';\nimport { SharedViewAction } from '../shared-view-warning-dialog/shared-view-warning-dialog.component';\nimport { DuplicateViewEvent } from '../duplicate-view-dialog/duplicate-view-dialog.component';\n\n/**\n * Generic cancelable event payload used by the workspace's `Before…` lifecycle outputs.\n * Mirrors the house pattern (`CancelableEvent<T>` in `@memberjunction/ng-clustering` and the\n * grid's `BeforeRowClick`): a handler sets `Cancel = true` on the args object to veto the\n * default operation that would otherwise follow.\n *\n * @typeParam T - the shape of the operation-specific payload carried on {@link Data}.\n */\nexport interface WorkspaceCancelableEvent<T = unknown> {\n /** The operation payload (e.g. the view being saved / deleted). */\n Data: T;\n /** Set to `true` in a `Before…` handler to cancel the pending operation. */\n Cancel: boolean;\n}\n\n/**\n * Payload describing a view save about to occur / that just occurred. Emitted via\n * {@link ViewWorkspaceComponent.BeforeViewSave} (wrapped in {@link WorkspaceCancelableEvent})\n * and {@link ViewWorkspaceComponent.AfterViewSave}.\n */\nexport interface ViewSaveOperation {\n /** The view entity being saved (the new record when creating, the existing record when updating). */\n View: MJUserViewEntityExtended;\n /** True when this save created a brand-new view; false when it updated an existing one. */\n IsNew: boolean;\n}\n\n/**\n * Payload describing a view delete that just occurred, emitted via\n * {@link ViewWorkspaceComponent.AfterViewDelete}.\n */\nexport interface ViewDeleteOperation {\n /** The `MJ: User Views` row ID that was deleted. */\n ViewID: string;\n /** The name of the deleted view (captured before deletion). */\n ViewName: string;\n}\n\n/**\n * `mj-view-workspace` — the reusable \"browse an entity's data across saved views\" workspace.\n *\n * This composite component orchestrates the full saved-view lifecycle (select / save / save-as-new /\n * rename / duplicate / delete / revert / quick-save / save-defaults) on top of an entity's data, by\n * composing the existing Generic lego components in this package:\n *\n * - {@link ViewSelectorComponent} — the saved-view dropdown.\n * - {@link EntityViewerComponent} — the data renderer (grid / cards / timeline / map / plug-ins).\n * - {@link ViewConfigPanelComponent} — the slide-in column/sort/filter configuration panel.\n * - `mj-view-type-switcher` — the toolbar dropdown for switching the active view type.\n * - `mj-quick-save-dialog`, `mj-duplicate-view-dialog`, `mj-shared-view-warning-dialog`,\n * `mj-ev-confirm-dialog` — the focused modals.\n *\n * It is the generic extraction of what `DataExplorerDashboardComponent` does today, **minus routing,\n * URL/query-param sync, and the Explorer state service**. Anything that requires app-level routing is\n * emitted as an event ({@link OpenRecordRequested}, {@link OpenViewInTabRequested},\n * {@link CreateNewRecordRequested}) for the host to handle — this component never imports `Router`.\n *\n * ## Persistence model\n * - When {@link AutoSaveView} is `true`, the workspace persists view CRUD itself via the\n * `MJUserViewEntityExtended` BaseEntity (`.Save()` / `.Delete()`) and `UserInfoEngine` for the\n * per-user default-view settings, firing the cancelable `Before…` events and notification `After…`\n * events around each operation.\n * - When {@link AutoSaveView} is `false` (the default), the workspace performs no persistence — it\n * emits the change-request events ({@link SaveViewRequested}, {@link DeleteViewRequested},\n * {@link DuplicateViewRequested}, etc.) and the host is responsible for persisting and feeding back\n * the updated view via the `[SelectedView]` input.\n *\n * State is held in plain component fields — there is no state-management service.\n *\n * @example\n * ```html\n * <mj-view-workspace\n * [EntityName]=\"'Accounts'\"\n * [AutoSaveView]=\"true\"\n * (OpenRecordRequested)=\"navService.openRecord($event.entity, $event.record)\"\n * (OpenViewInTabRequested)=\"navService.openView($event)\"\n * (CreateNewRecordRequested)=\"navService.newRecord($event)\">\n * </mj-view-workspace>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-view-workspace',\n templateUrl: './view-workspace.component.html',\n styleUrls: ['./view-workspace.component.css']\n})\nexport class ViewWorkspaceComponent extends BaseAngularComponent implements OnInit {\n // ========================================\n // INPUTS\n // ========================================\n\n private _entity: EntityInfo | null = null;\n private _initialized = false;\n\n /**\n * The entity whose data this workspace browses. May be supplied directly, or resolved from\n * {@link EntityName} / {@link EntityID}. When it changes the selected view and config panel reset.\n */\n @Input()\n get Entity(): EntityInfo | null {\n return this._entity;\n }\n set Entity(value: EntityInfo | null) {\n const previous = this._entity;\n this._entity = value;\n if (this._initialized && value && (!previous || !UUIDsEqual(value.ID, previous.ID))) {\n this.resetForEntityChange();\n }\n }\n\n /**\n * Convenience input: resolve {@link Entity} by entity **name** via the active provider.\n * Use this OR {@link Entity} OR {@link EntityID}.\n */\n @Input()\n set EntityName(value: string | null) {\n if (!value) {\n return;\n }\n const resolved = this.ProviderToUse?.EntityByName(value) ?? null;\n if (resolved) {\n this.Entity = resolved;\n }\n }\n\n /**\n * Convenience input: resolve {@link Entity} by entity **ID** via the active provider.\n * Use this OR {@link Entity} OR {@link EntityName}.\n */\n @Input()\n set EntityID(value: string | null) {\n if (!value) {\n return;\n }\n const resolved = this.ProviderToUse?.Entities.find(e => UUIDsEqual(e.ID, value)) ?? null;\n if (resolved) {\n this.Entity = resolved;\n }\n }\n\n /**\n * When `true`, the workspace persists view CRUD itself (BaseEntity `.Save()`/`.Delete()` plus\n * `UserInfoEngine` for the default-view settings) and fires the cancelable `Before…` / notification\n * `After…` events around each persistence operation. When `false` (the default) the workspace only\n * emits the change-request events and the host persists. Persistence is provider-based and\n * generic-safe — it never performs routing.\n */\n @Input() AutoSaveView: boolean = false;\n\n /**\n * The currently-selected view. Hosts that own persistence (when {@link AutoSaveView} is `false`)\n * feed the loaded view back in here after handling a save/select request. Bound two-way friendly:\n * the workspace emits {@link SelectedViewChange} whenever the selection changes internally.\n */\n @Input()\n get SelectedView(): MJUserViewEntityExtended | null {\n return this.currentViewEntity;\n }\n set SelectedView(value: MJUserViewEntityExtended | null) {\n this.currentViewEntity = value;\n this.currentGridState = value ? this.parseViewGridState(value) : this.loadUserDefaultGridState();\n this.viewModified = false;\n }\n\n // ----- Host-driven passthrough inputs (forwarded to the inner entity-viewer) -----\n //\n // These let a host (e.g. the Explorer DataExplorer dashboard) own the chrome — filter box, record\n // selection — while the workspace owns the saved-view lifecycle. All view-type-specific chrome\n // (grid toolbar, timeline date/orientation, map render mode) is now self-contained in each plug-in\n // renderer, so the workspace no longer forwards any of it.\n\n /**\n * The free-text filter to apply to the inner viewer. When a host owns the filter box it binds\n * this (typically a debounced value); the workspace's {@link filterText} field tracks it.\n */\n @Input()\n get FilterText(): string {\n return this.filterText;\n }\n set FilterText(value: string) {\n this.filterText = value ?? '';\n }\n\n /**\n * The composite-key string of the record to highlight in the inner viewer. When a host owns\n * record selection (e.g. via a detail panel) it binds this; the workspace's\n * {@link selectedRecordId} field tracks it.\n */\n @Input()\n get SelectedRecordId(): string | null {\n return this.selectedRecordId;\n }\n set SelectedRecordId(value: string | null) {\n this.selectedRecordId = value;\n }\n\n /** Partial {@link EntityViewerConfig} forwarded to the inner viewer (toolbar/pagination/etc.). */\n @Input() ViewerConfig: Partial<EntityViewerConfig> | null = null;\n\n // ========================================\n // OUTPUTS — routing / host concerns (this component never routes)\n // ========================================\n\n /**\n * Emitted when the user opens a record (double-click / open). The host performs the navigation.\n */\n @Output() OpenRecordRequested = new EventEmitter<{ entity: EntityInfo; record: Record<string, unknown> }>();\n\n /**\n * Emitted when the user asks to open the current view in its own tab. Carries the `MJ: User Views`\n * row ID. The host performs the navigation.\n */\n @Output() OpenViewInTabRequested = new EventEmitter<string>();\n\n /**\n * Emitted when the user asks to create a new record for the current entity — either from the\n * selector or bubbled up from a plug-in renderer's \"New\" button. The host opens the form.\n */\n @Output() CreateNewRecordRequested = new EventEmitter<EntityInfo>();\n\n /**\n * NAVIGATION request bubbled up from a plug-in renderer (via the inner viewer) to open a *related*\n * record on a (possibly different) entity — e.g. a grid foreign-key drill-through. The host routes.\n */\n @Output() OpenRelatedRecordRequested = new EventEmitter<ViewRelatedRecordNavigation>();\n\n /**\n * Emitted when a record is selected (single click) in the viewer.\n */\n @Output() RecordSelected = new EventEmitter<RecordSelectedEvent>();\n\n /**\n * Emitted when the selected view changes (selection, save, delete). Notification only.\n */\n @Output() ViewSelected = new EventEmitter<MJUserViewEntityExtended | null>();\n\n /**\n * Two-way-binding companion for {@link SelectedView}.\n */\n @Output() SelectedViewChange = new EventEmitter<MJUserViewEntityExtended | null>();\n\n // ----- Forwarded inner-viewer events (the generic, view-type-agnostic ones) -----\n //\n // The workspace owns the inner entity-viewer; it re-emits the viewer's generic signals (filter,\n // data-load, counts) so a host can drive Explorer-only concerns (URL sync, detail panel). All\n // view-type-specific feature events (grid selection/add-to-list, map state, grid state) are now\n // self-contained in the plug-in renderers and no longer bubble through the workspace.\n\n /**\n * Emitted when the inner viewer's filter text changes (two-way friendly with {@link FilterText}).\n */\n @Output() FilterTextChanged = new EventEmitter<string>();\n\n /**\n * Emitted when the inner viewer finishes loading data — carries counts, timing and the records.\n */\n @Output() DataLoaded = new EventEmitter<DataLoadedEvent>();\n\n /**\n * Emitted when the inner viewer's filtered/total counts change.\n */\n @Output() FilteredCountChanged = new EventEmitter<FilteredCountChangedEvent>();\n\n // ----- Persistence lifecycle events -----\n\n /**\n * Emitted (cancelable) BEFORE a view save is persisted. A handler may set `Cancel = true` to veto.\n * Only fires when {@link AutoSaveView} is `true`.\n */\n @Output() BeforeViewSave = new EventEmitter<WorkspaceCancelableEvent<ViewSaveOperation>>();\n\n /**\n * Emitted AFTER a view save has been persisted. Notification only.\n */\n @Output() AfterViewSave = new EventEmitter<ViewSaveOperation>();\n\n /**\n * Emitted (cancelable) BEFORE a view delete is persisted. A handler may set `Cancel = true` to veto.\n * Only fires when {@link AutoSaveView} is `true`.\n */\n @Output() BeforeViewDelete = new EventEmitter<WorkspaceCancelableEvent<MJUserViewEntityExtended>>();\n\n /**\n * Emitted AFTER a view delete has been persisted. Notification only.\n */\n @Output() AfterViewDelete = new EventEmitter<ViewDeleteOperation>();\n\n // ----- Change-request events (the host persists when AutoSaveView is false) -----\n\n /**\n * Emitted when the user requests a save and {@link AutoSaveView} is `false`. The host persists.\n */\n @Output() SaveViewRequested = new EventEmitter<ViewSaveEvent>();\n\n /**\n * Emitted when the user requests a delete and {@link AutoSaveView} is `false`. The host persists.\n */\n @Output() DeleteViewRequested = new EventEmitter<MJUserViewEntityExtended>();\n\n /**\n * Emitted when the user requests a duplicate and {@link AutoSaveView} is `false`. The host persists.\n * Carries the source view ID and the chosen name for the copy.\n */\n @Output() DuplicateViewRequested = new EventEmitter<{ sourceViewId: string; newName: string }>();\n\n /**\n * Emitted when the user saves per-user default view settings and {@link AutoSaveView} is `false`.\n */\n @Output() SaveDefaultsRequested = new EventEmitter<ViewSaveEvent>();\n\n // ========================================\n // CHILD COMPONENT REFERENCES\n // ========================================\n\n /** Reference to the view selector (for reloading the view list after CRUD). */\n @ViewChild(ViewSelectorComponent) protected viewSelectorRef?: ViewSelectorComponent;\n\n /** Reference to the entity viewer (for flushing pending grid changes + reloading data). */\n @ViewChild(EntityViewerComponent) protected entityViewerRef?: EntityViewerComponent;\n\n /** Reference to the config panel (for building summaries + canEdit checks). */\n @ViewChild(ViewConfigPanelComponent) protected viewConfigPanelRef?: ViewConfigPanelComponent;\n\n // ========================================\n // INTERNAL STATE (plain fields — no state service)\n // ========================================\n\n /** The currently selected view entity (null = the default/unsaved view). */\n public currentViewEntity: MJUserViewEntityExtended | null = null;\n\n /** The currently selected view ID (null = default view). */\n public selectedViewId: string | null = null;\n\n /** Live grid state (column widths / order / sort / aggregates) reflecting user interaction. */\n public currentGridState: ViewGridState | null = null;\n\n /** Whether the current view has unsaved modifications. */\n public viewModified: boolean = false;\n\n /** The current free-text filter. */\n public filterText: string = '';\n\n /** The currently selected record's composite-key string (for grid highlight). */\n public selectedRecordId: string | null = null;\n\n /** Records loaded by the viewer, kept for config-panel sample data. */\n public loadedRecords: Record<string, unknown>[] = [];\n\n /** Whether a save operation is in progress (drives the saving spinners). */\n public isSavingView: boolean = false;\n\n // ----- Dialog / panel open flags -----\n\n /** Whether the slide-in config panel is open. */\n public isConfigPanelOpen: boolean = false;\n\n /** Whether the quick-save dialog is open. */\n public showQuickSaveDialog: boolean = false;\n\n /** Whether the duplicate-view dialog is open. */\n public showDuplicateDialog: boolean = false;\n\n /** Whether the shared-view warning dialog is open. */\n public showSharedViewWarning: boolean = false;\n\n /** Whether the config panel opens in \"save as new\" mode. */\n public defaultSaveAsNew: boolean = false;\n\n // ----- Pending state carried across dialogs -----\n\n /** Summary shown in the quick-save dialog. */\n public quickSaveSummary: ViewConfigSummary | null = null;\n\n /** Summary shown in the duplicate-view dialog. */\n public duplicateSummary: ViewConfigSummary | null = null;\n\n /** Source view name shown in the duplicate-view dialog. */\n public duplicateSourceViewName: string = '';\n\n /** The view ID being duplicated. */\n private duplicateTargetViewId: string | null = null;\n\n /** A quick-save event held while the shared-view warning is shown. */\n private pendingQuickSaveEvent: QuickSaveEvent | null = null;\n\n /** Pre-populated name carried from quick-save dialog into the config panel. */\n public pendingNewViewName: string = '';\n\n /** Pre-populated description carried from quick-save dialog into the config panel. */\n public pendingNewViewDescription: string = '';\n\n /** Pre-populated sharing preference carried from quick-save dialog into the config panel. */\n public pendingNewViewIsShared: boolean = false;\n\n // ----- Filter dialog (rendered at workspace level for full width) -----\n\n /** Whether the full-width filter dialog is open. */\n public isFilterDialogOpen: boolean = false;\n\n /** The filter state currently being edited in the filter dialog. */\n public filterDialogState: CompositeFilterDescriptor | null = null;\n\n /** The filter fields available in the filter dialog. */\n public filterDialogFields: FilterFieldInfo[] = [];\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n /** Controls the workspace-level export dialog (the same generic dialog the grid uses). */\n public showExportDialog: boolean = false;\n public exportDialogConfig: ExportDialogConfig | null = null;\n\n /**\n * Handles the toolbar's Export button (the `<mj-view-selector>` `ExportRequested` output). This is\n * the always-visible, view-type-agnostic export for the workspace — previously the event wasn't\n * wired at all, so the button did nothing on every view type. It fetches the FULL result set via the\n * inner viewer's capped, filter/sort-aware fetch (bounded + warns past the cap), then opens the SAME\n * generic export dialog the grid uses — with format (Excel/CSV/JSON), sampling, and file-name\n * options. Because the dialog only needs data + columns (it has no view-type dependency), this works\n * identically for Grid, Cards, Map and Timeline. Never fails silently — every path notifies.\n */\n public async onExportRequested(): Promise<void> {\n const viewer = this.entityViewerRef;\n if (!viewer || !this._entity) {\n console.error('[ViewWorkspace] Export: viewer not ready', { hasViewer: !!viewer, hasEntity: !!this._entity });\n MJNotificationService.Instance.CreateSimpleNotification('Export is not ready yet — try again in a moment.', 'error', 5000);\n return;\n }\n MJNotificationService.Instance.CreateSimpleNotification('Preparing your export…', 'info', 2000);\n try {\n const rows = await viewer.FetchAllRowsForExport();\n if (!rows || rows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification('Nothing to export — the view returned no records.', 'warning', 5000);\n return;\n }\n this.exportDialogConfig = {\n data: rows,\n columns: this.buildExportColumns(),\n defaultFileName: this.buildExportFileName(),\n availableFormats: ['excel', 'csv', 'json'],\n defaultFormat: 'excel',\n showSamplingOptions: true,\n defaultSamplingMode: 'all',\n dialogTitle: `Export ${this._entity.Name}`\n };\n this.showExportDialog = true;\n this.cdr.detectChanges();\n } catch (e) {\n MJNotificationService.Instance.CreateSimpleNotification('Error preparing export — see console for details.', 'error', 5000);\n console.error('[ViewWorkspace] Export error:', e);\n }\n }\n\n /** Closes the workspace export dialog (the dialog performs the export + download itself). */\n public onExportDialogClosed(_result: ExportDialogResult): void {\n this.showExportDialog = false;\n this.exportDialogConfig = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Columns to export: what the active renderer shows on screen (the grid), else the view's saved\n * columns, else the entity fields. The fallbacks apply the grid's own rules, so Cards, Map and\n * Timeline export the columns a grid of this view would show: saved settings are sorted by\n * `orderIndex`, headed by the user's rename, resolved to the entity's field spelling (the export\n * engine reads each row by that key), and dropped when the field no longer exists; fields the\n * user is denied read access to are left out.\n */\n private buildExportColumns(): ExportColumn[] {\n const entity = this._entity;\n if (!entity) {\n return [];\n }\n const onScreen = this.entityViewerRef?.GetExportColumns() ?? [];\n if (onScreen.length > 0) {\n return onScreen;\n }\n const user = this.ProviderToUse?.CurrentUser;\n const denied = user ? entity.GetDeniedReadFields(user) : new Set<string>();\n const readable = (f: EntityFieldInfo) => !denied.has(f.Name.trim().toLowerCase());\n\n const gridCols = this.currentGridState?.columnSettings;\n if (gridCols && gridCols.length > 0) {\n const columns: ExportColumn[] = [];\n const sorted = [...gridCols]\n .filter(c => c.hidden !== true)\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n for (const c of sorted) {\n const field = entity.Fields.find(f => f.Name.toLowerCase() === c.Name.toLowerCase());\n if (field && readable(field)) {\n columns.push({ name: field.Name, displayName: c.userDisplayName || c.DisplayName || field.DisplayNameOrName });\n }\n }\n if (columns.length > 0) {\n return columns;\n }\n }\n return entity.Fields\n .filter(f => !f.IsVirtual && readable(f))\n .map(f => ({ name: f.Name, displayName: f.DisplayNameOrName }));\n }\n\n private buildExportFileName(): string {\n const viewName = this.currentViewEntity?.Name || 'Data';\n return `${this._entity!.Name}_${viewName}_${new Date().toISOString().split('T')[0]}`;\n }\n\n // ========================================\n // LIFECYCLE\n // ========================================\n\n /** Initializes the workspace and loads the per-user default grid state for the entity. */\n ngOnInit(): void {\n this._initialized = true;\n if (this._entity && !this.currentViewEntity) {\n this.currentGridState = this.loadUserDefaultGridState();\n }\n }\n\n /** Resets all view/selection state when the bound entity changes to a different entity. */\n private resetForEntityChange(): void {\n this.currentViewEntity = null;\n this.selectedViewId = null;\n this.viewModified = false;\n this.selectedRecordId = null;\n this.currentGridState = this.loadUserDefaultGridState();\n this.closeAllDialogs();\n this.cdr.detectChanges();\n }\n\n /** Closes every dialog/panel — used on entity change. */\n private closeAllDialogs(): void {\n this.isConfigPanelOpen = false;\n this.showQuickSaveDialog = false;\n this.showDuplicateDialog = false;\n this.showSharedViewWarning = false;\n this.isFilterDialogOpen = false;\n }\n\n // ========================================\n // VIEW-TYPE SWITCHER (lifted into the toolbar)\n // ========================================\n\n /**\n * Drive the inner entity-viewer to switch to the chosen view type. The toolbar-level\n * {@link ViewTypeSwitcherComponent} emits the selection; we route it to the viewer's\n * {@link EntityViewerComponent.SelectViewTypeById} (its existing lifecycle: cancelable events\n * + persistence). The viewer's own header switcher is suppressed via Config, so this is the\n * single switcher in the workspace.\n */\n public onToolbarViewTypeSelected(event: { viewTypeId: string; driverClass: string }): void {\n this.entityViewerRef?.SelectViewTypeById(event.viewTypeId);\n this.cdr.detectChanges();\n }\n\n /**\n * The active view type's `MJ: View Types` row ID, read from the inner viewer for the toolbar\n * switcher's active highlight. Safe to read in the template — it reflects the viewer's own\n * resolved state rather than driving it.\n */\n get activeViewTypeId(): string | null {\n return this.entityViewerRef?.ActiveViewTypeId ?? null;\n }\n\n /**\n * The Config forwarded to the inner viewer. Merges the host-supplied {@link ViewerConfig} but\n * always forces `showViewModeToggle: false` so the view-type switcher appears only once — in the\n * workspace toolbar, not duplicated in the viewer's own header.\n */\n get innerViewerConfig(): Partial<EntityViewerConfig> {\n return { ...(this.ViewerConfig ?? {}), showViewModeToggle: false };\n }\n\n // ========================================\n // VIEW SELECTION\n // ========================================\n\n /**\n * Handle a view selection from the selector dropdown. Applies the view's grid state and filter,\n * resets the modified flag, and notifies the host. (Generalized from DataExplorer.onViewSelected.)\n */\n public onViewSelected(event: ViewSelectedEvent): void {\n this.entityViewerRef?.EnsurePendingChangesSaved();\n\n this.currentViewEntity = event.View;\n this.selectedViewId = event.ViewID;\n this.viewModified = false;\n this.filterText = '';\n\n this.currentGridState = event.View\n ? this.parseViewGridState(event.View)\n : this.loadUserDefaultGridState();\n\n this.ViewSelected.emit(event.View);\n this.SelectedViewChange.emit(event.View);\n this.cdr.detectChanges();\n }\n\n /** Handle filter text change from the viewer — re-emit so the host can sync its filter box / URL. */\n public onFilterTextChanged(filterText: string): void {\n this.filterText = filterText;\n this.FilterTextChanged.emit(filterText);\n }\n\n /** Track loaded records so the config panel has sample data, and re-emit the full event. */\n public onDataLoaded(event: DataLoadedEvent): void {\n this.loadedRecords = event.records;\n this.DataLoaded.emit(event);\n }\n\n /** Re-emit the inner viewer's filtered-count change for the host. */\n public onFilteredCountChanged(event: FilteredCountChangedEvent): void {\n this.FilteredCountChanged.emit(event);\n }\n\n // ========================================\n // RECORD SELECTION / OPENING / NAVIGATION (emit for host)\n // ========================================\n\n /** Handle a record single-click — track selection and re-emit for the host. */\n public onRecordSelected(event: RecordSelectedEvent): void {\n this.selectedRecordId = event.compositeKey.ToConcatenatedString();\n this.RecordSelected.emit(event);\n }\n\n /** Handle a record open (double-click) — emit for the host to route to the record. */\n public onRecordOpened(event: RecordOpenedEvent): void {\n if (event.record) {\n this.OpenRecordRequested.emit({ entity: event.entity, record: event.record });\n }\n }\n\n /**\n * Handle a plug-in renderer's request (via the inner viewer) to open a related record on a\n * (possibly different) entity — re-emit for the host to route.\n */\n public onOpenRelatedRecordRequested(nav: ViewRelatedRecordNavigation): void {\n this.OpenRelatedRecordRequested.emit(nav);\n }\n\n /**\n * Handle a plug-in renderer's request (via the inner viewer) to create a new record of the\n * current entity (e.g. a grid's \"New\" button) — re-emit for the host to open the form.\n */\n public onCreateRecordRequested(): void {\n if (this._entity) {\n this.CreateNewRecordRequested.emit(this._entity);\n }\n }\n\n // ========================================\n // VIEW SELECTOR ACTIONS\n // ========================================\n\n /** Handle the selector's \"open in tab\" request — emit for the host to route. */\n public onOpenInTabRequested(viewId: string): void {\n this.OpenViewInTabRequested.emit(viewId);\n }\n\n /** Handle the selector's \"create new record\" request — emit for the host. */\n public onCreateNewRecordRequested(): void {\n if (this._entity) {\n this.CreateNewRecordRequested.emit(this._entity);\n }\n }\n\n /** Handle the selector's \"configure view\" request — open the config panel. */\n public onConfigureViewRequested(): void {\n this.defaultSaveAsNew = false;\n this.isConfigPanelOpen = true;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // PROGRAMMATIC GRID CONTROL (passthrough to the inner entity viewer)\n // ========================================\n // Thin public passthroughs so a parent (e.g. the Data Explorer dashboard driving\n // the AI agent) can page/sort the grid and read its live pagination/sort state\n // without reaching into the protected child reference. All return null/false when\n // the viewer isn't mounted yet (e.g. at the home level before an entity is selected).\n\n /** Live pagination/sort snapshot from the inner viewer, or null when not mounted. */\n public GetGridState(): { CurrentPage: number; PageSize: number; TotalRecords: number; TotalPages: number; Sort: SortState | null } | null {\n const v = this.entityViewerRef;\n if (!v) {\n return null;\n }\n return {\n CurrentPage: v.CurrentPageNumber,\n PageSize: v.CurrentPageSize,\n TotalRecords: v.TotalRecords,\n TotalPages: v.TotalPageCount,\n Sort: v.CurrentSortState,\n };\n }\n\n /** Navigate to a 1-based page on the inner grid. Returns the page applied, or null. */\n public GoToPage(pageNumber: number): number | null {\n return this.entityViewerRef?.GoToPageNumber(pageNumber) ?? null;\n }\n\n /** Advance the inner grid to the next page. Returns the new 1-based page, or null. */\n public NextPage(): number | null {\n return this.entityViewerRef?.NextPage() ?? null;\n }\n\n /** Move the inner grid to the previous page. Returns the new 1-based page, or null. */\n public PreviousPage(): number | null {\n return this.entityViewerRef?.PreviousPage() ?? null;\n }\n\n /** Set the inner grid's server-side page size (reloads from page 1). Returns the size applied, or null. */\n public SetPageSize(pageSize: number): number | null {\n return this.entityViewerRef?.SetServerPageSize(pageSize) ?? null;\n }\n\n /** Apply a server-side sort to the inner grid. Returns true when applied, false otherwise. */\n public SetSort(field: string, direction: SortDirection): boolean {\n return this.entityViewerRef?.ApplySort(field, direction) ?? false;\n }\n\n /**\n * Programmatically select a record in the inner grid — highlights the row and emits\n * {@link RecordSelected} for the host (the no-UI equivalent of a user row-click). Returns\n * false when the viewer isn't mounted or has no entity context. The record must be one of\n * the loaded rows; the host resolves it (e.g. from {@link loadedRecords}).\n */\n public SelectRecord(record: Record<string, unknown>): boolean {\n return this.entityViewerRef?.SelectRecord(record) ?? false;\n }\n\n /**\n * Export the current view's records via the inner viewer's active renderer. Returns false\n * when the viewer isn't mounted or the active view type doesn't support export. The grid\n * renderer downloads the file itself.\n */\n public async ExportRecords(format?: 'csv' | 'excel' | 'json'): Promise<boolean> {\n return this.entityViewerRef ? this.entityViewerRef.ExportRecords(format) : false;\n }\n\n /** Handle the selector's \"save view\" request — open the config panel in the requested mode. */\n public onSaveViewRequested(event: SaveViewRequestedEvent): void {\n this.defaultSaveAsNew = event.SaveAsNew || false;\n this.isConfigPanelOpen = true;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // CONFIG PANEL\n // ========================================\n\n /** Close the config panel and clear any pending new-view carry-over state. */\n public onCloseConfigPanel(): void {\n this.isConfigPanelOpen = false;\n this.clearPendingNewViewState();\n this.cdr.detectChanges();\n }\n\n /** Reset the carry-over state used when continuing a new-view flow into the config panel. */\n private clearPendingNewViewState(): void {\n this.pendingNewViewName = '';\n this.pendingNewViewDescription = '';\n this.pendingNewViewIsShared = false;\n this.defaultSaveAsNew = false;\n }\n\n // ----- Filter dialog -----\n\n /** Open the full-width filter dialog from the config panel's request. */\n public onOpenFilterDialogRequest(event: { filterState: CompositeFilterDescriptor; filterFields: FilterFieldInfo[] }): void {\n this.filterDialogState = event.filterState;\n this.filterDialogFields = event.filterFields;\n this.isFilterDialogOpen = true;\n this.cdr.detectChanges();\n }\n\n /** Close the filter dialog. */\n public onCloseFilterDialog(): void {\n this.isFilterDialogOpen = false;\n this.cdr.detectChanges();\n }\n\n /** Apply a filter from the dialog — the config panel picks it up via `externalFilterState`. */\n public onFilterApplied(filter: CompositeFilterDescriptor): void {\n this.filterDialogState = filter;\n this.isFilterDialogOpen = false;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // SAVE VIEW\n // ========================================\n\n /**\n * Handle a save from the config panel. When {@link AutoSaveView}, persists the view itself\n * (create-new or update) via the BaseEntity; otherwise emits {@link SaveViewRequested} for the host.\n * (Faithful generalization of DataExplorer.onSaveView, minus routing/state-service/notifications.)\n */\n public async onSaveView(event: ViewSaveEvent): Promise<void> {\n if (!this._entity) {\n return;\n }\n\n if (!this.AutoSaveView) {\n this.SaveViewRequested.emit(event);\n this.isConfigPanelOpen = false;\n this.clearPendingNewViewState();\n this.cdr.detectChanges();\n return;\n }\n\n this.isSavingView = true;\n this.cdr.detectChanges();\n\n const isNew = event.SaveAsNew || !this.currentViewEntity;\n const success = isNew\n ? await this.persistNewView(event)\n : await this.persistExistingView(event);\n\n if (success) {\n this.isConfigPanelOpen = false;\n this.clearPendingNewViewState();\n // The view selector re-derives its lists reactively from UserViewEngine's cache\n // (BaseEntity save auto-invalidates the engine); we only need to reload the grid data.\n await this.entityViewerRef?.LoadData();\n }\n\n this.isSavingView = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Create and persist a brand-new view from the save event. Fires the cancelable\n * {@link BeforeViewSave} before saving and {@link AfterViewSave} after success.\n */\n private async persistNewView(event: ViewSaveEvent): Promise<boolean> {\n const provider = this.ProviderToUse;\n const newView = await provider.GetEntityObject<MJUserViewEntityExtended>('MJ: User Views', provider.CurrentUser);\n newView.Name = event.Name || 'Custom';\n newView.Description = event.Description;\n newView.EntityID = this._entity!.ID;\n newView.UserID = provider.CurrentUser.ID;\n newView.IsShared = event.IsShared;\n newView.IsDefault = false;\n\n const gridState = this.buildGridState(event);\n if (gridState) {\n newView.GridStateObject = gridState;\n }\n const sortState = this.buildSortState(event);\n if (sortState) {\n newView.SortStateObject = sortState;\n }\n newView.SmartFilterEnabled = event.SmartFilterEnabled;\n newView.SmartFilterPrompt = event.SmartFilterPrompt;\n newView.FilterState = this.buildFilterStateJson(event);\n\n const before: WorkspaceCancelableEvent<ViewSaveOperation> = { Data: { View: newView, IsNew: true }, Cancel: false };\n this.BeforeViewSave.emit(before);\n if (before.Cancel) {\n return false;\n }\n\n const saved = await newView.Save();\n if (!saved) {\n LogError(`[ViewWorkspace] Failed to create view: ${newView.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return false;\n }\n\n this.currentViewEntity = newView;\n this.selectedViewId = newView.ID;\n this.viewModified = false;\n this.currentGridState = this.parseViewGridState(newView);\n this.ViewSelected.emit(newView);\n this.SelectedViewChange.emit(newView);\n this.AfterViewSave.emit({ View: newView, IsNew: true });\n return true;\n }\n\n /**\n * Update and persist the currently-selected view from the save event. Fires the cancelable\n * {@link BeforeViewSave} before saving and {@link AfterViewSave} after success.\n */\n private async persistExistingView(event: ViewSaveEvent): Promise<boolean> {\n const view = this.currentViewEntity!;\n view.Name = event.Name;\n view.Description = event.Description;\n view.IsShared = event.IsShared;\n\n const gridState = this.buildGridState(event);\n if (gridState) {\n view.GridStateObject = gridState;\n }\n const sortState = this.buildSortState(event);\n if (sortState) {\n view.SortStateObject = sortState;\n }\n view.SmartFilterEnabled = event.SmartFilterEnabled;\n view.SmartFilterPrompt = event.SmartFilterPrompt;\n view.FilterState = this.buildFilterStateJson(event);\n\n const before: WorkspaceCancelableEvent<ViewSaveOperation> = { Data: { View: view, IsNew: false }, Cancel: false };\n this.BeforeViewSave.emit(before);\n if (before.Cancel) {\n return false;\n }\n\n const saved = await view.Save();\n if (!saved) {\n LogError(`[ViewWorkspace] Failed to update view: ${view.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return false;\n }\n\n this.viewModified = false;\n this.currentGridState = this.parseViewGridState(view);\n this.AfterViewSave.emit({ View: view, IsNew: false });\n return true;\n }\n\n /**\n * Handle saving per-user default view settings from the config panel. When {@link AutoSaveView},\n * persists to `UserInfoEngine`; otherwise emits {@link SaveDefaultsRequested}.\n * (Generalized from DataExplorer.onSaveDefaultViewSettings.)\n */\n public async onSaveDefaultViewSettings(event: ViewSaveEvent): Promise<void> {\n if (!this._entity) {\n return;\n }\n\n if (!this.AutoSaveView) {\n this.SaveDefaultsRequested.emit(event);\n this.isConfigPanelOpen = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.isSavingView = true;\n this.cdr.detectChanges();\n\n const gridState = this.buildGridState(event);\n if (gridState) {\n gridState.sortSettings = this.buildGridSortSettings(event) ?? gridState.sortSettings;\n const settingKey = `default-view-setting/${this._entity.Name}`;\n const saved = await UserInfoEngine.Instance.SetSetting(settingKey, JSON.stringify(gridState));\n if (saved) {\n this.currentGridState = {\n columnSettings: gridState.columnSettings as ViewGridState['columnSettings'],\n sortSettings: gridState.sortSettings as ViewGridState['sortSettings'],\n aggregates: gridState.aggregates\n };\n this.cdr.detectChanges();\n this.entityViewerRef?.Refresh();\n } else {\n LogError('[ViewWorkspace] Failed to save default view settings');\n }\n }\n\n this.isConfigPanelOpen = false;\n this.isSavingView = false;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // DELETE VIEW\n // ========================================\n\n /**\n * Handle a delete from the config panel. When {@link AutoSaveView}, persists the delete itself\n * (firing cancelable {@link BeforeViewDelete} / notification {@link AfterViewDelete}); otherwise\n * emits {@link DeleteViewRequested}. (Generalized from DataExplorer.onDeleteView.)\n */\n public async onDeleteView(): Promise<void> {\n if (!this.currentViewEntity) {\n return;\n }\n\n if (!this.AutoSaveView) {\n this.DeleteViewRequested.emit(this.currentViewEntity);\n this.isConfigPanelOpen = false;\n this.cdr.detectChanges();\n return;\n }\n\n const view = this.currentViewEntity;\n const viewId = view.ID;\n const viewName = view.Name;\n\n const before: WorkspaceCancelableEvent<MJUserViewEntityExtended> = { Data: view, Cancel: false };\n this.BeforeViewDelete.emit(before);\n if (before.Cancel) {\n return;\n }\n\n const deleted = await view.Delete();\n if (!deleted) {\n LogError(`[ViewWorkspace] Failed to delete view: ${view.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return;\n }\n\n this.currentViewEntity = null;\n this.selectedViewId = null;\n this.viewModified = false;\n this.isConfigPanelOpen = false;\n this.currentGridState = this.loadUserDefaultGridState();\n // The view selector re-derives its lists reactively from UserViewEngine's cache\n // (BaseEntity delete auto-invalidates the engine), so no explicit reload is needed here.\n this.ViewSelected.emit(null);\n this.SelectedViewChange.emit(null);\n this.AfterViewDelete.emit({ ViewID: viewId, ViewName: viewName });\n this.cdr.detectChanges();\n }\n\n // ========================================\n // QUICK SAVE\n // ========================================\n\n /**\n * Handle a quick-save request from the selector (F-001). Builds a summary from the config panel\n * and opens the quick-save dialog. (Generalized from DataExplorer.onQuickSaveRequested.)\n */\n public onQuickSaveRequested(saveAsNew: boolean): void {\n this.defaultSaveAsNew = saveAsNew;\n this.quickSaveSummary = this.viewConfigPanelRef?.BuildSummary() ?? null;\n this.showQuickSaveDialog = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle the quick-save dialog's save. Intercepts updates to a shared view with the shared-view\n * warning; otherwise executes the save. (Generalized from DataExplorer.onQuickSave.)\n */\n public async onQuickSave(event: QuickSaveEvent): Promise<void> {\n this.showQuickSaveDialog = false;\n\n if (!event.SaveAsNew && this.currentViewEntity?.IsShared) {\n this.pendingQuickSaveEvent = event;\n this.showSharedViewWarning = true;\n this.cdr.detectChanges();\n return;\n }\n\n await this.executeQuickSave(event);\n }\n\n /** Build a `ViewSaveEvent` from a `QuickSaveEvent` and delegate to {@link onSaveView}. */\n private async executeQuickSave(event: QuickSaveEvent): Promise<void> {\n const viewSaveEvent: ViewSaveEvent = {\n Name: event.Name,\n Description: event.Description,\n IsShared: event.IsShared,\n SaveAsNew: event.SaveAsNew,\n Columns: [],\n SortField: null,\n SortDirection: 'asc',\n SortItems: [],\n SmartFilterEnabled: false,\n SmartFilterPrompt: '',\n FilterState: this.filterDialogState ?? null,\n AggregatesConfig: null\n };\n await this.onSaveView(viewSaveEvent);\n }\n\n /** Handle the shared-view warning action (update / save-as-copy / cancel). */\n public async onSharedViewAction(action: SharedViewAction): Promise<void> {\n this.showSharedViewWarning = false;\n const event = this.pendingQuickSaveEvent;\n this.pendingQuickSaveEvent = null;\n if (!event) {\n return;\n }\n\n if (action === 'update-shared') {\n await this.executeQuickSave(event);\n } else if (action === 'save-as-copy') {\n await this.executeQuickSave({ ...event, SaveAsNew: true, IsShared: false });\n }\n this.cdr.detectChanges();\n }\n\n /** Handle the shared-view warning cancel. */\n public onSharedViewWarningCancel(): void {\n this.showSharedViewWarning = false;\n this.pendingQuickSaveEvent = null;\n this.cdr.detectChanges();\n }\n\n /** Handle the quick-save dialog close. */\n public onQuickSaveClose(): void {\n this.showQuickSaveDialog = false;\n this.cdr.detectChanges();\n }\n\n /** Handle \"open advanced\" from the quick-save dialog — carry data into the config panel. */\n public onQuickSaveOpenAdvanced(event: QuickSaveAdvancedEvent): void {\n this.pendingNewViewName = event.Name;\n this.pendingNewViewDescription = event.Description;\n this.pendingNewViewIsShared = event.IsShared;\n this.defaultSaveAsNew = true;\n this.showQuickSaveDialog = false;\n this.isConfigPanelOpen = true;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // DUPLICATE VIEW\n // ========================================\n\n /**\n * Handle a duplicate request (F-005). Opens the duplicate dialog so the user names the copy.\n * (Generalized from DataExplorer.onDuplicateView.)\n */\n public onDuplicateViewRequested(viewId?: string): void {\n const targetId = viewId || this.currentViewEntity?.ID;\n if (!targetId || !this._entity) {\n return;\n }\n\n const allViews = [...(this.viewSelectorRef?.MyViews ?? []), ...(this.viewSelectorRef?.SharedViews ?? [])];\n const viewItem = allViews.find(v => v.id === targetId);\n this.duplicateTargetViewId = targetId;\n this.duplicateSourceViewName = viewItem?.name || this.currentViewEntity?.Name || 'View';\n this.duplicateSummary = this.buildDuplicateSummary(viewItem?.entity ?? this.currentViewEntity);\n this.showDuplicateDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Build a {@link ViewConfigSummary} from a view entity for the duplicate dialog. */\n private buildDuplicateSummary(view: MJUserViewEntityExtended | null): ViewConfigSummary | null {\n if (!view) {\n return null;\n }\n let columnCount = 0;\n let filterCount = 0;\n let sortCount = 0;\n\n try {\n const gridState = view.GridStateObject;\n if (gridState?.columnSettings && Array.isArray(gridState.columnSettings)) {\n columnCount = gridState.columnSettings.filter((c: MJUserViewEntity_IGridColumnSetting) => !c.hidden).length;\n }\n } catch {\n /* ignore parse errors */\n }\n try {\n const filterState = view.FilterStateObject;\n if (filterState?.filters?.length) {\n filterCount = filterState.filters.length;\n }\n } catch {\n /* ignore parse errors */\n }\n try {\n const sortState = view.SortStateObject;\n if (Array.isArray(sortState)) {\n sortCount = sortState.length;\n }\n } catch {\n /* ignore parse errors */\n }\n\n return {\n ColumnCount: columnCount,\n FilterCount: filterCount,\n SortCount: sortCount,\n SmartFilterActive: view.SmartFilterEnabled || false,\n SmartFilterPrompt: view.SmartFilterPrompt || '',\n AggregateCount: 0\n };\n }\n\n /**\n * Handle the duplicate dialog confirmation. When {@link AutoSaveView}, loads the source view,\n * copies its config into a new personal view, and persists it; otherwise emits\n * {@link DuplicateViewRequested}. (Generalized from DataExplorer.onDuplicateConfirmed.)\n */\n public async onDuplicateConfirmed(event: DuplicateViewEvent): Promise<void> {\n this.showDuplicateDialog = false;\n const targetId = this.duplicateTargetViewId;\n this.duplicateTargetViewId = null;\n if (!targetId || !this._entity) {\n return;\n }\n\n if (!this.AutoSaveView) {\n this.DuplicateViewRequested.emit({ sourceViewId: targetId, newName: event.Name });\n return;\n }\n\n await this.persistDuplicate(targetId, event.Name);\n }\n\n /** Load the source view, copy its config into a new personal view, and persist it. */\n private async persistDuplicate(sourceViewId: string, newName: string): Promise<void> {\n const provider = this.ProviderToUse;\n const sourceView = await provider.GetEntityObject<MJUserViewEntityExtended>('MJ: User Views', provider.CurrentUser);\n const loaded = await sourceView.Load(sourceViewId);\n if (!loaded) {\n LogError(`[ViewWorkspace] Could not load view to duplicate: ${sourceView.LatestResult?.CompleteMessage ?? 'not found'}`);\n return;\n }\n\n const newView = await provider.GetEntityObject<MJUserViewEntityExtended>('MJ: User Views', provider.CurrentUser);\n newView.Name = newName;\n newView.Description = sourceView.Description || '';\n newView.EntityID = sourceView.EntityID;\n newView.UserID = provider.CurrentUser.ID;\n newView.IsShared = false;\n newView.IsDefault = false;\n newView.GridState = sourceView.GridState;\n newView.FilterState = sourceView.FilterState;\n newView.SortState = sourceView.SortState;\n newView.SmartFilterEnabled = sourceView.SmartFilterEnabled || false;\n newView.SmartFilterPrompt = sourceView.SmartFilterPrompt || '';\n\n const saved = await newView.Save();\n if (!saved) {\n LogError(`[ViewWorkspace] Failed to duplicate view: ${newView.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return;\n }\n\n // The view selector re-derives its lists reactively from UserViewEngine's cache\n // (BaseEntity save auto-invalidates the engine), so no explicit reload is needed here.\n this.AfterViewSave.emit({ View: newView, IsNew: true });\n }\n\n /** Handle the duplicate dialog cancel. */\n public onDuplicateCancel(): void {\n this.showDuplicateDialog = false;\n this.duplicateTargetViewId = null;\n this.cdr.detectChanges();\n }\n\n /** Handle duplicate triggered from the config panel — duplicate the selected view. */\n public onDuplicateFromPanel(): void {\n if (this.currentViewEntity?.ID) {\n this.isConfigPanelOpen = false;\n this.onDuplicateViewRequested(this.currentViewEntity.ID);\n }\n }\n\n // ========================================\n // REVERT\n // ========================================\n\n /**\n * Handle a revert request (F-007). Re-parses the saved view's grid state, clears the modified\n * flag, and reloads. (Generalized from DataExplorer.onRevertView.)\n */\n public async onRevertView(): Promise<void> {\n if (!this.currentViewEntity) {\n return;\n }\n const gridState = this.parseViewGridState(this.currentViewEntity);\n if (gridState) {\n this.currentGridState = gridState;\n }\n this.viewModified = false;\n await this.entityViewerRef?.LoadData();\n this.cdr.detectChanges();\n }\n\n // ========================================\n // GRID/SORT/FILTER STATE BUILDERS\n // (Generalized from DataExplorer — no state-service / selectedEntity coupling.)\n // ========================================\n\n /**\n * Build a `GridState` (Kendo-compatible) from the save event. Priority: explicit columns from the\n * config panel → live grid state → entity `DefaultInView` fields. Returns null when no columns.\n */\n private buildGridState(event: ViewSaveEvent): MJUserViewEntity_IGridState | null {\n let columnSettings: MJUserViewEntity_IGridColumnSetting[];\n\n if (event.Columns.length > 0) {\n columnSettings = event.Columns.map((col, idx) => ({\n ID: col.fieldId,\n Name: col.fieldName,\n DisplayName: col.displayName,\n userDisplayName: col.userDisplayName,\n hidden: false,\n width: col.width || undefined,\n orderIndex: idx,\n format: col.format\n }));\n } else if (this.currentGridState?.columnSettings && this.currentGridState.columnSettings.length > 0) {\n columnSettings = this.currentGridState.columnSettings;\n } else if (this._entity) {\n columnSettings = this._entity.Fields\n .filter(f => f.DefaultInView)\n .map((f, idx) => ({\n ID: f.ID,\n Name: f.Name,\n DisplayName: f.DisplayNameOrName,\n hidden: false,\n width: f.DefaultColumnWidth || undefined,\n orderIndex: idx\n }));\n if (columnSettings.length === 0) {\n return null;\n }\n } else {\n return null;\n }\n\n const sortSettings = this.buildGridSortSettings(event);\n let aggregates = event.AggregatesConfig ?? undefined;\n if (!aggregates && this.currentGridState?.aggregates) {\n aggregates = this.currentGridState.aggregates;\n }\n\n return { columnSettings, sortSettings, aggregates };\n }\n\n /** Build grid sort settings (`{field, dir}[]`) from the save event, falling back to live state. */\n private buildGridSortSettings(event: ViewSaveEvent): MJUserViewEntity_IGridSortSetting[] | undefined {\n if (event.SortItems && event.SortItems.length > 0) {\n return event.SortItems.map(item => ({ field: item.field, dir: item.direction }));\n }\n if (event.SortField) {\n return [{ field: event.SortField, dir: event.SortDirection }];\n }\n if (this.currentGridState?.sortSettings && this.currentGridState.sortSettings.length > 0) {\n return this.currentGridState.sortSettings;\n }\n return undefined;\n }\n\n /** Build a `SortState` (`{field, direction}[]`) from the save event. Returns null when no sort. */\n private buildSortState(event: ViewSaveEvent): MJUserViewEntity_ISortStateItem[] | null {\n if (event.SortItems && event.SortItems.length > 0) {\n return event.SortItems.map(item => ({ field: item.field, direction: item.direction }));\n }\n if (event.SortField) {\n return [{ field: event.SortField, direction: event.SortDirection }];\n }\n return null;\n }\n\n /** Serialize the filter state to JSON, defaulting to an empty Kendo filter. */\n private buildFilterStateJson(event: ViewSaveEvent): string {\n return event.FilterState\n ? JSON.stringify(event.FilterState)\n : JSON.stringify({ logic: 'and', filters: [] });\n }\n\n // ========================================\n // GRID STATE PARSE / DEFAULTS\n // ========================================\n\n /**\n * Parse a view's `GridState` into a {@link ViewGridState}, validating columns/sorts against the\n * current entity to avoid stale fields from a previous entity. Returns null when no valid columns.\n */\n private parseViewGridState(view: MJUserViewEntityExtended): ViewGridState | null {\n if (!view.GridState) {\n return null;\n }\n try {\n const parsed = view.GridStateObject;\n if (parsed && Array.isArray(parsed.columnSettings)) {\n const validColumns = this._entity\n ? parsed.columnSettings.filter(\n (col: MJUserViewEntity_IGridColumnSetting) => this._entity!.Fields.some(f => f.Name === col.Name)\n )\n : parsed.columnSettings;\n const validSorts = this._entity\n ? (parsed.sortSettings || []).filter(\n (s: MJUserViewEntity_IGridSortSetting) => this._entity!.Fields.some(f => f.Name === s.field)\n )\n : parsed.sortSettings || [];\n\n if (validColumns.length > 0) {\n return {\n columnSettings: validColumns,\n sortSettings: validSorts,\n aggregates: parsed.aggregates || undefined\n };\n }\n }\n return null;\n } catch (error) {\n LogError(`[ViewWorkspace] Failed to parse GridState: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n /**\n * Load the per-user default grid state for the current entity from `UserInfoEngine`, validating\n * columns/sorts against the entity. Returns null when none saved.\n */\n private loadUserDefaultGridState(): ViewGridState | null {\n if (!this._entity) {\n return null;\n }\n try {\n const settingKey = `default-view-setting/${this._entity.Name}`;\n const savedState = UserInfoEngine.Instance.GetSetting(settingKey);\n if (savedState) {\n const gridState = JSON.parse(savedState);\n if (gridState && Array.isArray(gridState.columnSettings)) {\n const validColumns = gridState.columnSettings.filter(\n (col: { Name: string }) => this._entity!.Fields.some(f => f.Name === col.Name)\n );\n const validSorts = (gridState.sortSettings || []).filter(\n (s: { field: string }) => this._entity!.Fields.some(f => f.Name === s.field)\n );\n if (validColumns.length > 0) {\n return { columnSettings: validColumns, sortSettings: validSorts };\n }\n }\n }\n } catch (error) {\n LogError(`[ViewWorkspace] Failed to load user default grid state: ${error instanceof Error ? error.message : String(error)}`);\n }\n return null;\n }\n}\n","<div class=\"view-workspace\">\n <!-- Toolbar: view selector + view-type switcher (single row) -->\n <div class=\"workspace-toolbar\">\n <mj-view-selector\n [Provider]=\"Provider\"\n [Entity]=\"Entity\"\n [SelectedViewID]=\"selectedViewId\"\n [ViewModified]=\"viewModified\"\n (ViewSelected)=\"onViewSelected($event)\"\n (SaveViewRequested)=\"onSaveViewRequested($event)\"\n (OpenInTabRequested)=\"onOpenInTabRequested($event)\"\n (ConfigureViewRequested)=\"onConfigureViewRequested()\"\n (CreateNewRecordRequested)=\"onCreateNewRecordRequested()\"\n (ExportRequested)=\"onExportRequested()\"\n (DuplicateViewRequested)=\"onDuplicateViewRequested($event)\"\n (QuickSaveRequested)=\"onQuickSaveRequested($event)\"\n (RevertRequested)=\"onRevertView()\">\n </mj-view-selector>\n\n <span class=\"workspace-toolbar-spacer\"></span>\n\n <!-- View-type switcher lifted into the top toolbar (same row as the selector). The inner\n entity-viewer's own header switcher is suppressed via innerViewerConfig so it appears\n exactly once. Switching routes to the viewer via SelectViewTypeById. -->\n <mj-view-type-switcher\n [Provider]=\"Provider\"\n [Entity]=\"Entity\"\n [ActiveViewTypeID]=\"activeViewTypeId\"\n (ViewTypeSelected)=\"onToolbarViewTypeSelected($event)\">\n </mj-view-type-switcher>\n </div>\n\n <!-- Data renderer -->\n <div class=\"workspace-body\">\n @if (Entity) {\n <mj-entity-viewer\n [Provider]=\"Provider\"\n [Entity]=\"Entity\"\n [ViewEntity]=\"currentViewEntity\"\n [FilterText]=\"filterText\"\n [SelectedRecordID]=\"selectedRecordId\"\n [GridState]=\"currentGridState\"\n [AutoSaveView]=\"AutoSaveView\"\n [Config]=\"innerViewerConfig\"\n (FilterTextChange)=\"onFilterTextChanged($event)\"\n (RecordSelected)=\"onRecordSelected($event)\"\n (RecordOpened)=\"onRecordOpened($event)\"\n (DataLoaded)=\"onDataLoaded($event)\"\n (FilteredCountChanged)=\"onFilteredCountChanged($event)\"\n (OpenRelatedRecordRequested)=\"onOpenRelatedRecordRequested($event)\"\n (CreateRecordRequested)=\"onCreateRecordRequested()\"\n (ConfigureRequested)=\"onConfigureViewRequested()\">\n </mj-entity-viewer>\n }\n </div>\n\n <!-- View configuration panel (slide-in) -->\n <mj-view-config-panel\n [Provider]=\"Provider\"\n [Entity]=\"Entity\"\n [ViewEntity]=\"currentViewEntity\"\n [IsOpen]=\"isConfigPanelOpen\"\n [CurrentGridState]=\"currentGridState\"\n [SampleData]=\"loadedRecords\"\n [ExternalFilterState]=\"filterDialogState\"\n [IsSaving]=\"isSavingView\"\n [DefaultSaveAsNew]=\"defaultSaveAsNew\"\n [PendingNewViewName]=\"pendingNewViewName\"\n [PendingNewViewDescription]=\"pendingNewViewDescription\"\n [PendingNewViewIsShared]=\"pendingNewViewIsShared\"\n (Close)=\"onCloseConfigPanel()\"\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 <!-- Full-width filter dialog -->\n @if (isFilterDialogOpen) {\n <div class=\"filter-dialog-backdrop\" (click)=\"onCloseFilterDialog()\"></div>\n <div class=\"filter-dialog\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"filter-dialog-header\">\n <div class=\"filter-dialog-title\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Edit Filters</span>\n </div>\n <button class=\"filter-dialog-close\" type=\"button\" (click)=\"onCloseFilterDialog()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"filter-dialog-content\">\n <mj-filter-builder\n [fields]=\"filterDialogFields\"\n [filter]=\"filterDialogState\"\n [showSummary]=\"true\"\n (apply)=\"onFilterApplied($event)\"\n (filterChange)=\"filterDialogState = $event\">\n </mj-filter-builder>\n </div>\n <div class=\"filter-dialog-footer\">\n <button mjButton variant=\"primary\" size=\"sm\" type=\"button\"\n (click)=\"filterDialogState && onFilterApplied(filterDialogState)\">\n <i class=\"fa-solid fa-check\"></i> Apply Filters\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" type=\"button\" (click)=\"onCloseFilterDialog()\">\n Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- Quick save dialog -->\n <mj-quick-save-dialog\n [IsOpen]=\"showQuickSaveDialog\"\n [ViewEntity]=\"currentViewEntity\"\n [EntityName]=\"Entity?.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 -->\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 -->\n <mj-shared-view-warning-dialog\n [IsOpen]=\"showSharedViewWarning\"\n [ViewName]=\"currentViewEntity?.Name ?? ''\"\n (Action)=\"onSharedViewAction($event)\"\n (Cancel)=\"onSharedViewWarningCancel()\">\n </mj-shared-view-warning-dialog>\n\n <!-- Export dialog — opened by the toolbar Export button for ANY view type. The dialog is generic\n (data + columns only), so Excel/CSV/JSON + sampling work identically on Grid/Cards/Map/Timeline. -->\n <mj-export-dialog\n [visible]=\"showExportDialog\"\n [config]=\"exportDialogConfig\"\n (closed)=\"onExportDialogClosed($event)\">\n </mj-export-dialog>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"view-workspace.component.js","sourceRoot":"","sources":["../../../src/lib/view-workspace/view-workspace.component.ts","../../../src/lib/view-workspace/view-workspace.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n ChangeDetectorRef,\n ViewChild\n} from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityFieldInfo, EntityInfo, LogError } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n MJUserViewEntityExtended,\n UserInfoEngine,\n ViewGridState,\n MJUserViewEntity_IGridState,\n MJUserViewEntity_IGridColumnSetting,\n MJUserViewEntity_IGridSortSetting,\n MJUserViewEntity_ISortStateItem\n} from '@memberjunction/core-entities';\nimport { CompositeFilterDescriptor, FilterFieldInfo } from '@memberjunction/ng-filter-builder';\nimport { ExportDialogConfig, ExportDialogResult } from '@memberjunction/ng-export-service';\nimport { ExportColumn } from '@memberjunction/export-engine';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport {\n RecordSelectedEvent,\n RecordOpenedEvent,\n ViewConfigSummary,\n QuickSaveEvent,\n QuickSaveAdvancedEvent,\n DataLoadedEvent,\n FilteredCountChangedEvent,\n EntityViewerConfig,\n SortState,\n SortDirection\n} from '../types';\nimport { EntityViewerComponent } from '../entity-viewer/entity-viewer.component';\nimport { ViewRelatedRecordNavigation } from '../view-types';\nimport { ViewSelectorComponent, ViewSelectedEvent, SaveViewRequestedEvent } from '../view-selector/view-selector.component';\nimport { ViewConfigPanelComponent, ViewSaveEvent } from '../view-config-panel/view-config-panel.component';\nimport { SharedViewAction } from '../shared-view-warning-dialog/shared-view-warning-dialog.component';\nimport { DuplicateViewEvent } from '../duplicate-view-dialog/duplicate-view-dialog.component';\n\n/**\n * Generic cancelable event payload used by the workspace's `Before…` lifecycle outputs.\n * Mirrors the house pattern (`CancelableEvent<T>` in `@memberjunction/ng-clustering` and the\n * grid's `BeforeRowClick`): a handler sets `Cancel = true` on the args object to veto the\n * default operation that would otherwise follow.\n *\n * @typeParam T - the shape of the operation-specific payload carried on {@link Data}.\n */\nexport interface WorkspaceCancelableEvent<T = unknown> {\n /** The operation payload (e.g. the view being saved / deleted). */\n Data: T;\n /** Set to `true` in a `Before…` handler to cancel the pending operation. */\n Cancel: boolean;\n}\n\n/**\n * Payload describing a view save about to occur / that just occurred. Emitted via\n * {@link ViewWorkspaceComponent.BeforeViewSave} (wrapped in {@link WorkspaceCancelableEvent})\n * and {@link ViewWorkspaceComponent.AfterViewSave}.\n */\nexport interface ViewSaveOperation {\n /** The view entity being saved (the new record when creating, the existing record when updating). */\n View: MJUserViewEntityExtended;\n /** True when this save created a brand-new view; false when it updated an existing one. */\n IsNew: boolean;\n}\n\n/**\n * Payload describing a view delete that just occurred, emitted via\n * {@link ViewWorkspaceComponent.AfterViewDelete}.\n */\nexport interface ViewDeleteOperation {\n /** The `MJ: User Views` row ID that was deleted. */\n ViewID: string;\n /** The name of the deleted view (captured before deletion). */\n ViewName: string;\n}\n\n/**\n * `mj-view-workspace` — the reusable \"browse an entity's data across saved views\" workspace.\n *\n * This composite component orchestrates the full saved-view lifecycle (select / save / save-as-new /\n * rename / duplicate / delete / revert / quick-save / save-defaults) on top of an entity's data, by\n * composing the existing Generic lego components in this package:\n *\n * - {@link ViewSelectorComponent} — the saved-view dropdown.\n * - {@link EntityViewerComponent} — the data renderer (grid / cards / timeline / map / plug-ins).\n * - {@link ViewConfigPanelComponent} — the slide-in column/sort/filter configuration panel.\n * - `mj-view-type-switcher` — the toolbar dropdown for switching the active view type.\n * - `mj-quick-save-dialog`, `mj-duplicate-view-dialog`, `mj-shared-view-warning-dialog`,\n * `mj-ev-confirm-dialog` — the focused modals.\n *\n * It is the generic extraction of what `DataExplorerDashboardComponent` does today, **minus routing,\n * URL/query-param sync, and the Explorer state service**. Anything that requires app-level routing is\n * emitted as an event ({@link OpenRecordRequested}, {@link OpenViewInTabRequested},\n * {@link CreateNewRecordRequested}) for the host to handle — this component never imports `Router`.\n *\n * ## Persistence model\n * - When {@link AutoSaveView} is `true`, the workspace persists view CRUD itself via the\n * `MJUserViewEntityExtended` BaseEntity (`.Save()` / `.Delete()`) and `UserInfoEngine` for the\n * per-user default-view settings, firing the cancelable `Before…` events and notification `After…`\n * events around each operation.\n * - When {@link AutoSaveView} is `false` (the default), the workspace performs no persistence — it\n * emits the change-request events ({@link SaveViewRequested}, {@link DeleteViewRequested},\n * {@link DuplicateViewRequested}, etc.) and the host is responsible for persisting and feeding back\n * the updated view via the `[SelectedView]` input.\n *\n * State is held in plain component fields — there is no state-management service.\n *\n * @example\n * ```html\n * <mj-view-workspace\n * [EntityName]=\"'Accounts'\"\n * [AutoSaveView]=\"true\"\n * (OpenRecordRequested)=\"navService.openRecord($event.entity, $event.record)\"\n * (OpenViewInTabRequested)=\"navService.openView($event)\"\n * (CreateNewRecordRequested)=\"navService.newRecord($event)\">\n * </mj-view-workspace>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-view-workspace',\n templateUrl: './view-workspace.component.html',\n styleUrls: ['./view-workspace.component.css']\n})\nexport class ViewWorkspaceComponent extends BaseAngularComponent implements OnInit {\n // ========================================\n // INPUTS\n // ========================================\n\n private _entity: EntityInfo | null = null;\n private _initialized = false;\n\n /**\n * The entity whose data this workspace browses. May be supplied directly, or resolved from\n * {@link EntityName} / {@link EntityID}. When it changes the selected view and config panel reset.\n */\n @Input()\n get Entity(): EntityInfo | null {\n return this._entity;\n }\n set Entity(value: EntityInfo | null) {\n const previous = this._entity;\n this._entity = value;\n if (this._initialized && value && (!previous || !UUIDsEqual(value.ID, previous.ID))) {\n this.resetForEntityChange();\n }\n }\n\n /**\n * Convenience input: resolve {@link Entity} by entity **name** via the active provider.\n * Use this OR {@link Entity} OR {@link EntityID}.\n */\n @Input()\n set EntityName(value: string | null) {\n if (!value) {\n return;\n }\n const resolved = this.ProviderToUse?.EntityByName(value) ?? null;\n if (resolved) {\n this.Entity = resolved;\n }\n }\n\n /**\n * Convenience input: resolve {@link Entity} by entity **ID** via the active provider.\n * Use this OR {@link Entity} OR {@link EntityName}.\n */\n @Input()\n set EntityID(value: string | null) {\n if (!value) {\n return;\n }\n const resolved = this.ProviderToUse?.Entities.find(e => UUIDsEqual(e.ID, value)) ?? null;\n if (resolved) {\n this.Entity = resolved;\n }\n }\n\n /**\n * When `true`, the workspace persists view CRUD itself (BaseEntity `.Save()`/`.Delete()` plus\n * `UserInfoEngine` for the default-view settings) and fires the cancelable `Before…` / notification\n * `After…` events around each persistence operation. When `false` (the default) the workspace only\n * emits the change-request events and the host persists. Persistence is provider-based and\n * generic-safe — it never performs routing.\n */\n @Input() AutoSaveView: boolean = false;\n\n /**\n * The currently-selected view. Hosts that own persistence (when {@link AutoSaveView} is `false`)\n * feed the loaded view back in here after handling a save/select request. Bound two-way friendly:\n * the workspace emits {@link SelectedViewChange} whenever the selection changes internally.\n */\n @Input()\n get SelectedView(): MJUserViewEntityExtended | null {\n return this.CurrentViewEntity;\n }\n set SelectedView(value: MJUserViewEntityExtended | null) {\n this.CurrentViewEntity = value;\n this.CurrentGridState = value ? this.parseViewGridState(value) : this.loadUserDefaultGridState();\n this.ViewModified = false;\n }\n\n // ----- Host-driven passthrough inputs (forwarded to the inner entity-viewer) -----\n //\n // These let a host (e.g. the Explorer DataExplorer dashboard) own the chrome — filter box, record\n // selection — while the workspace owns the saved-view lifecycle. All view-type-specific chrome\n // (grid toolbar, timeline date/orientation, map render mode) is now self-contained in each plug-in\n // renderer, so the workspace no longer forwards any of it.\n\n /**\n * The free-text filter to apply to the inner viewer. When a host owns the filter box it binds\n * this (typically a debounced value); the workspace's {@link filterText} field tracks it.\n */\n @Input()\n get FilterText(): string {\n return this.filterText;\n }\n set FilterText(value: string) {\n this.filterText = value ?? '';\n }\n\n /**\n * The composite-key string of the record to highlight in the inner viewer. When a host owns\n * record selection (e.g. via a detail panel) it binds this; the workspace's\n * {@link selectedRecordId} field tracks it.\n */\n @Input()\n get SelectedRecordId(): string | null {\n return this.selectedRecordId;\n }\n set SelectedRecordId(value: string | null) {\n this.selectedRecordId = value;\n }\n\n /** Partial {@link EntityViewerConfig} forwarded to the inner viewer (toolbar/pagination/etc.). */\n @Input() ViewerConfig: Partial<EntityViewerConfig> | null = null;\n\n // ========================================\n // OUTPUTS — routing / host concerns (this component never routes)\n // ========================================\n\n /**\n * Emitted when the user opens a record (double-click / open). The host performs the navigation.\n */\n @Output() OpenRecordRequested = new EventEmitter<{ entity: EntityInfo; record: Record<string, unknown> }>();\n\n /**\n * Emitted when the user asks to open the current view in its own tab. Carries the `MJ: User Views`\n * row ID. The host performs the navigation.\n */\n @Output() OpenViewInTabRequested = new EventEmitter<string>();\n\n /**\n * Emitted when the user asks to create a new record for the current entity — either from the\n * selector or bubbled up from a plug-in renderer's \"New\" button. The host opens the form.\n */\n @Output() CreateNewRecordRequested = new EventEmitter<EntityInfo>();\n\n /**\n * NAVIGATION request bubbled up from a plug-in renderer (via the inner viewer) to open a *related*\n * record on a (possibly different) entity — e.g. a grid foreign-key drill-through. The host routes.\n */\n @Output() OpenRelatedRecordRequested = new EventEmitter<ViewRelatedRecordNavigation>();\n\n /**\n * Emitted when a record is selected (single click) in the viewer.\n */\n @Output() RecordSelected = new EventEmitter<RecordSelectedEvent>();\n\n /**\n * Emitted when the selected view changes (selection, save, delete). Notification only.\n */\n @Output() ViewSelected = new EventEmitter<MJUserViewEntityExtended | null>();\n\n /**\n * Two-way-binding companion for {@link SelectedView}.\n */\n @Output() SelectedViewChange = new EventEmitter<MJUserViewEntityExtended | null>();\n\n // ----- Forwarded inner-viewer events (the generic, view-type-agnostic ones) -----\n //\n // The workspace owns the inner entity-viewer; it re-emits the viewer's generic signals (filter,\n // data-load, counts) so a host can drive Explorer-only concerns (URL sync, detail panel). All\n // view-type-specific feature events (grid selection/add-to-list, map state, grid state) are now\n // self-contained in the plug-in renderers and no longer bubble through the workspace.\n\n /**\n * Emitted when the inner viewer's filter text changes (two-way friendly with {@link FilterText}).\n */\n @Output() FilterTextChanged = new EventEmitter<string>();\n\n /**\n * Emitted when the inner viewer finishes loading data — carries counts, timing and the records.\n */\n @Output() DataLoaded = new EventEmitter<DataLoadedEvent>();\n\n /**\n * Emitted when the inner viewer's filtered/total counts change.\n */\n @Output() FilteredCountChanged = new EventEmitter<FilteredCountChangedEvent>();\n\n // ----- Persistence lifecycle events -----\n\n /**\n * Emitted (cancelable) BEFORE a view save is persisted. A handler may set `Cancel = true` to veto.\n * Only fires when {@link AutoSaveView} is `true`.\n */\n @Output() BeforeViewSave = new EventEmitter<WorkspaceCancelableEvent<ViewSaveOperation>>();\n\n /**\n * Emitted AFTER a view save has been persisted. Notification only.\n */\n @Output() AfterViewSave = new EventEmitter<ViewSaveOperation>();\n\n /**\n * Emitted (cancelable) BEFORE a view delete is persisted. A handler may set `Cancel = true` to veto.\n * Only fires when {@link AutoSaveView} is `true`.\n */\n @Output() BeforeViewDelete = new EventEmitter<WorkspaceCancelableEvent<MJUserViewEntityExtended>>();\n\n /**\n * Emitted AFTER a view delete has been persisted. Notification only.\n */\n @Output() AfterViewDelete = new EventEmitter<ViewDeleteOperation>();\n\n // ----- Change-request events (the host persists when AutoSaveView is false) -----\n\n /**\n * Emitted when the user requests a save and {@link AutoSaveView} is `false`. The host persists.\n */\n @Output() SaveViewRequested = new EventEmitter<ViewSaveEvent>();\n\n /**\n * Emitted when the user requests a delete and {@link AutoSaveView} is `false`. The host persists.\n */\n @Output() DeleteViewRequested = new EventEmitter<MJUserViewEntityExtended>();\n\n /**\n * Emitted when the user requests a duplicate and {@link AutoSaveView} is `false`. The host persists.\n * Carries the source view ID and the chosen name for the copy.\n */\n @Output() DuplicateViewRequested = new EventEmitter<{ sourceViewId: string; newName: string }>();\n\n /**\n * Emitted when the user saves per-user default view settings and {@link AutoSaveView} is `false`.\n */\n @Output() SaveDefaultsRequested = new EventEmitter<ViewSaveEvent>();\n\n // ========================================\n // CHILD COMPONENT REFERENCES\n // ========================================\n\n /** Reference to the view selector (for reloading the view list after CRUD). */\n @ViewChild(ViewSelectorComponent) protected viewSelectorRef?: ViewSelectorComponent;\n\n /** Reference to the entity viewer (for flushing pending grid changes + reloading data). */\n @ViewChild(EntityViewerComponent) protected entityViewerRef?: EntityViewerComponent;\n\n /** Reference to the config panel (for building summaries + canEdit checks). */\n @ViewChild(ViewConfigPanelComponent) protected viewConfigPanelRef?: ViewConfigPanelComponent;\n\n // ========================================\n // INTERNAL STATE (plain fields — no state service)\n // ========================================\n\n /** The currently selected view entity (null = the default/unsaved view). */\n public CurrentViewEntity: MJUserViewEntityExtended | null = null;\n\n /** @deprecated Use {@link CurrentViewEntity}. */\n public get currentViewEntity(): MJUserViewEntityExtended | null {\n return this.CurrentViewEntity;\n }\n /** @deprecated Use {@link CurrentViewEntity}. */\n public set currentViewEntity(value: MJUserViewEntityExtended | null) {\n this.CurrentViewEntity = value;\n }\n\n /** The currently selected view ID (null = default view). */\n public SelectedViewId: string | null = null;\n\n /** @deprecated Use {@link SelectedViewId}. */\n public get selectedViewId(): string | null {\n return this.SelectedViewId;\n }\n /** @deprecated Use {@link SelectedViewId}. */\n public set selectedViewId(value: string | null) {\n this.SelectedViewId = value;\n }\n\n /** Live grid state (column widths / order / sort / aggregates) reflecting user interaction. */\n public CurrentGridState: ViewGridState | null = null;\n\n /** @deprecated Use {@link CurrentGridState}. */\n public get currentGridState(): ViewGridState | null {\n return this.CurrentGridState;\n }\n /** @deprecated Use {@link CurrentGridState}. */\n public set currentGridState(value: ViewGridState | null) {\n this.CurrentGridState = value;\n }\n\n /** Whether the current view has unsaved modifications. */\n public ViewModified: boolean = false;\n\n /** @deprecated Use {@link ViewModified}. */\n public get viewModified(): boolean {\n return this.ViewModified;\n }\n /** @deprecated Use {@link ViewModified}. */\n public set viewModified(value: boolean) {\n this.ViewModified = value;\n }\n\n /** The current free-text filter. */\n public filterText: string = '';\n\n /** The currently selected record's composite-key string (for grid highlight). */\n public selectedRecordId: string | null = null;\n\n /** Records loaded by the viewer, kept for config-panel sample data. */\n public LoadedRecords: Record<string, unknown>[] = [];\n\n /** @deprecated Use {@link LoadedRecords}. */\n public get loadedRecords(): Record<string, unknown>[] {\n return this.LoadedRecords;\n }\n /** @deprecated Use {@link LoadedRecords}. */\n public set loadedRecords(value: Record<string, unknown>[]) {\n this.LoadedRecords = value;\n }\n\n /** Whether a save operation is in progress (drives the saving spinners). */\n public IsSavingView: boolean = false;\n\n /** @deprecated Use {@link IsSavingView}. */\n public get isSavingView(): boolean {\n return this.IsSavingView;\n }\n /** @deprecated Use {@link IsSavingView}. */\n public set isSavingView(value: boolean) {\n this.IsSavingView = value;\n }\n\n // ----- Dialog / panel open flags -----\n\n /** Whether the slide-in config panel is open. */\n public IsConfigPanelOpen: boolean = false;\n\n /** @deprecated Use {@link IsConfigPanelOpen}. */\n public get isConfigPanelOpen(): boolean {\n return this.IsConfigPanelOpen;\n }\n /** @deprecated Use {@link IsConfigPanelOpen}. */\n public set isConfigPanelOpen(value: boolean) {\n this.IsConfigPanelOpen = value;\n }\n\n /** Whether the quick-save dialog is open. */\n public ShowQuickSaveDialog: boolean = false;\n\n /** @deprecated Use {@link ShowQuickSaveDialog}. */\n public get showQuickSaveDialog(): boolean {\n return this.ShowQuickSaveDialog;\n }\n /** @deprecated Use {@link ShowQuickSaveDialog}. */\n public set showQuickSaveDialog(value: boolean) {\n this.ShowQuickSaveDialog = value;\n }\n\n /** Whether the duplicate-view dialog is open. */\n public ShowDuplicateDialog: boolean = false;\n\n /** @deprecated Use {@link ShowDuplicateDialog}. */\n public get showDuplicateDialog(): boolean {\n return this.ShowDuplicateDialog;\n }\n /** @deprecated Use {@link ShowDuplicateDialog}. */\n public set showDuplicateDialog(value: boolean) {\n this.ShowDuplicateDialog = value;\n }\n\n /** Whether the shared-view warning dialog is open. */\n public ShowSharedViewWarning: boolean = false;\n\n /** @deprecated Use {@link ShowSharedViewWarning}. */\n public get showSharedViewWarning(): boolean {\n return this.ShowSharedViewWarning;\n }\n /** @deprecated Use {@link ShowSharedViewWarning}. */\n public set showSharedViewWarning(value: boolean) {\n this.ShowSharedViewWarning = value;\n }\n\n /** Whether the config panel opens in \"save as new\" mode. */\n public DefaultSaveAsNew: boolean = false;\n\n /** @deprecated Use {@link DefaultSaveAsNew}. */\n public get defaultSaveAsNew(): boolean {\n return this.DefaultSaveAsNew;\n }\n /** @deprecated Use {@link DefaultSaveAsNew}. */\n public set defaultSaveAsNew(value: boolean) {\n this.DefaultSaveAsNew = value;\n }\n\n // ----- Pending state carried across dialogs -----\n\n /** Summary shown in the quick-save dialog. */\n public QuickSaveSummary: ViewConfigSummary | null = null;\n\n /** @deprecated Use {@link QuickSaveSummary}. */\n public get quickSaveSummary(): ViewConfigSummary | null {\n return this.QuickSaveSummary;\n }\n /** @deprecated Use {@link QuickSaveSummary}. */\n public set quickSaveSummary(value: ViewConfigSummary | null) {\n this.QuickSaveSummary = value;\n }\n\n /**\n * Name pre-filled in the quick-save dialog when it opens as a name prompt for a default-view\n * Save that carries a filter (see {@link OnSaveDefaultViewSettings}). Empty for every other\n * quick-save, which keeps the field blank as before.\n */\n public QuickSaveSuggestedName: string = '';\n\n /**\n * The config-panel save staged while the user names the view it is being promoted into.\n * Set only when a Save on the default (unsaved) view carries a filter; consumed by\n * {@link executeQuickSave}, which merges it with the name the dialog collects.\n */\n private pendingDefaultViewSave: ViewSaveEvent | null = null;\n\n /** Summary shown in the duplicate-view dialog. */\n public DuplicateSummary: ViewConfigSummary | null = null;\n\n /** @deprecated Use {@link DuplicateSummary}. */\n public get duplicateSummary(): ViewConfigSummary | null {\n return this.DuplicateSummary;\n }\n /** @deprecated Use {@link DuplicateSummary}. */\n public set duplicateSummary(value: ViewConfigSummary | null) {\n this.DuplicateSummary = value;\n }\n\n /** Source view name shown in the duplicate-view dialog. */\n public DuplicateSourceViewName: string = '';\n\n /** @deprecated Use {@link DuplicateSourceViewName}. */\n public get duplicateSourceViewName(): string {\n return this.DuplicateSourceViewName;\n }\n /** @deprecated Use {@link DuplicateSourceViewName}. */\n public set duplicateSourceViewName(value: string) {\n this.DuplicateSourceViewName = value;\n }\n\n /** The view ID being duplicated. */\n private duplicateTargetViewId: string | null = null;\n\n /** A quick-save event held while the shared-view warning is shown. */\n private pendingQuickSaveEvent: QuickSaveEvent | null = null;\n\n /** Pre-populated name carried from quick-save dialog into the config panel. */\n public PendingNewViewName: string = '';\n\n /** @deprecated Use {@link PendingNewViewName}. */\n public get pendingNewViewName(): string {\n return this.PendingNewViewName;\n }\n /** @deprecated Use {@link PendingNewViewName}. */\n public set pendingNewViewName(value: string) {\n this.PendingNewViewName = value;\n }\n\n /** Pre-populated description carried from quick-save dialog into the config panel. */\n public PendingNewViewDescription: string = '';\n\n /** @deprecated Use {@link PendingNewViewDescription}. */\n public get pendingNewViewDescription(): string {\n return this.PendingNewViewDescription;\n }\n /** @deprecated Use {@link PendingNewViewDescription}. */\n public set pendingNewViewDescription(value: string) {\n this.PendingNewViewDescription = value;\n }\n\n /** Pre-populated sharing preference carried from quick-save dialog into the config panel. */\n public PendingNewViewIsShared: boolean = false;\n\n /** @deprecated Use {@link PendingNewViewIsShared}. */\n public get pendingNewViewIsShared(): boolean {\n return this.PendingNewViewIsShared;\n }\n /** @deprecated Use {@link PendingNewViewIsShared}. */\n public set pendingNewViewIsShared(value: boolean) {\n this.PendingNewViewIsShared = value;\n }\n\n /** Traditional filter carried from quick-save dialog back into the config panel. */\n public PendingNewViewFilterState: CompositeFilterDescriptor | null = null;\n\n /** Smart-filter toggle carried from quick-save dialog back into the config panel. */\n public PendingNewViewSmartFilterEnabled: boolean = false;\n\n /** Smart-filter prompt carried from quick-save dialog back into the config panel. */\n public PendingNewViewSmartFilterPrompt: string = '';\n\n // ----- Filter dialog (rendered at workspace level for full width) -----\n\n /** Whether the full-width filter dialog is open. */\n public IsFilterDialogOpen: boolean = false;\n\n /** @deprecated Use {@link IsFilterDialogOpen}. */\n public get isFilterDialogOpen(): boolean {\n return this.IsFilterDialogOpen;\n }\n /** @deprecated Use {@link IsFilterDialogOpen}. */\n public set isFilterDialogOpen(value: boolean) {\n this.IsFilterDialogOpen = value;\n }\n\n /** The filter state currently being edited in the filter dialog. */\n public FilterDialogState: CompositeFilterDescriptor | null = null;\n\n /** @deprecated Use {@link FilterDialogState}. */\n public get filterDialogState(): CompositeFilterDescriptor | null {\n return this.FilterDialogState;\n }\n /** @deprecated Use {@link FilterDialogState}. */\n public set filterDialogState(value: CompositeFilterDescriptor | null) {\n this.FilterDialogState = value;\n }\n\n /** The filter fields available in the filter dialog. */\n public FilterDialogFields: FilterFieldInfo[] = [];\n\n /** @deprecated Use {@link FilterDialogFields}. */\n public get filterDialogFields(): FilterFieldInfo[] {\n return this.FilterDialogFields;\n }\n /** @deprecated Use {@link FilterDialogFields}. */\n public set filterDialogFields(value: FilterFieldInfo[]) {\n this.FilterDialogFields = value;\n }\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n /** Controls the workspace-level export dialog (the same generic dialog the grid uses). */\n public ShowExportDialog: boolean = false;\n\n /** @deprecated Use {@link ShowExportDialog}. */\n public get showExportDialog(): boolean {\n return this.ShowExportDialog;\n }\n /** @deprecated Use {@link ShowExportDialog}. */\n public set showExportDialog(value: boolean) {\n this.ShowExportDialog = value;\n }\n public ExportDialogConfig: ExportDialogConfig | null = null;\n\n /** @deprecated Use {@link ExportDialogConfig}. */\n public get exportDialogConfig(): ExportDialogConfig | null {\n return this.ExportDialogConfig;\n }\n /** @deprecated Use {@link ExportDialogConfig}. */\n public set exportDialogConfig(value: ExportDialogConfig | null) {\n this.ExportDialogConfig = value;\n }\n\n /**\n * Handles the toolbar's Export button (the `<mj-view-selector>` `ExportRequested` output). This is\n * the always-visible, view-type-agnostic export for the workspace — previously the event wasn't\n * wired at all, so the button did nothing on every view type. It fetches the FULL result set via the\n * inner viewer's capped, filter/sort-aware fetch (bounded + warns past the cap), then opens the SAME\n * generic export dialog the grid uses — with format (Excel/CSV/JSON), sampling, and file-name\n * options. Because the dialog only needs data + columns (it has no view-type dependency), this works\n * identically for Grid, Cards, Map and Timeline. Never fails silently — every path notifies.\n */\n public async OnExportRequested(): Promise<void> {\n const viewer = this.entityViewerRef;\n if (!viewer || !this._entity) {\n console.error('[ViewWorkspace] Export: viewer not ready', { hasViewer: !!viewer, hasEntity: !!this._entity });\n MJNotificationService.Instance.CreateSimpleNotification('Export is not ready yet — try again in a moment.', 'error', 5000);\n return;\n }\n MJNotificationService.Instance.CreateSimpleNotification('Preparing your export…', 'info', 2000);\n try {\n const rows = await viewer.FetchAllRowsForExport();\n if (!rows || rows.length === 0) {\n MJNotificationService.Instance.CreateSimpleNotification('Nothing to export — the view returned no records.', 'warning', 5000);\n return;\n }\n this.ExportDialogConfig = {\n data: rows,\n columns: this.buildExportColumns(),\n defaultFileName: this.buildExportFileName(),\n availableFormats: ['excel', 'csv', 'json'],\n defaultFormat: 'excel',\n showSamplingOptions: true,\n defaultSamplingMode: 'all',\n dialogTitle: `Export ${this._entity.Name}`\n };\n this.ShowExportDialog = true;\n this.cdr.detectChanges();\n } catch (e) {\n MJNotificationService.Instance.CreateSimpleNotification('Error preparing export — see console for details.', 'error', 5000);\n console.error('[ViewWorkspace] Export error:', e);\n }\n }\n\n /** @deprecated Use {@link OnExportRequested}. */\n public async onExportRequested(): Promise<void> {\n return this.OnExportRequested();\n }\n\n /** Closes the workspace export dialog (the dialog performs the export + download itself). */\n public OnExportDialogClosed(_result: ExportDialogResult): void {\n this.ShowExportDialog = false;\n this.ExportDialogConfig = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnExportDialogClosed}. */\n public onExportDialogClosed(_result: ExportDialogResult): void {\n return this.OnExportDialogClosed(_result);\n }\n\n /**\n * Columns to export: what the active renderer shows on screen (the grid), else the view's saved\n * columns, else the entity fields. The fallbacks apply the grid's own rules, so Cards, Map and\n * Timeline export the columns a grid of this view would show: saved settings are sorted by\n * `orderIndex`, headed by the user's rename, resolved to the entity's field spelling (the export\n * engine reads each row by that key), and dropped when the field no longer exists; fields the\n * user is denied read access to are left out.\n */\n private buildExportColumns(): ExportColumn[] {\n const entity = this._entity;\n if (!entity) {\n return [];\n }\n const onScreen = this.entityViewerRef?.GetExportColumns() ?? [];\n if (onScreen.length > 0) {\n return onScreen;\n }\n const user = this.ProviderToUse?.CurrentUser;\n const denied = user ? entity.GetDeniedReadFields(user) : new Set<string>();\n const readable = (f: EntityFieldInfo) => !denied.has(f.Name.trim().toLowerCase());\n\n const gridCols = this.CurrentGridState?.columnSettings;\n if (gridCols && gridCols.length > 0) {\n const columns: ExportColumn[] = [];\n const sorted = [...gridCols]\n .filter(c => c.hidden !== true)\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n for (const c of sorted) {\n const field = entity.Fields.find(f => f.Name.toLowerCase() === c.Name.toLowerCase());\n if (field && readable(field)) {\n columns.push({ name: field.Name, displayName: c.userDisplayName || c.DisplayName || field.DisplayNameOrName });\n }\n }\n if (columns.length > 0) {\n return columns;\n }\n }\n return entity.Fields\n .filter(f => !f.IsVirtual && readable(f))\n .map(f => ({ name: f.Name, displayName: f.DisplayNameOrName }));\n }\n\n private buildExportFileName(): string {\n const viewName = this.CurrentViewEntity?.Name || 'Data';\n return `${this._entity!.Name}_${viewName}_${new Date().toISOString().split('T')[0]}`;\n }\n\n // ========================================\n // LIFECYCLE\n // ========================================\n\n /** Initializes the workspace and loads the per-user default grid state for the entity. */\n ngOnInit(): void {\n this._initialized = true;\n if (this._entity && !this.CurrentViewEntity) {\n this.CurrentGridState = this.loadUserDefaultGridState();\n }\n }\n\n /** Resets all view/selection state when the bound entity changes to a different entity. */\n private resetForEntityChange(): void {\n this.CurrentViewEntity = null;\n this.SelectedViewId = null;\n this.ViewModified = false;\n this.selectedRecordId = null;\n this.CurrentGridState = this.loadUserDefaultGridState();\n this.closeAllDialogs();\n this.cdr.detectChanges();\n }\n\n /** Closes every dialog/panel — used on entity change. */\n private closeAllDialogs(): void {\n this.IsConfigPanelOpen = false;\n this.ShowQuickSaveDialog = false;\n this.ShowDuplicateDialog = false;\n this.ShowSharedViewWarning = false;\n this.IsFilterDialogOpen = false;\n // A save staged for the previous entity references that entity's fields — it must not\n // surface on the next quick-save against the new one.\n this.clearPendingNewViewState();\n }\n\n // ========================================\n // VIEW-TYPE SWITCHER (lifted into the toolbar)\n // ========================================\n\n /**\n * Drive the inner entity-viewer to switch to the chosen view type. The toolbar-level\n * {@link ViewTypeSwitcherComponent} emits the selection; we route it to the viewer's\n * {@link EntityViewerComponent.SelectViewTypeById} (its existing lifecycle: cancelable events\n * + persistence). The viewer's own header switcher is suppressed via Config, so this is the\n * single switcher in the workspace.\n */\n public OnToolbarViewTypeSelected(event: { viewTypeId: string; driverClass: string }): void {\n this.entityViewerRef?.SelectViewTypeById(event.viewTypeId);\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnToolbarViewTypeSelected}. */\n public onToolbarViewTypeSelected(event: { viewTypeId: string; driverClass: string }): void {\n return this.OnToolbarViewTypeSelected(event);\n }\n\n /**\n * The active view type's `MJ: View Types` row ID, read from the inner viewer for the toolbar\n * switcher's active highlight. Safe to read in the template — it reflects the viewer's own\n * resolved state rather than driving it.\n */\n get ActiveViewTypeId(): string | null {\n return this.entityViewerRef?.ActiveViewTypeId ?? null;\n }\n\n /** @deprecated Use {@link ActiveViewTypeId}. */\n get activeViewTypeId(): string | null {\n return this.ActiveViewTypeId;\n }\n\n /**\n * The Config forwarded to the inner viewer. Merges the host-supplied {@link ViewerConfig} but\n * always forces `showViewModeToggle: false` so the view-type switcher appears only once — in the\n * workspace toolbar, not duplicated in the viewer's own header.\n */\n get InnerViewerConfig(): Partial<EntityViewerConfig> {\n return { ...(this.ViewerConfig ?? {}), showViewModeToggle: false };\n }\n\n /** @deprecated Use {@link InnerViewerConfig}. */\n get innerViewerConfig(): Partial<EntityViewerConfig> {\n return this.InnerViewerConfig;\n }\n\n // ========================================\n // VIEW SELECTION\n // ========================================\n\n /**\n * Handle a view selection from the selector dropdown. Applies the view's grid state and filter,\n * resets the modified flag, and notifies the host. (Generalized from DataExplorer.onViewSelected.)\n */\n public OnViewSelected(event: ViewSelectedEvent): void {\n this.entityViewerRef?.EnsurePendingChangesSaved();\n\n this.CurrentViewEntity = event.View;\n this.SelectedViewId = event.ViewID;\n this.ViewModified = false;\n this.filterText = '';\n\n this.CurrentGridState = event.View\n ? this.parseViewGridState(event.View)\n : this.loadUserDefaultGridState();\n\n this.ViewSelected.emit(event.View);\n this.SelectedViewChange.emit(event.View);\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnViewSelected}. */\n public onViewSelected(event: ViewSelectedEvent): void {\n return this.OnViewSelected(event);\n }\n\n /** Handle filter text change from the viewer — re-emit so the host can sync its filter box / URL. */\n public OnFilterTextChanged(filterText: string): void {\n this.filterText = filterText;\n this.FilterTextChanged.emit(filterText);\n }\n\n /** @deprecated Use {@link OnFilterTextChanged}. */\n public onFilterTextChanged(filterText: string): void {\n return this.OnFilterTextChanged(filterText);\n }\n\n /** Track loaded records so the config panel has sample data, and re-emit the full event. */\n public OnDataLoaded(event: DataLoadedEvent): void {\n this.LoadedRecords = event.records;\n this.DataLoaded.emit(event);\n }\n\n /** @deprecated Use {@link OnDataLoaded}. */\n public onDataLoaded(event: DataLoadedEvent): void {\n return this.OnDataLoaded(event);\n }\n\n /** Re-emit the inner viewer's filtered-count change for the host. */\n public OnFilteredCountChanged(event: FilteredCountChangedEvent): void {\n this.FilteredCountChanged.emit(event);\n }\n\n /** @deprecated Use {@link OnFilteredCountChanged}. */\n public onFilteredCountChanged(event: FilteredCountChangedEvent): void {\n return this.OnFilteredCountChanged(event);\n }\n\n // ========================================\n // RECORD SELECTION / OPENING / NAVIGATION (emit for host)\n // ========================================\n\n /** Handle a record single-click — track selection and re-emit for the host. */\n public OnRecordSelected(event: RecordSelectedEvent): void {\n this.selectedRecordId = event.compositeKey.ToConcatenatedString();\n this.RecordSelected.emit(event);\n }\n\n /** @deprecated Use {@link OnRecordSelected}. */\n public onRecordSelected(event: RecordSelectedEvent): void {\n return this.OnRecordSelected(event);\n }\n\n /** Handle a record open (double-click) — emit for the host to route to the record. */\n public OnRecordOpened(event: RecordOpenedEvent): void {\n if (event.record) {\n this.OpenRecordRequested.emit({ entity: event.entity, record: event.record });\n }\n }\n\n /** @deprecated Use {@link OnRecordOpened}. */\n public onRecordOpened(event: RecordOpenedEvent): void {\n return this.OnRecordOpened(event);\n }\n\n /**\n * Handle a plug-in renderer's request (via the inner viewer) to open a related record on a\n * (possibly different) entity — re-emit for the host to route.\n */\n public OnOpenRelatedRecordRequested(nav: ViewRelatedRecordNavigation): void {\n this.OpenRelatedRecordRequested.emit(nav);\n }\n\n /** @deprecated Use {@link OnOpenRelatedRecordRequested}. */\n public onOpenRelatedRecordRequested(nav: ViewRelatedRecordNavigation): void {\n return this.OnOpenRelatedRecordRequested(nav);\n }\n\n /**\n * Handle a plug-in renderer's request (via the inner viewer) to create a new record of the\n * current entity (e.g. a grid's \"New\" button) — re-emit for the host to open the form.\n */\n public OnCreateRecordRequested(): void {\n if (this._entity) {\n this.CreateNewRecordRequested.emit(this._entity);\n }\n }\n\n /** @deprecated Use {@link OnCreateRecordRequested}. */\n public onCreateRecordRequested(): void {\n return this.OnCreateRecordRequested();\n }\n\n // ========================================\n // VIEW SELECTOR ACTIONS\n // ========================================\n\n /** Handle the selector's \"open in tab\" request — emit for the host to route. */\n public OnOpenInTabRequested(viewId: string): void {\n this.OpenViewInTabRequested.emit(viewId);\n }\n\n /** @deprecated Use {@link OnOpenInTabRequested}. */\n public onOpenInTabRequested(viewId: string): void {\n return this.OnOpenInTabRequested(viewId);\n }\n\n /** Handle the selector's \"create new record\" request — emit for the host. */\n public OnCreateNewRecordRequested(): void {\n if (this._entity) {\n this.CreateNewRecordRequested.emit(this._entity);\n }\n }\n\n /** @deprecated Use {@link OnCreateNewRecordRequested}. */\n public onCreateNewRecordRequested(): void {\n return this.OnCreateNewRecordRequested();\n }\n\n /** Handle the selector's \"configure view\" request — open the config panel. */\n public OnConfigureViewRequested(): void {\n this.DefaultSaveAsNew = false;\n this.IsConfigPanelOpen = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnConfigureViewRequested}. */\n public onConfigureViewRequested(): void {\n return this.OnConfigureViewRequested();\n }\n\n // ========================================\n // PROGRAMMATIC GRID CONTROL (passthrough to the inner entity viewer)\n // ========================================\n // Thin public passthroughs so a parent (e.g. the Data Explorer dashboard driving\n // the AI agent) can page/sort the grid and read its live pagination/sort state\n // without reaching into the protected child reference. All return null/false when\n // the viewer isn't mounted yet (e.g. at the home level before an entity is selected).\n\n /** Live pagination/sort snapshot from the inner viewer, or null when not mounted. */\n public GetGridState(): { CurrentPage: number; PageSize: number; TotalRecords: number; TotalPages: number; Sort: SortState | null } | null {\n const v = this.entityViewerRef;\n if (!v) {\n return null;\n }\n return {\n CurrentPage: v.CurrentPageNumber,\n PageSize: v.CurrentPageSize,\n TotalRecords: v.TotalRecords,\n TotalPages: v.TotalPageCount,\n Sort: v.CurrentSortState,\n };\n }\n\n /** Navigate to a 1-based page on the inner grid. Returns the page applied, or null. */\n public GoToPage(pageNumber: number): number | null {\n return this.entityViewerRef?.GoToPageNumber(pageNumber) ?? null;\n }\n\n /** Advance the inner grid to the next page. Returns the new 1-based page, or null. */\n public NextPage(): number | null {\n return this.entityViewerRef?.NextPage() ?? null;\n }\n\n /** Move the inner grid to the previous page. Returns the new 1-based page, or null. */\n public PreviousPage(): number | null {\n return this.entityViewerRef?.PreviousPage() ?? null;\n }\n\n /** Set the inner grid's server-side page size (reloads from page 1). Returns the size applied, or null. */\n public SetPageSize(pageSize: number): number | null {\n return this.entityViewerRef?.SetServerPageSize(pageSize) ?? null;\n }\n\n /** Apply a server-side sort to the inner grid. Returns true when applied, false otherwise. */\n public SetSort(field: string, direction: SortDirection): boolean {\n return this.entityViewerRef?.ApplySort(field, direction) ?? false;\n }\n\n /**\n * Programmatically select a record in the inner grid — highlights the row and emits\n * {@link RecordSelected} for the host (the no-UI equivalent of a user row-click). Returns\n * false when the viewer isn't mounted or has no entity context. The record must be one of\n * the loaded rows; the host resolves it (e.g. from {@link loadedRecords}).\n */\n public SelectRecord(record: Record<string, unknown>): boolean {\n return this.entityViewerRef?.SelectRecord(record) ?? false;\n }\n\n /**\n * Export the current view's records via the inner viewer's active renderer. Returns false\n * when the viewer isn't mounted or the active view type doesn't support export. The grid\n * renderer downloads the file itself.\n */\n public async ExportRecords(format?: 'csv' | 'excel' | 'json'): Promise<boolean> {\n return this.entityViewerRef ? this.entityViewerRef.ExportRecords(format) : false;\n }\n\n /** Handle the selector's \"save view\" request — open the config panel in the requested mode. */\n public OnSaveViewRequested(event: SaveViewRequestedEvent): void {\n this.DefaultSaveAsNew = event.SaveAsNew || false;\n this.IsConfigPanelOpen = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnSaveViewRequested}. */\n public onSaveViewRequested(event: SaveViewRequestedEvent): void {\n return this.OnSaveViewRequested(event);\n }\n\n // ========================================\n // CONFIG PANEL\n // ========================================\n\n /** Close the config panel and clear any pending new-view carry-over state. */\n public OnCloseConfigPanel(): void {\n this.IsConfigPanelOpen = false;\n this.clearPendingNewViewState();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnCloseConfigPanel}. */\n public onCloseConfigPanel(): void {\n return this.OnCloseConfigPanel();\n }\n\n /** Reset the carry-over state used when continuing a new-view flow into the config panel. */\n private clearPendingNewViewState(): void {\n this.PendingNewViewName = '';\n this.PendingNewViewDescription = '';\n this.PendingNewViewIsShared = false;\n this.PendingNewViewFilterState = null;\n this.PendingNewViewSmartFilterEnabled = false;\n this.PendingNewViewSmartFilterPrompt = '';\n this.DefaultSaveAsNew = false;\n this.pendingDefaultViewSave = null;\n this.QuickSaveSuggestedName = '';\n }\n\n // ----- Filter dialog -----\n\n /** Open the full-width filter dialog from the config panel's request. */\n public OnOpenFilterDialogRequest(event: { filterState: CompositeFilterDescriptor; filterFields: FilterFieldInfo[] }): void {\n this.FilterDialogState = event.filterState;\n this.FilterDialogFields = event.filterFields;\n this.IsFilterDialogOpen = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnOpenFilterDialogRequest}. */\n public onOpenFilterDialogRequest(event: { filterState: CompositeFilterDescriptor; filterFields: FilterFieldInfo[] }): void {\n return this.OnOpenFilterDialogRequest(event);\n }\n\n /** Close the filter dialog. */\n public OnCloseFilterDialog(): void {\n this.IsFilterDialogOpen = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnCloseFilterDialog}. */\n public onCloseFilterDialog(): void {\n return this.OnCloseFilterDialog();\n }\n\n /** Apply a filter from the dialog — the config panel picks it up via `externalFilterState`. */\n public OnFilterApplied(filter: CompositeFilterDescriptor): void {\n this.FilterDialogState = filter;\n this.IsFilterDialogOpen = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnFilterApplied}. */\n public onFilterApplied(filter: CompositeFilterDescriptor): void {\n return this.OnFilterApplied(filter);\n }\n\n // ========================================\n // SAVE VIEW\n // ========================================\n\n /**\n * Handle a save from the config panel. When {@link AutoSaveView}, persists the view itself\n * (create-new or update) via the BaseEntity; otherwise emits {@link SaveViewRequested} for the host.\n * (Faithful generalization of DataExplorer.onSaveView, minus routing/state-service/notifications.)\n * Resolves `true` once the view is saved (or handed to the host), `false` if it was not.\n */\n public async OnSaveView(event: ViewSaveEvent): Promise<boolean> {\n if (!this._entity) {\n return false;\n }\n\n if (!this.AutoSaveView) {\n this.SaveViewRequested.emit(event);\n this.IsConfigPanelOpen = false;\n this.clearPendingNewViewState();\n this.cdr.detectChanges();\n return true;\n }\n\n this.IsSavingView = true;\n this.cdr.detectChanges();\n\n const isNew = event.SaveAsNew || !this.CurrentViewEntity;\n const success = isNew\n ? await this.persistNewView(event)\n : await this.persistExistingView(event);\n\n if (success) {\n this.IsConfigPanelOpen = false;\n this.clearPendingNewViewState();\n // The view selector re-derives its lists reactively from UserViewEngine's cache\n // (BaseEntity save auto-invalidates the engine); we only need to reload the grid data.\n await this.entityViewerRef?.LoadData();\n }\n\n this.IsSavingView = false;\n this.cdr.detectChanges();\n return success;\n }\n\n /** @deprecated Use {@link OnSaveView}. */\n public async onSaveView(event: ViewSaveEvent): Promise<boolean> {\n return this.OnSaveView(event);\n }\n\n /**\n * Create and persist a brand-new view from the save event. Fires the cancelable\n * {@link BeforeViewSave} before saving and {@link AfterViewSave} after success.\n */\n private async persistNewView(event: ViewSaveEvent): Promise<boolean> {\n const provider = this.ProviderToUse;\n const newView = await provider.GetEntityObject<MJUserViewEntityExtended>('MJ: User Views', provider.CurrentUser);\n newView.Name = event.Name || 'Custom';\n newView.Description = event.Description;\n newView.EntityID = this._entity!.ID;\n newView.UserID = provider.CurrentUser.ID;\n newView.IsShared = event.IsShared;\n newView.IsDefault = false;\n\n const gridState = this.buildGridState(event);\n if (gridState) {\n newView.GridStateObject = gridState;\n }\n const sortState = this.buildSortState(event);\n if (sortState) {\n newView.SortStateObject = sortState;\n }\n newView.SmartFilterEnabled = event.SmartFilterEnabled;\n newView.SmartFilterPrompt = event.SmartFilterPrompt;\n newView.FilterState = this.buildFilterStateJson(event);\n\n const before: WorkspaceCancelableEvent<ViewSaveOperation> = { Data: { View: newView, IsNew: true }, Cancel: false };\n this.BeforeViewSave.emit(before);\n if (before.Cancel) {\n return false;\n }\n\n const saved = await newView.Save();\n if (!saved) {\n LogError(`[ViewWorkspace] Failed to create view: ${newView.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return false;\n }\n\n this.CurrentViewEntity = newView;\n this.SelectedViewId = newView.ID;\n this.ViewModified = false;\n this.CurrentGridState = this.parseViewGridState(newView);\n this.ViewSelected.emit(newView);\n this.SelectedViewChange.emit(newView);\n this.AfterViewSave.emit({ View: newView, IsNew: true });\n return true;\n }\n\n /**\n * Update and persist the currently-selected view from the save event. Fires the cancelable\n * {@link BeforeViewSave} before saving and {@link AfterViewSave} after success.\n */\n private async persistExistingView(event: ViewSaveEvent): Promise<boolean> {\n const view = this.CurrentViewEntity!;\n view.Name = event.Name;\n view.Description = event.Description;\n view.IsShared = event.IsShared;\n\n const gridState = this.buildGridState(event);\n if (gridState) {\n view.GridStateObject = gridState;\n }\n const sortState = this.buildSortState(event);\n if (sortState) {\n view.SortStateObject = sortState;\n }\n view.SmartFilterEnabled = event.SmartFilterEnabled;\n view.SmartFilterPrompt = event.SmartFilterPrompt;\n view.FilterState = this.buildFilterStateJson(event);\n\n const before: WorkspaceCancelableEvent<ViewSaveOperation> = { Data: { View: view, IsNew: false }, Cancel: false };\n this.BeforeViewSave.emit(before);\n if (before.Cancel) {\n return false;\n }\n\n const saved = await view.Save();\n if (!saved) {\n LogError(`[ViewWorkspace] Failed to update view: ${view.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return false;\n }\n\n this.ViewModified = false;\n this.CurrentGridState = this.parseViewGridState(view);\n this.AfterViewSave.emit({ View: view, IsNew: false });\n return true;\n }\n\n /**\n * Handle saving per-user default view settings from the config panel. When {@link AutoSaveView},\n * persists to `UserInfoEngine`; otherwise emits {@link SaveDefaultsRequested}.\n * (Generalized from DataExplorer.onSaveDefaultViewSettings.)\n */\n public async OnSaveDefaultViewSettings(event: ViewSaveEvent): Promise<void> {\n if (!this._entity) {\n return;\n }\n\n // A default-view Save that carries a filter is not a preferences save at all — the\n // `default-view-setting/<Entity>` payload is an IGridState with nowhere to put a filter, so\n // persisting here would silently drop it (#4220). It is really a view creation missing a\n // name, so stage it and open the quick-save dialog to collect one. Confirming there routes\n // through `OnSaveView`, which honours `AutoSaveView` for both host modes.\n if (this.eventHasFilter(event)) {\n this.pendingDefaultViewSave = event;\n this.QuickSaveSuggestedName = this.buildSuggestedViewName(event);\n this.QuickSaveSummary = this.buildConfigSummary(event);\n this.DefaultSaveAsNew = true;\n this.IsConfigPanelOpen = false;\n this.ShowQuickSaveDialog = true;\n this.cdr.detectChanges();\n return;\n }\n\n if (!this.AutoSaveView) {\n this.SaveDefaultsRequested.emit(event);\n this.IsConfigPanelOpen = false;\n this.cdr.detectChanges();\n return;\n }\n\n this.IsSavingView = true;\n this.cdr.detectChanges();\n\n const gridState = this.buildGridState(event);\n if (gridState) {\n gridState.sortSettings = this.buildGridSortSettings(event) ?? gridState.sortSettings;\n const settingKey = `default-view-setting/${this._entity.Name}`;\n const saved = await UserInfoEngine.Instance.SetSetting(settingKey, JSON.stringify(gridState));\n if (saved) {\n this.CurrentGridState = {\n columnSettings: gridState.columnSettings as ViewGridState['columnSettings'],\n sortSettings: gridState.sortSettings as ViewGridState['sortSettings'],\n aggregates: gridState.aggregates\n };\n this.cdr.detectChanges();\n this.entityViewerRef?.Refresh();\n } else {\n LogError('[ViewWorkspace] Failed to save default view settings');\n }\n }\n\n this.IsConfigPanelOpen = false;\n this.IsSavingView = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnSaveDefaultViewSettings}. */\n public async onSaveDefaultViewSettings(event: ViewSaveEvent): Promise<void> {\n return this.OnSaveDefaultViewSettings(event);\n }\n\n // ========================================\n // DELETE VIEW\n // ========================================\n\n /**\n * Handle a delete from the config panel. When {@link AutoSaveView}, persists the delete itself\n * (firing cancelable {@link BeforeViewDelete} / notification {@link AfterViewDelete}); otherwise\n * emits {@link DeleteViewRequested}. (Generalized from DataExplorer.onDeleteView.)\n */\n public async OnDeleteView(): Promise<void> {\n if (!this.CurrentViewEntity) {\n return;\n }\n\n if (!this.AutoSaveView) {\n this.DeleteViewRequested.emit(this.CurrentViewEntity);\n this.IsConfigPanelOpen = false;\n this.cdr.detectChanges();\n return;\n }\n\n const view = this.CurrentViewEntity;\n const viewId = view.ID;\n const viewName = view.Name;\n\n const before: WorkspaceCancelableEvent<MJUserViewEntityExtended> = { Data: view, Cancel: false };\n this.BeforeViewDelete.emit(before);\n if (before.Cancel) {\n return;\n }\n\n const deleted = await view.Delete();\n if (!deleted) {\n LogError(`[ViewWorkspace] Failed to delete view: ${view.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return;\n }\n\n this.CurrentViewEntity = null;\n this.SelectedViewId = null;\n this.ViewModified = false;\n this.IsConfigPanelOpen = false;\n this.CurrentGridState = this.loadUserDefaultGridState();\n // The view selector re-derives its lists reactively from UserViewEngine's cache\n // (BaseEntity delete auto-invalidates the engine), so no explicit reload is needed here.\n this.ViewSelected.emit(null);\n this.SelectedViewChange.emit(null);\n this.AfterViewDelete.emit({ ViewID: viewId, ViewName: viewName });\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnDeleteView}. */\n public async onDeleteView(): Promise<void> {\n return this.OnDeleteView();\n }\n\n // ========================================\n // QUICK SAVE\n // ========================================\n\n /**\n * Handle a quick-save request from the selector (F-001). Builds a summary from the config panel\n * and opens the quick-save dialog. (Generalized from DataExplorer.onQuickSaveRequested.)\n */\n public OnQuickSaveRequested(saveAsNew: boolean): void {\n this.DefaultSaveAsNew = saveAsNew;\n this.QuickSaveSummary = this.viewConfigPanelRef?.BuildSummary() ?? null;\n this.ShowQuickSaveDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnQuickSaveRequested}. */\n public onQuickSaveRequested(saveAsNew: boolean): void {\n return this.OnQuickSaveRequested(saveAsNew);\n }\n\n /**\n * Handle the quick-save dialog's save. Intercepts updates to a shared view with the shared-view\n * warning; otherwise executes the save. (Generalized from DataExplorer.onQuickSave.)\n */\n public async OnQuickSave(event: QuickSaveEvent): Promise<void> {\n this.ShowQuickSaveDialog = false;\n\n if (!event.SaveAsNew && this.CurrentViewEntity?.IsShared) {\n this.pendingQuickSaveEvent = event;\n this.ShowSharedViewWarning = true;\n this.cdr.detectChanges();\n return;\n }\n\n await this.executeQuickSave(event);\n }\n\n /** @deprecated Use {@link OnQuickSave}. */\n public async onQuickSave(event: QuickSaveEvent): Promise<void> {\n return this.OnQuickSave(event);\n }\n\n /**\n * Build a `ViewSaveEvent` from a `QuickSaveEvent` and delegate to {@link OnSaveView}.\n *\n * When a config-panel save is staged — a default-view Save carrying a filter, waiting only on a\n * name (see {@link OnSaveDefaultViewSettings}) — its columns, sort, filter and aggregates are\n * merged in and the dialog supplies just the name/description/sharing. The smart-filter fields\n * used to be hard-coded to `false`/`''` here, which dropped a smart filter on this path too\n * (#4220).\n *\n * The staged save is left in place until the save succeeds ({@link OnSaveView} clears it). If\n * the save fails or a host cancels it, the name prompt reopens so the user can retry or cancel\n * rather than losing the filter with nothing on screen.\n */\n private async executeQuickSave(event: QuickSaveEvent): Promise<void> {\n const staged = this.pendingDefaultViewSave;\n\n const viewSaveEvent: ViewSaveEvent = {\n Name: event.Name,\n Description: event.Description,\n IsShared: event.IsShared,\n SaveAsNew: event.SaveAsNew,\n Columns: staged?.Columns ?? [],\n SortField: staged?.SortField ?? null,\n SortDirection: staged?.SortDirection ?? 'asc',\n SortItems: staged?.SortItems ?? [],\n SmartFilterEnabled: staged?.SmartFilterEnabled ?? false,\n SmartFilterPrompt: staged?.SmartFilterPrompt ?? '',\n FilterState: staged?.FilterState ?? this.FilterDialogState ?? null,\n AggregatesConfig: staged?.AggregatesConfig ?? null\n };\n const saved = await this.OnSaveView(viewSaveEvent);\n if (!saved && staged) {\n this.QuickSaveSuggestedName = event.Name;\n this.ShowQuickSaveDialog = true;\n this.cdr.detectChanges();\n }\n }\n\n /** Handle the shared-view warning action (update / save-as-copy / cancel). */\n public async OnSharedViewAction(action: SharedViewAction): Promise<void> {\n this.ShowSharedViewWarning = false;\n const event = this.pendingQuickSaveEvent;\n this.pendingQuickSaveEvent = null;\n if (!event) {\n return;\n }\n\n if (action === 'update-shared') {\n await this.executeQuickSave(event);\n } else if (action === 'save-as-copy') {\n await this.executeQuickSave({ ...event, SaveAsNew: true, IsShared: false });\n }\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnSharedViewAction}. */\n public async onSharedViewAction(action: SharedViewAction): Promise<void> {\n return this.OnSharedViewAction(action);\n }\n\n /** Handle the shared-view warning cancel. */\n public OnSharedViewWarningCancel(): void {\n this.ShowSharedViewWarning = false;\n this.pendingQuickSaveEvent = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnSharedViewWarningCancel}. */\n public onSharedViewWarningCancel(): void {\n return this.OnSharedViewWarningCancel();\n }\n\n /** Handle the quick-save dialog close. */\n public OnQuickSaveClose(): void {\n this.ShowQuickSaveDialog = false;\n // Abandoning the name prompt abandons the promoted save with it — otherwise the staged\n // filter would surface on whatever the user saved next.\n this.clearPendingNewViewState();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnQuickSaveClose}. */\n public onQuickSaveClose(): void {\n return this.OnQuickSaveClose();\n }\n\n /** Handle \"open advanced\" from the quick-save dialog — carry data into the config panel. */\n public OnQuickSaveOpenAdvanced(event: QuickSaveAdvancedEvent): void {\n this.PendingNewViewName = event.Name;\n this.PendingNewViewDescription = event.Description;\n this.PendingNewViewIsShared = event.IsShared;\n\n // Hand any staged filter back to the panel, which resets its own filter state on open.\n // Without this the escape hatch out of the name prompt would silently drop the filter.\n const staged = this.pendingDefaultViewSave;\n if (staged) {\n this.PendingNewViewFilterState = staged.FilterState;\n this.PendingNewViewSmartFilterEnabled = staged.SmartFilterEnabled;\n this.PendingNewViewSmartFilterPrompt = staged.SmartFilterPrompt;\n }\n\n this.DefaultSaveAsNew = true;\n this.ShowQuickSaveDialog = false;\n this.IsConfigPanelOpen = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnQuickSaveOpenAdvanced}. */\n public onQuickSaveOpenAdvanced(event: QuickSaveAdvancedEvent): void {\n return this.OnQuickSaveOpenAdvanced(event);\n }\n\n // ========================================\n // DUPLICATE VIEW\n // ========================================\n\n /**\n * Handle a duplicate request (F-005). Opens the duplicate dialog so the user names the copy.\n * (Generalized from DataExplorer.onDuplicateView.)\n */\n public OnDuplicateViewRequested(viewId?: string): void {\n const targetId = viewId || this.CurrentViewEntity?.ID;\n if (!targetId || !this._entity) {\n return;\n }\n\n const allViews = [...(this.viewSelectorRef?.MyViews ?? []), ...(this.viewSelectorRef?.SharedViews ?? [])];\n const viewItem = allViews.find(v => v.id === targetId);\n this.duplicateTargetViewId = targetId;\n this.DuplicateSourceViewName = viewItem?.name || this.CurrentViewEntity?.Name || 'View';\n this.DuplicateSummary = this.buildDuplicateSummary(viewItem?.entity ?? this.CurrentViewEntity);\n this.ShowDuplicateDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnDuplicateViewRequested}. */\n public onDuplicateViewRequested(viewId?: string): void {\n return this.OnDuplicateViewRequested(viewId);\n }\n\n /** Build a {@link ViewConfigSummary} from a view entity for the duplicate dialog. */\n private buildDuplicateSummary(view: MJUserViewEntityExtended | null): ViewConfigSummary | null {\n if (!view) {\n return null;\n }\n let columnCount = 0;\n let filterCount = 0;\n let sortCount = 0;\n\n try {\n const gridState = view.GridStateObject;\n if (gridState?.columnSettings && Array.isArray(gridState.columnSettings)) {\n columnCount = gridState.columnSettings.filter((c: MJUserViewEntity_IGridColumnSetting) => !c.hidden).length;\n }\n } catch {\n /* ignore parse errors */\n }\n try {\n const filterState = view.FilterStateObject;\n if (filterState?.filters?.length) {\n filterCount = filterState.filters.length;\n }\n } catch {\n /* ignore parse errors */\n }\n try {\n const sortState = view.SortStateObject;\n if (Array.isArray(sortState)) {\n sortCount = sortState.length;\n }\n } catch {\n /* ignore parse errors */\n }\n\n return {\n ColumnCount: columnCount,\n FilterCount: filterCount,\n SortCount: sortCount,\n SmartFilterActive: view.SmartFilterEnabled || false,\n SmartFilterPrompt: view.SmartFilterPrompt || '',\n AggregateCount: 0\n };\n }\n\n /**\n * Handle the duplicate dialog confirmation. When {@link AutoSaveView}, loads the source view,\n * copies its config into a new personal view, and persists it; otherwise emits\n * {@link DuplicateViewRequested}. (Generalized from DataExplorer.onDuplicateConfirmed.)\n */\n public async OnDuplicateConfirmed(event: DuplicateViewEvent): Promise<void> {\n this.ShowDuplicateDialog = false;\n const targetId = this.duplicateTargetViewId;\n this.duplicateTargetViewId = null;\n if (!targetId || !this._entity) {\n return;\n }\n\n if (!this.AutoSaveView) {\n this.DuplicateViewRequested.emit({ sourceViewId: targetId, newName: event.Name });\n return;\n }\n\n await this.persistDuplicate(targetId, event.Name);\n }\n\n /** @deprecated Use {@link OnDuplicateConfirmed}. */\n public async onDuplicateConfirmed(event: DuplicateViewEvent): Promise<void> {\n return this.OnDuplicateConfirmed(event);\n }\n\n /** Load the source view, copy its config into a new personal view, and persist it. */\n private async persistDuplicate(sourceViewId: string, newName: string): Promise<void> {\n const provider = this.ProviderToUse;\n const sourceView = await provider.GetEntityObject<MJUserViewEntityExtended>('MJ: User Views', provider.CurrentUser);\n const loaded = await sourceView.Load(sourceViewId);\n if (!loaded) {\n LogError(`[ViewWorkspace] Could not load view to duplicate: ${sourceView.LatestResult?.CompleteMessage ?? 'not found'}`);\n return;\n }\n\n const newView = await provider.GetEntityObject<MJUserViewEntityExtended>('MJ: User Views', provider.CurrentUser);\n newView.Name = newName;\n newView.Description = sourceView.Description || '';\n newView.EntityID = sourceView.EntityID;\n newView.UserID = provider.CurrentUser.ID;\n newView.IsShared = false;\n newView.IsDefault = false;\n newView.GridState = sourceView.GridState;\n newView.FilterState = sourceView.FilterState;\n newView.SortState = sourceView.SortState;\n newView.SmartFilterEnabled = sourceView.SmartFilterEnabled || false;\n newView.SmartFilterPrompt = sourceView.SmartFilterPrompt || '';\n\n const saved = await newView.Save();\n if (!saved) {\n LogError(`[ViewWorkspace] Failed to duplicate view: ${newView.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return;\n }\n\n // The view selector re-derives its lists reactively from UserViewEngine's cache\n // (BaseEntity save auto-invalidates the engine), so no explicit reload is needed here.\n this.AfterViewSave.emit({ View: newView, IsNew: true });\n }\n\n /** Handle the duplicate dialog cancel. */\n public OnDuplicateCancel(): void {\n this.ShowDuplicateDialog = false;\n this.duplicateTargetViewId = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnDuplicateCancel}. */\n public onDuplicateCancel(): void {\n return this.OnDuplicateCancel();\n }\n\n /** Handle duplicate triggered from the config panel — duplicate the selected view. */\n public OnDuplicateFromPanel(): void {\n if (this.CurrentViewEntity?.ID) {\n this.IsConfigPanelOpen = false;\n this.OnDuplicateViewRequested(this.CurrentViewEntity.ID);\n }\n }\n\n /** @deprecated Use {@link OnDuplicateFromPanel}. */\n public onDuplicateFromPanel(): void {\n return this.OnDuplicateFromPanel();\n }\n\n // ========================================\n // REVERT\n // ========================================\n\n /**\n * Handle a revert request (F-007). Re-parses the saved view's grid state, clears the modified\n * flag, and reloads. (Generalized from DataExplorer.onRevertView.)\n */\n public async OnRevertView(): Promise<void> {\n if (!this.CurrentViewEntity) {\n return;\n }\n const gridState = this.parseViewGridState(this.CurrentViewEntity);\n if (gridState) {\n this.CurrentGridState = gridState;\n }\n this.ViewModified = false;\n await this.entityViewerRef?.LoadData();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnRevertView}. */\n public async onRevertView(): Promise<void> {\n return this.OnRevertView();\n }\n\n // ========================================\n // GRID/SORT/FILTER STATE BUILDERS\n // (Generalized from DataExplorer — no state-service / selectedEntity coupling.)\n // ========================================\n\n /**\n * Build a `GridState` (Kendo-compatible) from the save event. Priority: explicit columns from the\n * config panel → live grid state → entity `DefaultInView` fields. Returns null when no columns.\n */\n private buildGridState(event: ViewSaveEvent): MJUserViewEntity_IGridState | null {\n let columnSettings: MJUserViewEntity_IGridColumnSetting[];\n\n if (event.Columns.length > 0) {\n columnSettings = event.Columns.map((col, idx) => ({\n ID: col.fieldId,\n Name: col.fieldName,\n DisplayName: col.displayName,\n userDisplayName: col.userDisplayName,\n hidden: false,\n width: col.width || undefined,\n orderIndex: idx,\n format: col.format\n }));\n } else if (this.CurrentGridState?.columnSettings && this.CurrentGridState.columnSettings.length > 0) {\n columnSettings = this.CurrentGridState.columnSettings;\n } else if (this._entity) {\n columnSettings = this._entity.Fields\n .filter(f => f.DefaultInView)\n .map((f, idx) => ({\n ID: f.ID,\n Name: f.Name,\n DisplayName: f.DisplayNameOrName,\n hidden: false,\n width: f.DefaultColumnWidth || undefined,\n orderIndex: idx\n }));\n if (columnSettings.length === 0) {\n return null;\n }\n } else {\n return null;\n }\n\n const sortSettings = this.buildGridSortSettings(event);\n let aggregates = event.AggregatesConfig ?? undefined;\n if (!aggregates && this.CurrentGridState?.aggregates) {\n aggregates = this.CurrentGridState.aggregates;\n }\n\n return { columnSettings, sortSettings, aggregates };\n }\n\n /** Build grid sort settings (`{field, dir}[]`) from the save event, falling back to live state. */\n private buildGridSortSettings(event: ViewSaveEvent): MJUserViewEntity_IGridSortSetting[] | undefined {\n if (event.SortItems && event.SortItems.length > 0) {\n return event.SortItems.map(item => ({ field: item.field, dir: item.direction }));\n }\n if (event.SortField) {\n return [{ field: event.SortField, dir: event.SortDirection }];\n }\n if (this.CurrentGridState?.sortSettings && this.CurrentGridState.sortSettings.length > 0) {\n return this.CurrentGridState.sortSettings;\n }\n return undefined;\n }\n\n /** Build a `SortState` (`{field, direction}[]`) from the save event. Returns null when no sort. */\n private buildSortState(event: ViewSaveEvent): MJUserViewEntity_ISortStateItem[] | null {\n if (event.SortItems && event.SortItems.length > 0) {\n return event.SortItems.map(item => ({ field: item.field, direction: item.direction }));\n }\n if (event.SortField) {\n return [{ field: event.SortField, direction: event.SortDirection }];\n }\n return null;\n }\n\n /** Serialize the filter state to JSON, defaulting to an empty Kendo filter. */\n private buildFilterStateJson(event: ViewSaveEvent): string {\n return event.FilterState\n ? JSON.stringify(event.FilterState)\n : JSON.stringify({ logic: 'and', filters: [] });\n }\n\n /**\n * Whether a save event carries a filter the user would expect to be kept — a smart prompt with\n * actual text, or at least one traditional filter. Deliberately stricter than the config panel's\n * own `hasActiveFilters()`, which only looks at the traditional list.\n */\n private eventHasFilter(event: ViewSaveEvent): boolean {\n const hasSmartFilter = event.SmartFilterEnabled && !!event.SmartFilterPrompt?.trim();\n const hasTraditionalFilter = (event.FilterState?.filters?.length ?? 0) > 0;\n return hasSmartFilter || hasTraditionalFilter;\n }\n\n /** Longest suggested name we will build before eliding the smart prompt. */\n private static readonly SUGGESTED_NAME_MAX_LENGTH = 60;\n\n /**\n * Propose a name for a view being promoted out of the default view, so the user can accept it\n * with a single click. A smart prompt describes the view better than anything we could invent,\n * so it becomes the name (elided if long); a traditional filter gets a plain marker.\n */\n private buildSuggestedViewName(event: ViewSaveEvent): string {\n const entityName = this._entity?.DisplayNameOrName ?? this._entity?.Name ?? 'View';\n const prompt = event.SmartFilterEnabled ? event.SmartFilterPrompt?.trim() : '';\n if (!prompt) {\n return `${entityName} — Filtered`;\n }\n\n const budget = ViewWorkspaceComponent.SUGGESTED_NAME_MAX_LENGTH - entityName.length - ' — '.length;\n const suffix = prompt.length > budget ? `${prompt.slice(0, Math.max(budget - 1, 1)).trimEnd()}…` : prompt;\n return `${entityName} — ${suffix}`;\n }\n\n /** Build a {@link ViewConfigSummary} from a pending save event, for the quick-save dialog. */\n private buildConfigSummary(event: ViewSaveEvent): ViewConfigSummary {\n return {\n ColumnCount: event.Columns.length,\n FilterCount: event.FilterState?.filters?.length ?? 0,\n SortCount: event.SortItems.length,\n SmartFilterActive: event.SmartFilterEnabled && !!event.SmartFilterPrompt?.trim(),\n SmartFilterPrompt: event.SmartFilterPrompt,\n AggregateCount: event.AggregatesConfig?.expressions?.filter(a => a.enabled !== false).length ?? 0\n };\n }\n\n // ========================================\n // GRID STATE PARSE / DEFAULTS\n // ========================================\n\n /**\n * Parse a view's `GridState` into a {@link ViewGridState}, validating columns/sorts against the\n * current entity to avoid stale fields from a previous entity. Returns null when no valid columns.\n */\n private parseViewGridState(view: MJUserViewEntityExtended): ViewGridState | null {\n if (!view.GridState) {\n return null;\n }\n try {\n const parsed = view.GridStateObject;\n if (parsed && Array.isArray(parsed.columnSettings)) {\n const validColumns = this._entity\n ? parsed.columnSettings.filter(\n (col: MJUserViewEntity_IGridColumnSetting) => this._entity!.Fields.some(f => f.Name === col.Name)\n )\n : parsed.columnSettings;\n const validSorts = this._entity\n ? (parsed.sortSettings || []).filter(\n (s: MJUserViewEntity_IGridSortSetting) => this._entity!.Fields.some(f => f.Name === s.field)\n )\n : parsed.sortSettings || [];\n\n if (validColumns.length > 0) {\n return {\n columnSettings: validColumns,\n sortSettings: validSorts,\n aggregates: parsed.aggregates || undefined\n };\n }\n }\n return null;\n } catch (error) {\n LogError(`[ViewWorkspace] Failed to parse GridState: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n /**\n * Load the per-user default grid state for the current entity from `UserInfoEngine`, validating\n * columns/sorts against the entity. Returns null when none saved.\n */\n private loadUserDefaultGridState(): ViewGridState | null {\n if (!this._entity) {\n return null;\n }\n try {\n const settingKey = `default-view-setting/${this._entity.Name}`;\n const savedState = UserInfoEngine.Instance.GetSetting(settingKey);\n if (savedState) {\n const gridState = JSON.parse(savedState);\n if (gridState && Array.isArray(gridState.columnSettings)) {\n const validColumns = gridState.columnSettings.filter(\n (col: { Name: string }) => this._entity!.Fields.some(f => f.Name === col.Name)\n );\n const validSorts = (gridState.sortSettings || []).filter(\n (s: { field: string }) => this._entity!.Fields.some(f => f.Name === s.field)\n );\n if (validColumns.length > 0) {\n return { columnSettings: validColumns, sortSettings: validSorts };\n }\n }\n }\n } catch (error) {\n LogError(`[ViewWorkspace] Failed to load user default grid state: ${error instanceof Error ? error.message : String(error)}`);\n }\n return null;\n }\n}\n","<div class=\"view-workspace\">\n <!-- Toolbar: view selector + view-type switcher (single row) -->\n <div class=\"workspace-toolbar\">\n <mj-view-selector\n [Provider]=\"Provider\"\n [Entity]=\"Entity\"\n [SelectedViewID]=\"selectedViewId\"\n [ViewModified]=\"viewModified\"\n (ViewSelected)=\"onViewSelected($event)\"\n (SaveViewRequested)=\"onSaveViewRequested($event)\"\n (OpenInTabRequested)=\"onOpenInTabRequested($event)\"\n (ConfigureViewRequested)=\"onConfigureViewRequested()\"\n (CreateNewRecordRequested)=\"onCreateNewRecordRequested()\"\n (ExportRequested)=\"onExportRequested()\"\n (DuplicateViewRequested)=\"onDuplicateViewRequested($event)\"\n (QuickSaveRequested)=\"onQuickSaveRequested($event)\"\n (RevertRequested)=\"onRevertView()\">\n </mj-view-selector>\n\n <span class=\"workspace-toolbar-spacer\"></span>\n\n <!-- View-type switcher lifted into the top toolbar (same row as the selector). The inner\n entity-viewer's own header switcher is suppressed via innerViewerConfig so it appears\n exactly once. Switching routes to the viewer via SelectViewTypeById. -->\n <mj-view-type-switcher\n [Provider]=\"Provider\"\n [Entity]=\"Entity\"\n [ActiveViewTypeID]=\"activeViewTypeId\"\n (ViewTypeSelected)=\"onToolbarViewTypeSelected($event)\">\n </mj-view-type-switcher>\n </div>\n\n <!-- Data renderer -->\n <div class=\"workspace-body\">\n @if (Entity) {\n <mj-entity-viewer\n [Provider]=\"Provider\"\n [Entity]=\"Entity\"\n [ViewEntity]=\"currentViewEntity\"\n [FilterText]=\"filterText\"\n [SelectedRecordID]=\"selectedRecordId\"\n [GridState]=\"currentGridState\"\n [AutoSaveView]=\"AutoSaveView\"\n [Config]=\"innerViewerConfig\"\n (FilterTextChange)=\"onFilterTextChanged($event)\"\n (RecordSelected)=\"onRecordSelected($event)\"\n (RecordOpened)=\"onRecordOpened($event)\"\n (DataLoaded)=\"onDataLoaded($event)\"\n (FilteredCountChanged)=\"onFilteredCountChanged($event)\"\n (OpenRelatedRecordRequested)=\"onOpenRelatedRecordRequested($event)\"\n (CreateRecordRequested)=\"onCreateRecordRequested()\"\n (ConfigureRequested)=\"onConfigureViewRequested()\">\n </mj-entity-viewer>\n }\n </div>\n\n <!-- View configuration panel (slide-in) -->\n <mj-view-config-panel\n [Provider]=\"Provider\"\n [Entity]=\"Entity\"\n [ViewEntity]=\"currentViewEntity\"\n [IsOpen]=\"isConfigPanelOpen\"\n [CurrentGridState]=\"currentGridState\"\n [SampleData]=\"loadedRecords\"\n [ExternalFilterState]=\"filterDialogState\"\n [IsSaving]=\"isSavingView\"\n [DefaultSaveAsNew]=\"defaultSaveAsNew\"\n [PendingNewViewName]=\"pendingNewViewName\"\n [PendingNewViewDescription]=\"pendingNewViewDescription\"\n [PendingNewViewIsShared]=\"pendingNewViewIsShared\"\n [PendingNewViewFilterState]=\"PendingNewViewFilterState\"\n [PendingNewViewSmartFilterEnabled]=\"PendingNewViewSmartFilterEnabled\"\n [PendingNewViewSmartFilterPrompt]=\"PendingNewViewSmartFilterPrompt\"\n (Close)=\"onCloseConfigPanel()\"\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 <!-- Full-width filter dialog -->\n @if (isFilterDialogOpen) {\n <div class=\"filter-dialog-backdrop\" (click)=\"onCloseFilterDialog()\"></div>\n <div class=\"filter-dialog\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"filter-dialog-header\">\n <div class=\"filter-dialog-title\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Edit Filters</span>\n </div>\n <button class=\"filter-dialog-close\" type=\"button\" (click)=\"onCloseFilterDialog()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"filter-dialog-content\">\n <mj-filter-builder\n [fields]=\"filterDialogFields\"\n [filter]=\"filterDialogState\"\n [showSummary]=\"true\"\n (apply)=\"onFilterApplied($event)\"\n (filterChange)=\"filterDialogState = $event\">\n </mj-filter-builder>\n </div>\n <div class=\"filter-dialog-footer\">\n <button mjButton variant=\"primary\" size=\"sm\" type=\"button\"\n (click)=\"filterDialogState && onFilterApplied(filterDialogState)\">\n <i class=\"fa-solid fa-check\"></i> Apply Filters\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" type=\"button\" (click)=\"onCloseFilterDialog()\">\n Cancel\n </button>\n </div>\n </div>\n }\n\n <!-- Quick save dialog -->\n <mj-quick-save-dialog\n [IsOpen]=\"showQuickSaveDialog\"\n [ViewEntity]=\"currentViewEntity\"\n [EntityName]=\"Entity?.DisplayNameOrName ?? ''\"\n [Summary]=\"quickSaveSummary\"\n [IsSaving]=\"isSavingView\"\n [DefaultSaveAsNew]=\"defaultSaveAsNew\"\n [SuggestedName]=\"QuickSaveSuggestedName\"\n (Save)=\"onQuickSave($event)\"\n (Close)=\"onQuickSaveClose()\"\n (OpenAdvanced)=\"onQuickSaveOpenAdvanced($event)\">\n </mj-quick-save-dialog>\n\n <!-- Duplicate view dialog -->\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 -->\n <mj-shared-view-warning-dialog\n [IsOpen]=\"showSharedViewWarning\"\n [ViewName]=\"currentViewEntity?.Name ?? ''\"\n (Action)=\"onSharedViewAction($event)\"\n (Cancel)=\"onSharedViewWarningCancel()\">\n </mj-shared-view-warning-dialog>\n\n <!-- Export dialog — opened by the toolbar Export button for ANY view type. The dialog is generic\n (data + columns only), so Excel/CSV/JSON + sampling work identically on Grid/Cards/Map/Timeline. -->\n <mj-export-dialog\n [visible]=\"showExportDialog\"\n [config]=\"exportDialogConfig\"\n (closed)=\"onExportDialogClosed($event)\">\n </mj-export-dialog>\n</div>\n"]}
|
package/dist/module.d.ts
CHANGED
|
@@ -31,9 +31,10 @@ import * as i29 from "@memberjunction/ng-export-service";
|
|
|
31
31
|
import * as i30 from "@memberjunction/ng-list-management";
|
|
32
32
|
import * as i31 from "@memberjunction/ng-map-view";
|
|
33
33
|
import * as i32 from "@memberjunction/ng-record-changes";
|
|
34
|
-
import * as i33 from "@memberjunction/ng-
|
|
35
|
-
import * as i34 from "@memberjunction/ng-
|
|
36
|
-
import * as i35 from "@memberjunction/ng-
|
|
34
|
+
import * as i33 from "@memberjunction/ng-record-merge";
|
|
35
|
+
import * as i34 from "@memberjunction/ng-ui-components";
|
|
36
|
+
import * as i35 from "@memberjunction/ng-filter-builder";
|
|
37
|
+
import * as i36 from "@memberjunction/ng-entity-action-ux";
|
|
37
38
|
/**
|
|
38
39
|
* EntityViewerModule - Provides components for viewing entity data
|
|
39
40
|
*
|
|
@@ -57,7 +58,7 @@ import * as i35 from "@memberjunction/ng-entity-action-ux";
|
|
|
57
58
|
*/
|
|
58
59
|
export declare class EntityViewerModule {
|
|
59
60
|
static ɵfac: i0.ɵɵFactoryDeclaration<EntityViewerModule, never>;
|
|
60
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<EntityViewerModule, [typeof i1.EntityCardsComponent, typeof i2.EntityViewerComponent, typeof i3.EntityRecordDetailPanelComponent, typeof i4.PillComponent, typeof i5.EntityDataGridComponent, typeof i6.ViewConfigPanelComponent, typeof i7.AggregatePanelComponent, typeof i8.AggregateSetupDialogComponent, typeof i9.ConfirmDialogComponent, typeof i10.QuickSaveDialogComponent, typeof i11.ViewHeaderComponent, typeof i12.DuplicateViewDialogComponent, typeof i13.SharedViewWarningDialogComponent, typeof i14.RecycleBinComponent, typeof i15.RecycleBinChipComponent, typeof i16.ViewSelectorComponent, typeof i17.ViewWorkspaceComponent, typeof i18.ViewTypeSwitcherComponent, typeof i19.CardsViewRendererComponent, typeof i20.GridViewRendererComponent, typeof i21.TimelineViewRendererComponent, typeof i22.MapViewRendererComponent], [typeof i23.CommonModule, typeof i24.FormsModule, typeof i25.AgGridModule, typeof i26.SharedGenericModule, typeof i27.PaginationComponent, typeof i28.TimelineModule, typeof i29.ExportServiceModule, typeof i30.ListManagementModule, typeof i31.MapViewModule, typeof i32.RecordChangesModule, typeof i33.MjSlidePanelComponent, typeof
|
|
61
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<EntityViewerModule, [typeof i1.EntityCardsComponent, typeof i2.EntityViewerComponent, typeof i3.EntityRecordDetailPanelComponent, typeof i4.PillComponent, typeof i5.EntityDataGridComponent, typeof i6.ViewConfigPanelComponent, typeof i7.AggregatePanelComponent, typeof i8.AggregateSetupDialogComponent, typeof i9.ConfirmDialogComponent, typeof i10.QuickSaveDialogComponent, typeof i11.ViewHeaderComponent, typeof i12.DuplicateViewDialogComponent, typeof i13.SharedViewWarningDialogComponent, typeof i14.RecycleBinComponent, typeof i15.RecycleBinChipComponent, typeof i16.ViewSelectorComponent, typeof i17.ViewWorkspaceComponent, typeof i18.ViewTypeSwitcherComponent, typeof i19.CardsViewRendererComponent, typeof i20.GridViewRendererComponent, typeof i21.TimelineViewRendererComponent, typeof i22.MapViewRendererComponent], [typeof i23.CommonModule, typeof i24.FormsModule, typeof i25.AgGridModule, typeof i26.SharedGenericModule, typeof i27.PaginationComponent, typeof i28.TimelineModule, typeof i29.ExportServiceModule, typeof i30.ListManagementModule, typeof i31.MapViewModule, typeof i32.RecordChangesModule, typeof i33.RecordMergeModule, typeof i34.MjSlidePanelComponent, typeof i34.MJDialogComponent, typeof i34.MJButtonDirective, typeof i34.MJAccordionModule, typeof i34.MJEmptyStateComponent, typeof i34.MJAlertComponent, typeof i35.FilterBuilderModule, typeof i36.EntityActionUXHostComponent], [typeof i1.EntityCardsComponent, typeof i2.EntityViewerComponent, typeof i3.EntityRecordDetailPanelComponent, typeof i4.PillComponent, typeof i5.EntityDataGridComponent, typeof i6.ViewConfigPanelComponent, typeof i7.AggregatePanelComponent, typeof i8.AggregateSetupDialogComponent, typeof i9.ConfirmDialogComponent, typeof i10.QuickSaveDialogComponent, typeof i11.ViewHeaderComponent, typeof i12.DuplicateViewDialogComponent, typeof i13.SharedViewWarningDialogComponent, typeof i14.RecycleBinComponent, typeof i16.ViewSelectorComponent, typeof i17.ViewWorkspaceComponent, typeof i18.ViewTypeSwitcherComponent]>;
|
|
61
62
|
static ɵinj: i0.ɵɵInjectorDeclaration<EntityViewerModule>;
|
|
62
63
|
}
|
|
63
64
|
//# sourceMappingURL=module.d.ts.map
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAkEa,kBAAkB;yCAAlB,kBAAkB;0CAAlB,kBAAkB;0CAAlB,kBAAkB;CAAI"}
|