@memberjunction/ng-entity-viewer 5.43.0 → 5.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/lib/aggregate-panel/aggregate-panel.component.d.ts +5 -0
  2. package/dist/lib/aggregate-panel/aggregate-panel.component.d.ts.map +1 -1
  3. package/dist/lib/aggregate-panel/aggregate-panel.component.js +45 -47
  4. package/dist/lib/aggregate-panel/aggregate-panel.component.js.map +1 -1
  5. package/dist/lib/entity-cards/entity-cards.component.js +7 -10
  6. package/dist/lib/entity-cards/entity-cards.component.js.map +1 -1
  7. package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +10 -1
  8. package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts.map +1 -1
  9. package/dist/lib/entity-data-grid/entity-data-grid.component.js +35 -34
  10. package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
  11. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts +0 -4
  12. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts.map +1 -1
  13. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +166 -207
  14. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -1
  15. package/dist/lib/entity-viewer/entity-viewer.component.d.ts +109 -5
  16. package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
  17. package/dist/lib/entity-viewer/entity-viewer.component.js +287 -42
  18. package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
  19. package/dist/lib/recycle-bin/recycle-bin.component.js +21 -44
  20. package/dist/lib/recycle-bin/recycle-bin.component.js.map +1 -1
  21. package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js +19 -20
  22. package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js.map +1 -1
  23. package/dist/lib/view-config-panel/view-config-panel.component.js +268 -301
  24. package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
  25. package/dist/lib/view-selector/view-selector.component.d.ts +26 -1
  26. package/dist/lib/view-selector/view-selector.component.d.ts.map +1 -1
  27. package/dist/lib/view-selector/view-selector.component.js +118 -76
  28. package/dist/lib/view-selector/view-selector.component.js.map +1 -1
  29. package/dist/lib/view-types/descriptors/grid-view-type.d.ts +7 -0
  30. package/dist/lib/view-types/descriptors/grid-view-type.d.ts.map +1 -1
  31. package/dist/lib/view-types/descriptors/grid-view-type.js +7 -0
  32. package/dist/lib/view-types/descriptors/grid-view-type.js.map +1 -1
  33. package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts +18 -1
  34. package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts.map +1 -1
  35. package/dist/lib/view-types/renderers/grid-view-renderer.component.js +29 -3
  36. package/dist/lib/view-types/renderers/grid-view-renderer.component.js.map +1 -1
  37. package/dist/lib/view-types/renderers/map-view-renderer.component.d.ts.map +1 -1
  38. package/dist/lib/view-types/renderers/map-view-renderer.component.js +11 -14
  39. package/dist/lib/view-types/renderers/map-view-renderer.component.js.map +1 -1
  40. package/dist/lib/view-types/renderers/timeline-view-renderer.component.d.ts.map +1 -1
  41. package/dist/lib/view-types/renderers/timeline-view-renderer.component.js +12 -14
  42. package/dist/lib/view-types/renderers/timeline-view-renderer.component.js.map +1 -1
  43. package/dist/lib/view-types/view-type.contracts.d.ts +44 -0
  44. package/dist/lib/view-types/view-type.contracts.d.ts.map +1 -1
  45. package/dist/lib/view-types/view-type.contracts.js +6 -0
  46. package/dist/lib/view-types/view-type.contracts.js.map +1 -1
  47. package/dist/lib/view-workspace/view-workspace.component.d.ts +32 -1
  48. package/dist/lib/view-workspace/view-workspace.component.d.ts.map +1 -1
  49. package/dist/lib/view-workspace/view-workspace.component.js +68 -7
  50. package/dist/lib/view-workspace/view-workspace.component.js.map +1 -1
  51. package/dist/module.d.ts +1 -1
  52. package/dist/module.d.ts.map +1 -1
  53. package/dist/module.js +10 -1
  54. package/dist/module.js.map +1 -1
  55. package/package.json +18 -17
  56. package/dist/__tests__/entity-cards-selection.test.d.ts +0 -2
  57. package/dist/__tests__/entity-cards-selection.test.d.ts.map +0 -1
  58. package/dist/__tests__/entity-cards-selection.test.js +0 -149
  59. package/dist/__tests__/entity-cards-selection.test.js.map +0 -1
  60. package/dist/__tests__/entity-cards-viewmodel.test.d.ts +0 -2
  61. package/dist/__tests__/entity-cards-viewmodel.test.d.ts.map +0 -1
  62. package/dist/__tests__/entity-cards-viewmodel.test.js +0 -208
  63. package/dist/__tests__/entity-cards-viewmodel.test.js.map +0 -1
  64. package/dist/__tests__/highlight.test.d.ts +0 -2
  65. package/dist/__tests__/highlight.test.d.ts.map +0 -1
  66. package/dist/__tests__/highlight.test.js +0 -67
  67. package/dist/__tests__/highlight.test.js.map +0 -1
  68. package/dist/__tests__/index.test.d.ts +0 -2
  69. package/dist/__tests__/index.test.d.ts.map +0 -1
  70. package/dist/__tests__/index.test.js +0 -7
  71. package/dist/__tests__/index.test.js.map +0 -1
  72. package/dist/__tests__/view-types.test.d.ts +0 -2
  73. package/dist/__tests__/view-types.test.d.ts.map +0 -1
  74. package/dist/__tests__/view-types.test.js +0 -102
  75. package/dist/__tests__/view-types.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"view-selector.component.js","sourceRoot":"","sources":["../../../src/lib/view-selector/view-selector.component.ts","../../../src/lib/view-selector/view-selector.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport { EntityInfo } from '@memberjunction/core';\nimport { MJUserViewEntityExtended, UserViewEngine, ViewInfo } from '@memberjunction/core-entities';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n/**\n * Represents a view in the dropdown\n */\nexport interface ViewListItem {\n id: string;\n name: string;\n isOwned: boolean;\n isShared: boolean;\n isDefault: boolean;\n userCanEdit: boolean;\n entity: MJUserViewEntityExtended;\n}\n\n/**\n * Event emitted when a view is selected\n */\nexport interface ViewSelectedEvent {\n ViewID: string | null;\n View: MJUserViewEntityExtended | null;\n}\n\n/**\n * Event emitted when user requests to save the current view\n */\nexport interface SaveViewRequestedEvent {\n /** True if user wants to save as a new view */\n SaveAsNew: boolean;\n}\n\n/**\n * ViewSelectorComponent - Dropdown for selecting saved views\n *\n * Features:\n * - Shows \"(Default)\" option when no view is selected\n * - Groups views into \"My Views\" and \"Shared Views\"\n * - \"Save Current View\" and \"Manage Views\" actions\n * - \"Open in Tab\" button for saved views\n */\n@Component({\n standalone: false,\n selector: 'mj-view-selector',\n templateUrl: './view-selector.component.html',\n styleUrls: ['./view-selector.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ViewSelectorComponent extends BaseAngularComponent implements OnChanges, OnDestroy {\n /**\n * The entity to load views for\n */\n @Input() Entity: EntityInfo | null = null;\n\n /**\n * Currently selected view ID (null = default view)\n */\n @Input() SelectedViewID: string | null = null;\n\n /**\n * Whether the current view has unsaved modifications\n */\n @Input() ViewModified: boolean = false;\n\n /**\n * Emitted when a view is selected\n */\n @Output() ViewSelected = new EventEmitter<ViewSelectedEvent>();\n\n /**\n * Emitted when user requests to save the current view\n */\n @Output() SaveViewRequested = new EventEmitter<SaveViewRequestedEvent>();\n\n /**\n * Emitted when user wants to open the view management panel\n */\n @Output() ManageViewsRequested = new EventEmitter<void>();\n\n /**\n * Emitted when user wants to open the current view in its own tab\n */\n @Output() OpenInTabRequested = new EventEmitter<string>();\n\n /**\n * Emitted when user wants to configure the current view\n */\n @Output() ConfigureViewRequested = new EventEmitter<void>();\n\n /**\n * Emitted when user wants to create a new record\n */\n @Output() CreateNewRecordRequested = new EventEmitter<void>();\n\n /**\n * Emitted when user wants to export data to Excel\n */\n @Output() ExportRequested = new EventEmitter<void>();\n\n /**\n * Emitted when user wants to duplicate a view (F-005)\n */\n @Output() DuplicateViewRequested = new EventEmitter<string>();\n\n /**\n * Emitted when user wants to use the quick save dialog (F-001)\n * Emits true when user explicitly requested \"Save As New\", false for general save\n */\n @Output() QuickSaveRequested = new EventEmitter<boolean>();\n\n /**\n * Emitted when user wants to revert to saved state (F-007)\n */\n @Output() RevertRequested = new EventEmitter<void>();\n\n // Internal state\n public IsLoading: boolean = false;\n public IsDropdownOpen: boolean = false;\n public MyViews: ViewListItem[] = [];\n public SharedViews: ViewListItem[] = [];\n public SelectedView: MJUserViewEntityExtended | null = null;\n public SearchText: string = '';\n\n private destroy$ = new Subject<void>();\n private get metadata() { return this.ProviderToUse; }\n\n constructor(private cdr: ChangeDetectorRef) { super(); }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Entity']) {\n if (this.Entity) {\n this.LoadViews();\n } else {\n this.MyViews = [];\n this.SharedViews = [];\n this.SelectedView = null;\n }\n }\n\n if (changes['SelectedViewID'] && this.SelectedViewID) {\n // If we have a selected view ID and it's in our lists, update selectedView\n this.updateSelectedViewFromId();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Load views for the current entity\n */\n public async LoadViews(): Promise<void> {\n if (!this.Entity) {\n return;\n }\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n\n // Use UserViewEngine cache instead of a direct RunView to avoid redundant DB calls.\n // The engine is initialized once and caches all views; GetAccessibleViewsForEntity()\n // already filters by owned + shared and checks UserCanView.\n await UserViewEngine.Instance.Config(false);\n const accessibleViews = UserViewEngine.Instance.GetAccessibleViewsForEntity(this.Entity.ID);\n\n // Separate into owned and shared\n this.MyViews = accessibleViews\n .filter(v => UUIDsEqual(v.UserID, userId))\n .map(v => this.mapViewToListItem(v, true));\n\n this.SharedViews = accessibleViews\n .filter(v => !UUIDsEqual(v.UserID, userId))\n .map(v => this.mapViewToListItem(v, false));\n\n // Update selected view reference\n this.updateSelectedViewFromId();\n } catch (error) {\n console.error('Failed to load views:', error);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Map a view entity to a list item\n */\n private mapViewToListItem(view: MJUserViewEntityExtended, isOwned: boolean): ViewListItem {\n return {\n id: view.ID,\n name: view.Name,\n isOwned,\n isShared: view.IsShared,\n isDefault: view.IsDefault,\n userCanEdit: view.UserCanEdit,\n entity: view\n };\n }\n\n /**\n * Update the selectedView reference based on selectedViewId\n */\n private updateSelectedViewFromId(): void {\n if (!this.SelectedViewID) {\n this.SelectedView = null;\n return;\n }\n\n // Search in both lists\n const myView = this.MyViews.find(v => v.id === this.SelectedViewID);\n if (myView) {\n this.SelectedView = myView.entity;\n return;\n }\n\n const sharedView = this.SharedViews.find(v => v.id === this.SelectedViewID);\n if (sharedView) {\n this.SelectedView = sharedView.entity;\n return;\n }\n\n // View not in lists yet - it might need to be loaded\n this.SelectedView = null;\n }\n\n /**\n * Get the display name for the current selection\n */\n get DisplayName(): string {\n if (this.SelectedView) {\n return this.SelectedView.Name;\n }\n return '(Default)';\n }\n\n /**\n * Toggle dropdown open/closed\n */\n ToggleDropdown(): void {\n this.IsDropdownOpen = !this.IsDropdownOpen;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the dropdown\n */\n CloseDropdown(): void {\n this.IsDropdownOpen = false;\n this.SearchText = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Select the default view (no saved view)\n */\n SelectDefault(): void {\n this.SelectedView = null;\n this.ViewSelected.emit({ ViewID: null, View: null });\n this.CloseDropdown();\n }\n\n /**\n * Select a view from the list\n */\n SelectView(item: ViewListItem): void {\n this.SelectedView = item.entity;\n this.ViewSelected.emit({ ViewID: item.id, View: item.entity });\n this.CloseDropdown();\n }\n\n /**\n * Request to save the current view\n */\n OnSaveView(): void {\n this.SaveViewRequested.emit({ SaveAsNew: false });\n this.CloseDropdown();\n }\n\n /**\n * Request to save as a new view - opens Quick Save dialog in \"Save As New\" mode\n */\n OnSaveAsNewView(): void {\n this.QuickSaveRequested.emit(true);\n this.CloseDropdown();\n }\n\n /**\n * Request to manage views\n */\n OnManageViews(): void {\n this.ManageViewsRequested.emit();\n this.CloseDropdown();\n }\n\n /**\n * Request to open the current view in a tab\n */\n OnOpenInTab(): void {\n if (this.SelectedViewID) {\n this.OpenInTabRequested.emit(this.SelectedViewID);\n }\n }\n\n /**\n * Request to configure the current view\n */\n OnConfigureView(): void {\n this.ConfigureViewRequested.emit();\n }\n\n /**\n * Request to create a new record\n */\n OnCreateNewRecord(): void {\n this.CreateNewRecordRequested.emit();\n }\n\n /**\n * Request to export data to Excel\n */\n OnExport(): void {\n this.ExportRequested.emit();\n }\n\n /**\n * Request to duplicate a view (F-005)\n */\n OnDuplicateView(viewId: string, event: MouseEvent): void {\n event.stopPropagation(); // Don't select the view\n this.DuplicateViewRequested.emit(viewId);\n this.CloseDropdown();\n }\n\n /**\n * Request to open the quick save dialog (F-001)\n */\n OnQuickSave(): void {\n this.QuickSaveRequested.emit(false);\n this.CloseDropdown();\n }\n\n /**\n * Request to revert view to saved state (F-007)\n */\n OnRevert(): void {\n this.RevertRequested.emit();\n }\n\n /**\n * Check if there are any views to show\n */\n get HasViews(): boolean {\n return this.MyViews.length > 0 || this.SharedViews.length > 0;\n }\n\n /**\n * Check if the current user can edit the selected view\n */\n get CanEditSelectedView(): boolean {\n return this.SelectedView?.UserCanEdit ?? false;\n }\n\n /**\n * Handle click outside to close dropdown\n */\n OnClickOutside(event: Event): void {\n this.CloseDropdown();\n }\n\n // ========================================\n // RICH VIEW PANEL: Search & Metadata\n // ========================================\n\n /**\n * My views filtered by search text\n */\n get FilteredMyViews(): ViewListItem[] {\n if (!this.SearchText.trim()) return this.MyViews;\n const term = this.SearchText.toLowerCase();\n return this.MyViews.filter(v =>\n v.name.toLowerCase().includes(term) ||\n (v.entity.Description || '').toLowerCase().includes(term)\n );\n }\n\n /**\n * Shared views filtered by search text\n */\n get FilteredSharedViews(): ViewListItem[] {\n if (!this.SearchText.trim()) return this.SharedViews;\n const term = this.SearchText.toLowerCase();\n return this.SharedViews.filter(v =>\n v.name.toLowerCase().includes(term) ||\n (v.entity.Description || '').toLowerCase().includes(term)\n );\n }\n\n /**\n * Get the number of filters configured in a view by parsing its FilterState\n */\n GetViewFilterCount(view: ViewListItem): number {\n try {\n const filterState = view.entity.FilterState;\n if (!filterState) return 0;\n const parsed = JSON.parse(filterState);\n if (parsed?.filters?.length) return parsed.filters.length;\n // CompositeFilterDescriptor format\n if (parsed?.logic && parsed?.filters) return parsed.filters.length;\n return 0;\n } catch {\n return 0;\n }\n }\n\n /**\n * Get the number of visible columns in a view by parsing GridState\n */\n GetViewColumnCount(view: ViewListItem): number {\n try {\n const gridState = view.entity.GridState;\n if (!gridState) return 0;\n const parsed = JSON.parse(gridState);\n if (Array.isArray(parsed)) {\n return parsed.filter((c: Record<string, unknown>) => !c['hidden']).length;\n }\n return 0;\n } catch {\n return 0;\n }\n }\n\n /**\n * Get sort info string from a view's SortState\n */\n GetViewSortInfo(view: ViewListItem): string {\n try {\n const sortState = view.entity.SortState;\n if (!sortState) return '';\n const parsed = JSON.parse(sortState);\n if (Array.isArray(parsed) && parsed.length > 0) {\n return `${parsed.length} sort${parsed.length > 1 ? 's' : ''}`;\n }\n return '';\n } catch {\n return '';\n }\n }\n\n /**\n * Select a specific view and open the config panel for it\n */\n OnConfigureViewById(viewId: string, event: MouseEvent): void {\n event.stopPropagation();\n // First select the view, then open config\n const item = this.MyViews.find(v => v.id === viewId) || this.SharedViews.find(v => v.id === viewId);\n if (item) {\n this.SelectedView = item.entity;\n this.ViewSelected.emit({ ViewID: item.id, View: item.entity });\n }\n this.ConfigureViewRequested.emit();\n this.CloseDropdown();\n }\n\n /**\n * Open a specific view in a new tab\n */\n OnOpenViewInTab(viewId: string, event: MouseEvent): void {\n event.stopPropagation();\n this.OpenInTabRequested.emit(viewId);\n this.CloseDropdown();\n }\n\n /**\n * Reset to default view (select no view)\n */\n OnResetToDefault(): void {\n this.SelectDefault();\n }\n}\n","<div class=\"vs-container\">\n <!-- Backdrop for closing panel -->\n @if (IsDropdownOpen) {\n <div class=\"vs-backdrop\" (click)=\"CloseDropdown()\"></div>\n }\n\n <!-- Main View Selector Button -->\n <div class=\"vs-wrapper\">\n <button\n class=\"vs-button\"\n [class.modified]=\"ViewModified\"\n [class.open]=\"IsDropdownOpen\"\n (click)=\"ToggleDropdown()\"\n [disabled]=\"IsLoading\"\n title=\"Select a saved view\">\n <i class=\"fa-solid fa-layer-group vs-btn-icon\"></i>\n <span class=\"vs-btn-name\">{{ DisplayName }}</span>\n @if (ViewModified) {\n <span class=\"vs-modified-dot\" title=\"View has unsaved changes\">•</span>\n }\n <i class=\"fa-solid fa-chevron-down vs-arrow\" [class.rotated]=\"IsDropdownOpen\"></i>\n </button>\n\n <!-- Rich View Panel -->\n @if (IsDropdownOpen) {\n <div class=\"vs-panel\">\n <!-- Panel Header -->\n <div class=\"vs-panel-header\">\n <i class=\"fa-solid fa-table-list vs-header-icon\"></i>\n <span class=\"vs-panel-title\">Views</span>\n @if (Entity) {\n <span class=\"vs-Entity-badge\">{{ Entity.DisplayNameOrName }}</span>\n }\n <button class=\"vs-close-btn\" (click)=\"CloseDropdown()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Search -->\n <div class=\"vs-panel-search\">\n <input\n type=\"text\"\n class=\"vs-search-input\"\n placeholder=\"Search views...\"\n [(ngModel)]=\"SearchText\"\n (keydown.escape)=\"SearchText = ''\"\n />\n </div>\n\n <!-- Panel Body -->\n <div class=\"vs-panel-body\">\n <!-- Default Option -->\n <div class=\"vs-section\">\n <div\n class=\"vs-card\"\n [class.active]=\"!SelectedViewID\"\n (click)=\"SelectDefault()\">\n <div class=\"vs-card-icon\" [class.active]=\"!SelectedViewID\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">(Default)</div>\n </div>\n @if (!SelectedViewID) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n </div>\n\n <!-- My Views Section -->\n @if (FilteredMyViews.length > 0) {\n <div class=\"vs-section\">\n <div class=\"vs-section-header\">\n <i class=\"fa-solid fa-user\"></i>\n <span>My Views</span>\n <span class=\"vs-section-count\">{{ FilteredMyViews.length }}</span>\n </div>\n @for (view of FilteredMyViews; track view.id) {\n <div\n class=\"vs-card\"\n [class.active]=\"SelectedViewID === view.id\"\n (click)=\"SelectView(view)\">\n <div class=\"vs-card-icon\" [class.active]=\"SelectedViewID === view.id\">\n <i class=\"fa-solid fa-table-list\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">\n {{ view.name }}\n @if (view.isDefault) {\n <span class=\"vs-default-badge\">Default</span>\n }\n </div>\n @if (view.entity.Description) {\n <div class=\"vs-card-desc\">{{ view.entity.Description }}</div>\n }\n @if (GetViewFilterCount(view) > 0 || GetViewColumnCount(view) > 0 || GetViewSortInfo(view)) {\n <div class=\"vs-card-meta\">\n @if (GetViewFilterCount(view) > 0) {\n <span><i class=\"fa-solid fa-filter\"></i> {{ GetViewFilterCount(view) }} filter{{ GetViewFilterCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (GetViewColumnCount(view) > 0) {\n <span><i class=\"fa-solid fa-table-columns\"></i> {{ GetViewColumnCount(view) }} col{{ GetViewColumnCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (GetViewSortInfo(view)) {\n <span><i class=\"fa-solid fa-arrow-down-short-wide\"></i> {{ GetViewSortInfo(view) }}</span>\n }\n </div>\n }\n </div>\n <div class=\"vs-card-actions\">\n <button\n class=\"vs-action-btn\"\n (click)=\"OnDuplicateView(view.id, $event)\"\n title=\"Duplicate\">\n <i class=\"fa-regular fa-copy\"></i>\n </button>\n <button\n class=\"vs-action-btn\"\n (click)=\"OnConfigureViewById(view.id, $event)\"\n title=\"Configure\">\n <i class=\"fa-solid fa-sliders\"></i>\n </button>\n <button\n class=\"vs-action-btn\"\n (click)=\"OnOpenViewInTab(view.id, $event)\"\n title=\"Open in Tab\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n </div>\n @if (SelectedViewID === view.id) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- Shared Views Section -->\n @if (FilteredSharedViews.length > 0) {\n <div class=\"vs-section\">\n <div class=\"vs-section-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Shared With Me</span>\n <span class=\"vs-section-count\">{{ FilteredSharedViews.length }}</span>\n </div>\n @for (view of FilteredSharedViews; track view.id) {\n <div\n class=\"vs-card\"\n [class.active]=\"SelectedViewID === view.id\"\n (click)=\"SelectView(view)\">\n <div class=\"vs-card-icon shared\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">\n {{ view.name }}\n @if (!view.userCanEdit) {\n <span class=\"vs-shared-badge\">View Only</span>\n } @else {\n <span class=\"vs-shared-badge editable\">Can Edit</span>\n }\n </div>\n @if (view.entity.Description) {\n <div class=\"vs-card-desc\">{{ view.entity.Description }}</div>\n }\n @if (GetViewFilterCount(view) > 0 || GetViewColumnCount(view) > 0) {\n <div class=\"vs-card-meta\">\n @if (GetViewFilterCount(view) > 0) {\n <span><i class=\"fa-solid fa-filter\"></i> {{ GetViewFilterCount(view) }} filter{{ GetViewFilterCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (GetViewColumnCount(view) > 0) {\n <span><i class=\"fa-solid fa-table-columns\"></i> {{ GetViewColumnCount(view) }} col{{ GetViewColumnCount(view) !== 1 ? 's' : '' }}</span>\n }\n </div>\n }\n </div>\n <div class=\"vs-card-actions\">\n <button\n class=\"vs-action-btn\"\n (click)=\"OnDuplicateView(view.id, $event)\"\n title=\"Duplicate as My View\">\n <i class=\"fa-regular fa-copy\"></i>\n </button>\n @if (view.userCanEdit) {\n <button\n class=\"vs-action-btn\"\n (click)=\"OnConfigureViewById(view.id, $event)\"\n title=\"Configure\">\n <i class=\"fa-solid fa-sliders\"></i>\n </button>\n }\n </div>\n @if (SelectedViewID === view.id) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- No Views Message -->\n @if (!HasViews && !IsLoading) {\n <div class=\"vs-empty-message\">\n <i class=\"fa-solid fa-bookmark\"></i>\n <div class=\"vs-empty-text\">\n <strong>No saved views yet</strong>\n <span>Save your current configuration as a view</span>\n </div>\n </div>\n }\n\n <!-- No Search Results -->\n @if (HasViews && FilteredMyViews.length === 0 && FilteredSharedViews.length === 0 && SearchText) {\n <div class=\"vs-empty-message\">\n <i class=\"fa-solid fa-search\"></i>\n <span>No views match \"{{ SearchText }}\"</span>\n </div>\n }\n\n <!-- Loading Indicator -->\n @if (IsLoading) {\n <div class=\"vs-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading views...</span>\n </div>\n }\n </div>\n\n <!-- Panel Footer -->\n <div class=\"vs-panel-footer\">\n <button\n class=\"vs-panel-btn primary\"\n (click)=\"OnQuickSave()\"\n title=\"Save current view configuration\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New View</span>\n </button>\n <button\n class=\"vs-panel-btn\"\n (click)=\"OnResetToDefault()\"\n title=\"Reset to default view\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n <span>Reset to Default</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Open in Tab Button (only visible when a view is selected) -->\n @if (SelectedViewID) {\n <button\n class=\"vs-icon-btn\"\n (click)=\"OnOpenInTab()\"\n title=\"Open this view in a new tab\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n\n <!-- Configure View Button -->\n <button\n class=\"vs-icon-btn\"\n (click)=\"OnConfigureView()\"\n title=\"Configure view settings (columns, filters, sorting)\">\n <i class=\"fa-solid fa-sliders-h\"></i>\n </button>\n\n <!-- Create New Record Button -->\n <button\n class=\"vs-icon-btn\"\n (click)=\"OnCreateNewRecord()\"\n title=\"Create new record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- Export Button -->\n <button\n class=\"vs-icon-btn vs-export-btn\"\n (click)=\"OnExport()\"\n title=\"Export to Excel\">\n <i class=\"fa-solid fa-file-excel\"></i>\n </button>\n</div>\n"]}
1
+ {"version":3,"file":"view-selector.component.js","sourceRoot":"","sources":["../../../src/lib/view-selector/view-selector.component.ts","../../../src/lib/view-selector/view-selector.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, OnDestroy, ViewEncapsulation } from '@angular/core';\nimport { EntityInfo } from '@memberjunction/core';\nimport { MJUserViewEntityExtended, UserViewEngine, ViewInfo } from '@memberjunction/core-entities';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n/**\n * Represents a view in the dropdown\n */\nexport interface ViewListItem {\n id: string;\n name: string;\n isOwned: boolean;\n isShared: boolean;\n isDefault: boolean;\n userCanEdit: boolean;\n entity: MJUserViewEntityExtended;\n}\n\n/**\n * Event emitted when a view is selected\n */\nexport interface ViewSelectedEvent {\n ViewID: string | null;\n View: MJUserViewEntityExtended | null;\n}\n\n/**\n * Event emitted when user requests to save the current view\n */\nexport interface SaveViewRequestedEvent {\n /** True if user wants to save as a new view */\n SaveAsNew: boolean;\n}\n\n/**\n * ViewSelectorComponent - Dropdown for selecting saved views\n *\n * Features:\n * - Shows \"(Default)\" option when no view is selected\n * - Groups views into \"My Views\" and \"Shared Views\"\n * - \"Save Current View\" and \"Manage Views\" actions\n * - \"Open in Tab\" button for saved views\n */\n@Component({\n standalone: false,\n selector: 'mj-view-selector',\n templateUrl: './view-selector.component.html',\n styleUrls: ['./view-selector.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class ViewSelectorComponent extends BaseAngularComponent implements OnChanges, OnDestroy {\n /**\n * The entity to load views for\n */\n @Input() Entity: EntityInfo | null = null;\n\n /**\n * Currently selected view ID (null = default view)\n */\n @Input() SelectedViewID: string | null = null;\n\n /**\n * Whether the current view has unsaved modifications\n */\n @Input() ViewModified: boolean = false;\n\n /**\n * Emitted when a view is selected\n */\n @Output() ViewSelected = new EventEmitter<ViewSelectedEvent>();\n\n /**\n * Emitted when user requests to save the current view\n */\n @Output() SaveViewRequested = new EventEmitter<SaveViewRequestedEvent>();\n\n /**\n * Emitted when user wants to open the view management panel\n */\n @Output() ManageViewsRequested = new EventEmitter<void>();\n\n /**\n * Emitted when user wants to open the current view in its own tab\n */\n @Output() OpenInTabRequested = new EventEmitter<string>();\n\n /**\n * Emitted when user wants to configure the current view\n */\n @Output() ConfigureViewRequested = new EventEmitter<void>();\n\n /**\n * Emitted when user wants to create a new record\n */\n @Output() CreateNewRecordRequested = new EventEmitter<void>();\n\n /**\n * Emitted when user wants to export data to Excel\n */\n @Output() ExportRequested = new EventEmitter<void>();\n\n /**\n * Emitted when user wants to duplicate a view (F-005)\n */\n @Output() DuplicateViewRequested = new EventEmitter<string>();\n\n /**\n * Emitted when user wants to use the quick save dialog (F-001)\n * Emits true when user explicitly requested \"Save As New\", false for general save\n */\n @Output() QuickSaveRequested = new EventEmitter<boolean>();\n\n /**\n * Emitted when user wants to revert to saved state (F-007)\n */\n @Output() RevertRequested = new EventEmitter<void>();\n\n // Internal state\n public IsLoading: boolean = false;\n public IsDropdownOpen: boolean = false;\n public MyViews: ViewListItem[] = [];\n public SharedViews: ViewListItem[] = [];\n public SelectedView: MJUserViewEntityExtended | null = null;\n public SearchText: string = '';\n\n private destroy$ = new Subject<void>();\n /** Guards the one-time reactive subscription to UserViewEngine set up in {@link ensureEngineSubscription}. */\n private subscribedToEngine = false;\n private get metadata() { return this.ProviderToUse; }\n\n constructor(private cdr: ChangeDetectorRef) { super(); }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Entity']) {\n if (this.Entity) {\n void this.LoadViews();\n } else {\n this.MyViews = [];\n this.SharedViews = [];\n this.SelectedView = null;\n }\n }\n\n if (changes['SelectedViewID'] && this.SelectedViewID) {\n // If we have a selected view ID and it's in our lists, update selectedView\n this.updateSelectedViewFromId();\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Ensure the {@link UserViewEngine} cache is loaded, establish a one-time reactive\n * subscription to it, and (re)derive the view lists for the current entity.\n *\n * The subscription is what keeps this dropdown correct: BaseEntity `.Save()`/`.Delete()`\n * on a User View auto-invalidates the engine cache (an in-place array mutation), which\n * emits on `ObserveProperty('_views')`. So when the workspace creates, updates, duplicates,\n * or deletes a view, the list here re-derives automatically — no manual reload required,\n * and no stale-cache race between a fire-and-forget reload and the async cache update.\n */\n public async LoadViews(): Promise<void> {\n if (!this.Entity) {\n return;\n }\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n // Load once; subsequent calls are cheap no-ops. We never force a refresh here — the\n // reactive subscription below keeps the lists fresh once data has changed.\n await UserViewEngine.Instance.Config(false);\n } catch (error) {\n console.error('Failed to load views:', error);\n } finally {\n this.IsLoading = false;\n }\n\n this.ensureEngineSubscription();\n this.recomputeViews();\n }\n\n /**\n * Subscribe (once for the component's lifetime) to the engine's cached `_views` array.\n * The BehaviorSubject replays the current array on subscribe and re-emits on every\n * subsequent create/update/delete/refresh, so {@link recomputeViews} runs whenever the\n * underlying data actually changes.\n */\n private ensureEngineSubscription(): void {\n if (this.subscribedToEngine) {\n return;\n }\n this.subscribedToEngine = true;\n UserViewEngine.Instance\n .ObserveProperty<MJUserViewEntityExtended>('_views')\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this.recomputeViews());\n }\n\n /**\n * Re-derive the owned/shared view lists for the current entity from the engine cache.\n * `GetAccessibleViewsForEntity()` already filters by owned + shared and checks UserCanView.\n */\n private recomputeViews(): void {\n if (!this.Entity) {\n this.MyViews = [];\n this.SharedViews = [];\n this.SelectedView = null;\n this.cdr.detectChanges();\n return;\n }\n\n try {\n const userId = this.metadata.CurrentUser?.ID;\n const accessibleViews = UserViewEngine.Instance.GetAccessibleViewsForEntity(this.Entity.ID);\n\n // Separate into owned and shared\n this.MyViews = accessibleViews\n .filter(v => UUIDsEqual(v.UserID, userId))\n .map(v => this.mapViewToListItem(v, true));\n\n this.SharedViews = accessibleViews\n .filter(v => !UUIDsEqual(v.UserID, userId))\n .map(v => this.mapViewToListItem(v, false));\n\n // Update selected view reference\n this.updateSelectedViewFromId();\n } catch (error) {\n console.error('Failed to derive views:', error);\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Map a view entity to a list item\n */\n private mapViewToListItem(view: MJUserViewEntityExtended, isOwned: boolean): ViewListItem {\n return {\n id: view.ID,\n name: view.Name,\n isOwned,\n isShared: view.IsShared,\n isDefault: view.IsDefault,\n userCanEdit: view.UserCanEdit,\n entity: view\n };\n }\n\n /**\n * Update the selectedView reference based on selectedViewId\n */\n private updateSelectedViewFromId(): void {\n if (!this.SelectedViewID) {\n this.SelectedView = null;\n return;\n }\n\n // Search in both lists\n const myView = this.MyViews.find(v => v.id === this.SelectedViewID);\n if (myView) {\n this.SelectedView = myView.entity;\n return;\n }\n\n const sharedView = this.SharedViews.find(v => v.id === this.SelectedViewID);\n if (sharedView) {\n this.SelectedView = sharedView.entity;\n return;\n }\n\n // View not in lists yet - it might need to be loaded\n this.SelectedView = null;\n }\n\n /**\n * Get the display name for the current selection\n */\n get DisplayName(): string {\n if (this.SelectedView) {\n return this.SelectedView.Name;\n }\n return '(Default)';\n }\n\n /**\n * Toggle dropdown open/closed\n */\n ToggleDropdown(): void {\n this.IsDropdownOpen = !this.IsDropdownOpen;\n this.cdr.detectChanges();\n }\n\n /**\n * Close the dropdown\n */\n CloseDropdown(): void {\n this.IsDropdownOpen = false;\n this.SearchText = '';\n this.cdr.detectChanges();\n }\n\n /**\n * Select the default view (no saved view)\n */\n SelectDefault(): void {\n this.SelectedView = null;\n this.ViewSelected.emit({ ViewID: null, View: null });\n this.CloseDropdown();\n }\n\n /**\n * Select a view from the list\n */\n SelectView(item: ViewListItem): void {\n this.SelectedView = item.entity;\n this.ViewSelected.emit({ ViewID: item.id, View: item.entity });\n this.CloseDropdown();\n }\n\n /**\n * Request to save the current view\n */\n OnSaveView(): void {\n this.SaveViewRequested.emit({ SaveAsNew: false });\n this.CloseDropdown();\n }\n\n /**\n * Request to save as a new view - opens Quick Save dialog in \"Save As New\" mode\n */\n OnSaveAsNewView(): void {\n this.QuickSaveRequested.emit(true);\n this.CloseDropdown();\n }\n\n /**\n * Request to manage views\n */\n OnManageViews(): void {\n this.ManageViewsRequested.emit();\n this.CloseDropdown();\n }\n\n /**\n * Request to open the current view in a tab\n */\n OnOpenInTab(): void {\n if (this.SelectedViewID) {\n this.OpenInTabRequested.emit(this.SelectedViewID);\n }\n }\n\n /**\n * Request to configure the current view\n */\n OnConfigureView(): void {\n this.ConfigureViewRequested.emit();\n }\n\n /**\n * Request to create a new record\n */\n OnCreateNewRecord(): void {\n this.CreateNewRecordRequested.emit();\n }\n\n /**\n * Request to export data to Excel\n */\n OnExport(): void {\n this.ExportRequested.emit();\n }\n\n /**\n * Request to duplicate a view (F-005)\n */\n OnDuplicateView(viewId: string, event: MouseEvent): void {\n event.stopPropagation(); // Don't select the view\n this.DuplicateViewRequested.emit(viewId);\n this.CloseDropdown();\n }\n\n /**\n * Request to open the quick save dialog (F-001)\n */\n OnQuickSave(): void {\n this.QuickSaveRequested.emit(false);\n this.CloseDropdown();\n }\n\n /**\n * Request to revert view to saved state (F-007)\n */\n OnRevert(): void {\n this.RevertRequested.emit();\n }\n\n /**\n * Check if there are any views to show\n */\n get HasViews(): boolean {\n return this.MyViews.length > 0 || this.SharedViews.length > 0;\n }\n\n /**\n * Title for the \"no search results\" empty state — echoes the current search term.\n */\n get NoViewsMatchMessage(): string {\n return `No views match \"${this.SearchText}\"`;\n }\n\n /**\n * Check if the current user can edit the selected view\n */\n get CanEditSelectedView(): boolean {\n return this.SelectedView?.UserCanEdit ?? false;\n }\n\n /**\n * Handle click outside to close dropdown\n */\n OnClickOutside(event: Event): void {\n this.CloseDropdown();\n }\n\n // ========================================\n // RICH VIEW PANEL: Search & Metadata\n // ========================================\n\n /**\n * My views filtered by search text\n */\n get FilteredMyViews(): ViewListItem[] {\n if (!this.SearchText.trim()) return this.MyViews;\n const term = this.SearchText.toLowerCase();\n return this.MyViews.filter(v =>\n v.name.toLowerCase().includes(term) ||\n (v.entity.Description || '').toLowerCase().includes(term)\n );\n }\n\n /**\n * Shared views filtered by search text\n */\n get FilteredSharedViews(): ViewListItem[] {\n if (!this.SearchText.trim()) return this.SharedViews;\n const term = this.SearchText.toLowerCase();\n return this.SharedViews.filter(v =>\n v.name.toLowerCase().includes(term) ||\n (v.entity.Description || '').toLowerCase().includes(term)\n );\n }\n\n /**\n * Get the number of filters configured in a view by parsing its FilterState\n */\n GetViewFilterCount(view: ViewListItem): number {\n try {\n const filterState = view.entity.FilterState;\n if (!filterState) return 0;\n const parsed = JSON.parse(filterState);\n if (parsed?.filters?.length) return parsed.filters.length;\n // CompositeFilterDescriptor format\n if (parsed?.logic && parsed?.filters) return parsed.filters.length;\n return 0;\n } catch {\n return 0;\n }\n }\n\n /**\n * Get the number of visible columns in a view by parsing GridState\n */\n GetViewColumnCount(view: ViewListItem): number {\n try {\n const gridState = view.entity.GridState;\n if (!gridState) return 0;\n const parsed = JSON.parse(gridState);\n if (Array.isArray(parsed)) {\n return parsed.filter((c: Record<string, unknown>) => !c['hidden']).length;\n }\n return 0;\n } catch {\n return 0;\n }\n }\n\n /**\n * Get sort info string from a view's SortState\n */\n GetViewSortInfo(view: ViewListItem): string {\n try {\n const sortState = view.entity.SortState;\n if (!sortState) return '';\n const parsed = JSON.parse(sortState);\n if (Array.isArray(parsed) && parsed.length > 0) {\n return `${parsed.length} sort${parsed.length > 1 ? 's' : ''}`;\n }\n return '';\n } catch {\n return '';\n }\n }\n\n /**\n * Select a specific view and open the config panel for it\n */\n OnConfigureViewById(viewId: string, event: MouseEvent): void {\n event.stopPropagation();\n // First select the view, then open config\n const item = this.MyViews.find(v => v.id === viewId) || this.SharedViews.find(v => v.id === viewId);\n if (item) {\n this.SelectedView = item.entity;\n this.ViewSelected.emit({ ViewID: item.id, View: item.entity });\n }\n this.ConfigureViewRequested.emit();\n this.CloseDropdown();\n }\n\n /**\n * Open a specific view in a new tab\n */\n OnOpenViewInTab(viewId: string, event: MouseEvent): void {\n event.stopPropagation();\n this.OpenInTabRequested.emit(viewId);\n this.CloseDropdown();\n }\n\n /**\n * Reset to default view (select no view)\n */\n OnResetToDefault(): void {\n this.SelectDefault();\n }\n}\n","<div class=\"vs-container\">\n <!-- Backdrop for closing panel -->\n @if (IsDropdownOpen) {\n <div class=\"vs-backdrop\" (click)=\"CloseDropdown()\"></div>\n }\n\n <!-- Main View Selector Button -->\n <div class=\"vs-wrapper\">\n <button\n class=\"vs-button\"\n [class.modified]=\"ViewModified\"\n [class.open]=\"IsDropdownOpen\"\n (click)=\"ToggleDropdown()\"\n [disabled]=\"IsLoading\"\n title=\"Select a saved view\">\n <i class=\"fa-solid fa-layer-group vs-btn-icon\"></i>\n <span class=\"vs-btn-name\">{{ DisplayName }}</span>\n @if (ViewModified) {\n <span class=\"vs-modified-dot\" title=\"View has unsaved changes\">•</span>\n }\n <i class=\"fa-solid fa-chevron-down vs-arrow\" [class.rotated]=\"IsDropdownOpen\"></i>\n </button>\n\n <!-- Rich View Panel -->\n @if (IsDropdownOpen) {\n <div class=\"vs-panel\">\n <!-- Panel Header -->\n <div class=\"vs-panel-header\">\n <i class=\"fa-solid fa-table-list vs-header-icon\"></i>\n <span class=\"vs-panel-title\">Views</span>\n @if (Entity) {\n <span class=\"vs-Entity-badge\">{{ Entity.DisplayNameOrName }}</span>\n }\n <button class=\"vs-close-btn\" (click)=\"CloseDropdown()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Search -->\n <div class=\"vs-panel-search\">\n <input\n type=\"text\"\n class=\"vs-search-input\"\n placeholder=\"Search views...\"\n [(ngModel)]=\"SearchText\"\n (keydown.escape)=\"SearchText = ''\"\n />\n </div>\n\n <!-- Panel Body -->\n <div class=\"vs-panel-body\">\n <!-- Default Option -->\n <div class=\"vs-section\">\n <div\n class=\"vs-card\"\n [class.active]=\"!SelectedViewID\"\n (click)=\"SelectDefault()\">\n <div class=\"vs-card-icon\" [class.active]=\"!SelectedViewID\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">(Default)</div>\n </div>\n @if (!SelectedViewID) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n </div>\n\n <!-- My Views Section -->\n @if (FilteredMyViews.length > 0) {\n <div class=\"vs-section\">\n <div class=\"vs-section-header\">\n <i class=\"fa-solid fa-user\"></i>\n <span>My Views</span>\n <span class=\"vs-section-count\">{{ FilteredMyViews.length }}</span>\n </div>\n @for (view of FilteredMyViews; track view.id) {\n <div\n class=\"vs-card\"\n [class.active]=\"SelectedViewID === view.id\"\n (click)=\"SelectView(view)\">\n <div class=\"vs-card-icon\" [class.active]=\"SelectedViewID === view.id\">\n <i class=\"fa-solid fa-table-list\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">\n {{ view.name }}\n @if (view.isDefault) {\n <span class=\"vs-default-badge\">Default</span>\n }\n </div>\n @if (view.entity.Description) {\n <div class=\"vs-card-desc\">{{ view.entity.Description }}</div>\n }\n @if (GetViewFilterCount(view) > 0 || GetViewColumnCount(view) > 0 || GetViewSortInfo(view)) {\n <div class=\"vs-card-meta\">\n @if (GetViewFilterCount(view) > 0) {\n <span><i class=\"fa-solid fa-filter\"></i> {{ GetViewFilterCount(view) }} filter{{ GetViewFilterCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (GetViewColumnCount(view) > 0) {\n <span><i class=\"fa-solid fa-table-columns\"></i> {{ GetViewColumnCount(view) }} col{{ GetViewColumnCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (GetViewSortInfo(view)) {\n <span><i class=\"fa-solid fa-arrow-down-short-wide\"></i> {{ GetViewSortInfo(view) }}</span>\n }\n </div>\n }\n </div>\n <div class=\"vs-card-actions\">\n <button\n class=\"vs-action-btn\"\n (click)=\"OnDuplicateView(view.id, $event)\"\n title=\"Duplicate\">\n <i class=\"fa-regular fa-copy\"></i>\n </button>\n <button\n class=\"vs-action-btn\"\n (click)=\"OnConfigureViewById(view.id, $event)\"\n title=\"Configure\">\n <i class=\"fa-solid fa-sliders\"></i>\n </button>\n <button\n class=\"vs-action-btn\"\n (click)=\"OnOpenViewInTab(view.id, $event)\"\n title=\"Open in Tab\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n </div>\n @if (SelectedViewID === view.id) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- Shared Views Section -->\n @if (FilteredSharedViews.length > 0) {\n <div class=\"vs-section\">\n <div class=\"vs-section-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Shared With Me</span>\n <span class=\"vs-section-count\">{{ FilteredSharedViews.length }}</span>\n </div>\n @for (view of FilteredSharedViews; track view.id) {\n <div\n class=\"vs-card\"\n [class.active]=\"SelectedViewID === view.id\"\n (click)=\"SelectView(view)\">\n <div class=\"vs-card-icon shared\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">\n {{ view.name }}\n @if (!view.userCanEdit) {\n <span class=\"vs-shared-badge\">View Only</span>\n } @else {\n <span class=\"vs-shared-badge editable\">Can Edit</span>\n }\n </div>\n @if (view.entity.Description) {\n <div class=\"vs-card-desc\">{{ view.entity.Description }}</div>\n }\n @if (GetViewFilterCount(view) > 0 || GetViewColumnCount(view) > 0) {\n <div class=\"vs-card-meta\">\n @if (GetViewFilterCount(view) > 0) {\n <span><i class=\"fa-solid fa-filter\"></i> {{ GetViewFilterCount(view) }} filter{{ GetViewFilterCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (GetViewColumnCount(view) > 0) {\n <span><i class=\"fa-solid fa-table-columns\"></i> {{ GetViewColumnCount(view) }} col{{ GetViewColumnCount(view) !== 1 ? 's' : '' }}</span>\n }\n </div>\n }\n </div>\n <div class=\"vs-card-actions\">\n <button\n class=\"vs-action-btn\"\n (click)=\"OnDuplicateView(view.id, $event)\"\n title=\"Duplicate as My View\">\n <i class=\"fa-regular fa-copy\"></i>\n </button>\n @if (view.userCanEdit) {\n <button\n class=\"vs-action-btn\"\n (click)=\"OnConfigureViewById(view.id, $event)\"\n title=\"Configure\">\n <i class=\"fa-solid fa-sliders\"></i>\n </button>\n }\n </div>\n @if (SelectedViewID === view.id) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- No Views Message -->\n @if (!HasViews && !IsLoading) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-bookmark\"\n Title=\"No saved views yet\"\n Message=\"Save your current configuration as a view\" />\n }\n\n <!-- No Search Results -->\n @if (HasViews && FilteredMyViews.length === 0 && FilteredSharedViews.length === 0 && SearchText) {\n <mj-empty-state\n Size=\"compact\"\n Variant=\"no-results\"\n [Title]=\"NoViewsMatchMessage\" />\n }\n\n <!-- Loading Indicator -->\n @if (IsLoading) {\n <div class=\"vs-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading views...</span>\n </div>\n }\n </div>\n\n <!-- Panel Footer -->\n <div class=\"vs-panel-footer\">\n <button\n class=\"vs-panel-btn primary\"\n (click)=\"OnQuickSave()\"\n title=\"Save current view configuration\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New View</span>\n </button>\n <button\n class=\"vs-panel-btn\"\n (click)=\"OnResetToDefault()\"\n title=\"Reset to default view\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n <span>Reset to Default</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Open in Tab Button (only visible when a view is selected) -->\n @if (SelectedViewID) {\n <button\n class=\"vs-icon-btn\"\n (click)=\"OnOpenInTab()\"\n title=\"Open this view in a new tab\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n\n <!-- Configure View Button -->\n <button\n class=\"vs-icon-btn\"\n (click)=\"OnConfigureView()\"\n title=\"Configure view settings (columns, filters, sorting)\">\n <i class=\"fa-solid fa-sliders-h\"></i>\n </button>\n\n <!-- Create New Record Button -->\n <button\n class=\"vs-icon-btn\"\n (click)=\"OnCreateNewRecord()\"\n title=\"Create new record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- Export Button -->\n <button\n class=\"vs-icon-btn vs-export-btn\"\n (click)=\"OnExport()\"\n title=\"Export to Excel\">\n <i class=\"fa-solid fa-file-excel\"></i>\n </button>\n</div>\n"]}
@@ -11,6 +11,13 @@ export declare class GridViewType extends BaseViewTypeDescriptor {
11
11
  readonly DisplayName = "Grid";
12
12
  readonly Icon = "fa-solid fa-table";
13
13
  readonly RendererComponent: Type<unknown>;
14
+ /**
15
+ * The grid renders the view's canonical columns, so its `config.gridState` is backed by the
16
+ * canonical `UserView.GridState` store (shared with `MJUserViewEntity.Columns`, the server-side
17
+ * field list, the config panel, and export) — NOT an opaque per-view-type blob. See
18
+ * {@link IViewTypeDescriptor.UsesCanonicalGridState}.
19
+ */
20
+ readonly UsesCanonicalGridState = true;
14
21
  }
15
22
  /** Tree-shaking guard — call from a barrel/module to keep the registration alive. */
16
23
  export declare function LoadGridViewType(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"grid-view-type.d.ts","sourceRoot":"","sources":["../../../../src/lib/view-types/descriptors/grid-view-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE;;;;;GAKG;AACH,qBACa,YAAa,SAAQ,sBAAsB;IACtD,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,WAAW,UAAU;IAC9B,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,CAA6B;CAGvE;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
1
+ {"version":3,"file":"grid-view-type.d.ts","sourceRoot":"","sources":["../../../../src/lib/view-types/descriptors/grid-view-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE;;;;;GAKG;AACH,qBACa,YAAa,SAAQ,sBAAsB;IACtD,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,WAAW,UAAU;IAC9B,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,CAA6B;IAEtE;;;;;OAKG;IACH,SAAkB,sBAAsB,QAAQ;CAGjD;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -18,6 +18,13 @@ let GridViewType = class GridViewType extends BaseViewTypeDescriptor {
18
18
  DisplayName = 'Grid';
19
19
  Icon = 'fa-solid fa-table';
20
20
  RendererComponent = GridViewRendererComponent;
21
+ /**
22
+ * The grid renders the view's canonical columns, so its `config.gridState` is backed by the
23
+ * canonical `UserView.GridState` store (shared with `MJUserViewEntity.Columns`, the server-side
24
+ * field list, the config panel, and export) — NOT an opaque per-view-type blob. See
25
+ * {@link IViewTypeDescriptor.UsesCanonicalGridState}.
26
+ */
27
+ UsesCanonicalGridState = true;
21
28
  };
22
29
  GridViewType = __decorate([
23
30
  RegisterClass(BaseViewTypeDescriptor, 'GridViewType')
@@ -1 +1 @@
1
- {"version":3,"file":"grid-view-type.js","sourceRoot":"","sources":["../../../../src/lib/view-types/descriptors/grid-view-type.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAEtF;;;;;GAKG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,sBAAsB;IAC7C,IAAI,GAAG,cAAc,CAAC;IACtB,WAAW,GAAG,MAAM,CAAC;IACrB,IAAI,GAAG,mBAAmB,CAAC;IAC3B,iBAAiB,GAAkB,yBAAyB,CAAC;CAGvE,CAAA;AAPY,YAAY;IADxB,aAAa,CAAC,sBAAsB,EAAE,cAAc,CAAC;GACzC,YAAY,CAOxB;;AAED,qFAAqF;AACrF,MAAM,UAAU,gBAAgB;IAC9B,QAAQ;AACV,CAAC","sourcesContent":["import { Type } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseViewTypeDescriptor } from '../view-type.contracts';\nimport { GridViewRendererComponent } from '../renderers/grid-view-renderer.component';\n\n/**\n * Grid view type — the classic tabular AG-Grid renderer. Available for every entity.\n *\n * Registration key (`DriverClass`) matches the `MJ: View Types` metadata seed:\n * `metadata/view-types/.view-types.json` → \"GridViewType\".\n */\n@RegisterClass(BaseViewTypeDescriptor, 'GridViewType')\nexport class GridViewType extends BaseViewTypeDescriptor {\n readonly Name = 'GridViewType';\n readonly DisplayName = 'Grid';\n readonly Icon = 'fa-solid fa-table';\n readonly RendererComponent: Type<unknown> = GridViewRendererComponent;\n\n // IsAvailableFor inherits the base \"always available\" behavior.\n}\n\n/** Tree-shaking guard — call from a barrel/module to keep the registration alive. */\nexport function LoadGridViewType(): void {\n // no-op\n}\n"]}
1
+ {"version":3,"file":"grid-view-type.js","sourceRoot":"","sources":["../../../../src/lib/view-types/descriptors/grid-view-type.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAEtF;;;;;GAKG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,sBAAsB;IAC7C,IAAI,GAAG,cAAc,CAAC;IACtB,WAAW,GAAG,MAAM,CAAC;IACrB,IAAI,GAAG,mBAAmB,CAAC;IAC3B,iBAAiB,GAAkB,yBAAyB,CAAC;IAEtE;;;;;OAKG;IACe,sBAAsB,GAAG,IAAI,CAAC;CAGjD,CAAA;AAfY,YAAY;IADxB,aAAa,CAAC,sBAAsB,EAAE,cAAc,CAAC;GACzC,YAAY,CAexB;;AAED,qFAAqF;AACrF,MAAM,UAAU,gBAAgB;IAC9B,QAAQ;AACV,CAAC","sourcesContent":["import { Type } from '@angular/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseViewTypeDescriptor } from '../view-type.contracts';\nimport { GridViewRendererComponent } from '../renderers/grid-view-renderer.component';\n\n/**\n * Grid view type — the classic tabular AG-Grid renderer. Available for every entity.\n *\n * Registration key (`DriverClass`) matches the `MJ: View Types` metadata seed:\n * `metadata/view-types/.view-types.json` → \"GridViewType\".\n */\n@RegisterClass(BaseViewTypeDescriptor, 'GridViewType')\nexport class GridViewType extends BaseViewTypeDescriptor {\n readonly Name = 'GridViewType';\n readonly DisplayName = 'Grid';\n readonly Icon = 'fa-solid fa-table';\n readonly RendererComponent: Type<unknown> = GridViewRendererComponent;\n\n /**\n * The grid renders the view's canonical columns, so its `config.gridState` is backed by the\n * canonical `UserView.GridState` store (shared with `MJUserViewEntity.Columns`, the server-side\n * field list, the config panel, and export) — NOT an opaque per-view-type blob. See\n * {@link IViewTypeDescriptor.UsesCanonicalGridState}.\n */\n override readonly UsesCanonicalGridState = true;\n\n // IsAvailableFor inherits the base \"always available\" behavior.\n}\n\n/** Tree-shaking guard — call from a barrel/module to keep the registration alive. */\nexport function LoadGridViewType(): void {\n // no-op\n}\n"]}
@@ -136,6 +136,13 @@ export declare class GridViewRendererComponent extends BaseAngularComponent impl
136
136
  configChanged: EventEmitter<GridViewConfig>;
137
137
  /** Generic data-access channel: ask the host to re-load with different sort / page. */
138
138
  dataRequest: EventEmitter<ViewDataRequest>;
139
+ /**
140
+ * Ask the host to open this view's configuration UI. Raised when the grid emits
141
+ * `ManageColumnsRequested` (its "Manage Columns" toolbar affordance). Part of the generic
142
+ * {@link IViewRenderer} contract; the container forwards it to the workspace, which opens the
143
+ * config panel (Columns tab) — the canonical column editor.
144
+ */
145
+ configureRequested: EventEmitter<void>;
139
146
  /**
140
147
  * NAVIGATION: open a related record on a (possibly different) entity from a foreign-key cell click.
141
148
  * Routing lives in the outer app, so this is one of the few signals that legitimately bubbles up.
@@ -148,6 +155,16 @@ export declare class GridViewRendererComponent extends BaseAngularComponent impl
148
155
  * selection is mapped from the {@link records} input rather than read from the grid, per contract.
149
156
  */
150
157
  protected grid?: EntityDataGridComponent;
158
+ /**
159
+ * IMPERATIVE export entry point ({@link IViewRenderer.exportRecords}). Lets the host trigger
160
+ * an export programmatically (ultimately for the AI agent) by delegating to the hosted grid's
161
+ * self-contained {@link EntityDataGridComponent.Export} (which downloads the file). The grid's
162
+ * toolbar export button remains the interactive path; this is the no-UI equivalent.
163
+ *
164
+ * @param format optional output format; the grid defaults to 'excel' when omitted.
165
+ * @returns true when the export succeeded, false when the grid isn't ready or the export failed.
166
+ */
167
+ exportRecords(format?: 'csv' | 'excel' | 'json'): Promise<boolean>;
151
168
  /** Whether the add-to-list dialog is visible. Toggled internally by {@link onAddToListRequested}. */
152
169
  protected showListManagementDialog: boolean;
153
170
  /** Config fed into `<mj-list-management-dialog>`. Built from the entity + selected records. */
@@ -268,7 +285,7 @@ export declare class GridViewRendererComponent extends BaseAngularComponent impl
268
285
  */
269
286
  private resolveEntityNameById;
270
287
  static ɵfac: i0.ɵɵFactoryDeclaration<GridViewRendererComponent, never>;
271
- static ɵcmp: i0.ɵɵComponentDeclaration<GridViewRendererComponent, "mj-grid-view-renderer", never, { "entity": { "alias": "entity"; "required": false; }; "records": { "alias": "records"; "required": false; }; "selectedRecordId": { "alias": "selectedRecordId"; "required": false; }; "filterText": { "alias": "filterText"; "required": false; }; "config": { "alias": "config"; "required": false; }; "AutoLoadEntityActions": { "alias": "AutoLoadEntityActions"; "required": false; }; "totalRecordCount": { "alias": "totalRecordCount"; "required": false; }; "page": { "alias": "page"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; }, { "recordSelected": "recordSelected"; "recordOpened": "recordOpened"; "configChanged": "configChanged"; "dataRequest": "dataRequest"; "openRelatedRecordRequested": "openRelatedRecordRequested"; "createRecordRequested": "createRecordRequested"; }, never, never, false, never>;
288
+ static ɵcmp: i0.ɵɵComponentDeclaration<GridViewRendererComponent, "mj-grid-view-renderer", never, { "entity": { "alias": "entity"; "required": false; }; "records": { "alias": "records"; "required": false; }; "selectedRecordId": { "alias": "selectedRecordId"; "required": false; }; "filterText": { "alias": "filterText"; "required": false; }; "config": { "alias": "config"; "required": false; }; "AutoLoadEntityActions": { "alias": "AutoLoadEntityActions"; "required": false; }; "totalRecordCount": { "alias": "totalRecordCount"; "required": false; }; "page": { "alias": "page"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; }, { "recordSelected": "recordSelected"; "recordOpened": "recordOpened"; "configChanged": "configChanged"; "dataRequest": "dataRequest"; "configureRequested": "configureRequested"; "openRelatedRecordRequested": "openRelatedRecordRequested"; "createRecordRequested": "createRecordRequested"; }, never, never, false, never>;
272
289
  }
273
290
  /**
274
291
  * Tree-shaking guard. Force-references this renderer so bundlers (ESBuild/Vite) don't drop the
@@ -1 +1 @@
1
- {"version":3,"file":"grid-view-renderer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/view-types/renderers/grid-view-renderer.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grid-view-renderer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/view-types/renderers/grid-view-renderer.component.ts"],"names":[],"mappings":"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"}
@@ -113,6 +113,13 @@ export class GridViewRendererComponent extends BaseAngularComponent {
113
113
  configChanged = new EventEmitter();
114
114
  /** Generic data-access channel: ask the host to re-load with different sort / page. */
115
115
  dataRequest = new EventEmitter();
116
+ /**
117
+ * Ask the host to open this view's configuration UI. Raised when the grid emits
118
+ * `ManageColumnsRequested` (its "Manage Columns" toolbar affordance). Part of the generic
119
+ * {@link IViewRenderer} contract; the container forwards it to the workspace, which opens the
120
+ * config panel (Columns tab) — the canonical column editor.
121
+ */
122
+ configureRequested = new EventEmitter();
116
123
  /**
117
124
  * NAVIGATION: open a related record on a (possibly different) entity from a foreign-key cell click.
118
125
  * Routing lives in the outer app, so this is one of the few signals that legitimately bubbles up.
@@ -125,6 +132,22 @@ export class GridViewRendererComponent extends BaseAngularComponent {
125
132
  * selection is mapped from the {@link records} input rather than read from the grid, per contract.
126
133
  */
127
134
  grid;
135
+ /**
136
+ * IMPERATIVE export entry point ({@link IViewRenderer.exportRecords}). Lets the host trigger
137
+ * an export programmatically (ultimately for the AI agent) by delegating to the hosted grid's
138
+ * self-contained {@link EntityDataGridComponent.Export} (which downloads the file). The grid's
139
+ * toolbar export button remains the interactive path; this is the no-UI equivalent.
140
+ *
141
+ * @param format optional output format; the grid defaults to 'excel' when omitted.
142
+ * @returns true when the export succeeded, false when the grid isn't ready or the export failed.
143
+ */
144
+ async exportRecords(format) {
145
+ if (!this.grid) {
146
+ return false;
147
+ }
148
+ const result = await this.grid.Export(format ? { format } : undefined, true);
149
+ return !!result?.success;
150
+ }
128
151
  // ================================================================
129
152
  // Self-contained dialog state (never surfaced to the host)
130
153
  // ================================================================
@@ -437,10 +460,10 @@ export class GridViewRendererComponent extends BaseAngularComponent {
437
460
  } if (rf & 2) {
438
461
  let _t;
439
462
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.grid = _t.first);
440
- } }, inputs: { entity: "entity", records: "records", selectedRecordId: "selectedRecordId", filterText: "filterText", config: "config", AutoLoadEntityActions: "AutoLoadEntityActions", totalRecordCount: "totalRecordCount", page: "page", pageSize: "pageSize", isLoading: "isLoading" }, outputs: { recordSelected: "recordSelected", recordOpened: "recordOpened", configChanged: "configChanged", dataRequest: "dataRequest", openRelatedRecordRequested: "openRelatedRecordRequested", createRecordRequested: "createRecordRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 20, consts: [["grid", ""], [3, "AfterRowClick", "AfterRowDoubleClick", "AfterSort", "GridStateChanged", "SelectionChange", "NewButtonClick", "RefreshButtonClick", "DeleteButtonClick", "AddToListRequested", "ForeignKeyClick", "PageChange", "Provider", "Data", "Params", "FilterText", "GridState", "Height", "AllowLoad", "AutoLoadEntityActions", "ShowToolbar", "ToolbarConfig", "SelectionMode", "ShowAddToListButton", "ShowPager", "PageSize", "TotalRowCount", "PagerPageNumber"], [3, "Provider", "visible", "config"], ["Title", "Delete Records", "DetailMessage", "This action cannot be undone.", "ConfirmText", "Delete", "ConfirmStyle", "danger", "Icon", "fa-solid fa-trash", 3, "Confirmed", "Cancelled", "IsOpen", "Message"], [3, "complete", "cancel", "Provider", "visible", "config"]], template: function GridViewRendererComponent_Template(rf, ctx) { if (rf & 1) {
463
+ } }, inputs: { entity: "entity", records: "records", selectedRecordId: "selectedRecordId", filterText: "filterText", config: "config", AutoLoadEntityActions: "AutoLoadEntityActions", totalRecordCount: "totalRecordCount", page: "page", pageSize: "pageSize", isLoading: "isLoading" }, outputs: { recordSelected: "recordSelected", recordOpened: "recordOpened", configChanged: "configChanged", dataRequest: "dataRequest", configureRequested: "configureRequested", openRelatedRecordRequested: "openRelatedRecordRequested", createRecordRequested: "createRecordRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 20, consts: [["grid", ""], [3, "AfterRowClick", "AfterRowDoubleClick", "AfterSort", "GridStateChanged", "SelectionChange", "NewButtonClick", "RefreshButtonClick", "DeleteButtonClick", "AddToListRequested", "ForeignKeyClick", "PageChange", "ManageColumnsRequested", "Provider", "Data", "Params", "FilterText", "GridState", "Height", "AllowLoad", "AutoLoadEntityActions", "ShowToolbar", "ToolbarConfig", "SelectionMode", "ShowAddToListButton", "ShowPager", "PageSize", "TotalRowCount", "PagerPageNumber"], [3, "Provider", "visible", "config"], ["Title", "Delete Records", "DetailMessage", "This action cannot be undone.", "ConfirmText", "Delete", "ConfirmStyle", "danger", "Icon", "fa-solid fa-trash", 3, "Confirmed", "Cancelled", "IsOpen", "Message"], [3, "complete", "cancel", "Provider", "visible", "config"]], template: function GridViewRendererComponent_Template(rf, ctx) { if (rf & 1) {
441
464
  const _r1 = i0.ɵɵgetCurrentView();
442
465
  i0.ɵɵelementStart(0, "mj-entity-data-grid", 1, 0);
443
- i0.ɵɵlistener("AfterRowClick", function GridViewRendererComponent_Template_mj_entity_data_grid_AfterRowClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAfterRowClick($event)); })("AfterRowDoubleClick", function GridViewRendererComponent_Template_mj_entity_data_grid_AfterRowDoubleClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAfterRowDoubleClick($event)); })("AfterSort", function GridViewRendererComponent_Template_mj_entity_data_grid_AfterSort_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAfterSort($event)); })("GridStateChanged", function GridViewRendererComponent_Template_mj_entity_data_grid_GridStateChanged_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onGridStateChanged($event)); })("SelectionChange", function GridViewRendererComponent_Template_mj_entity_data_grid_SelectionChange_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSelectionChange($event)); })("NewButtonClick", function GridViewRendererComponent_Template_mj_entity_data_grid_NewButtonClick_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onNewButtonClick()); })("RefreshButtonClick", function GridViewRendererComponent_Template_mj_entity_data_grid_RefreshButtonClick_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onRefreshButtonClick()); })("DeleteButtonClick", function GridViewRendererComponent_Template_mj_entity_data_grid_DeleteButtonClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDeleteButtonClick($event)); })("AddToListRequested", function GridViewRendererComponent_Template_mj_entity_data_grid_AddToListRequested_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAddToListRequested($event)); })("ForeignKeyClick", function GridViewRendererComponent_Template_mj_entity_data_grid_ForeignKeyClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onForeignKeyClick($event)); })("PageChange", function GridViewRendererComponent_Template_mj_entity_data_grid_PageChange_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onPageChange($event)); });
466
+ i0.ɵɵlistener("AfterRowClick", function GridViewRendererComponent_Template_mj_entity_data_grid_AfterRowClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAfterRowClick($event)); })("AfterRowDoubleClick", function GridViewRendererComponent_Template_mj_entity_data_grid_AfterRowDoubleClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAfterRowDoubleClick($event)); })("AfterSort", function GridViewRendererComponent_Template_mj_entity_data_grid_AfterSort_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAfterSort($event)); })("GridStateChanged", function GridViewRendererComponent_Template_mj_entity_data_grid_GridStateChanged_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onGridStateChanged($event)); })("SelectionChange", function GridViewRendererComponent_Template_mj_entity_data_grid_SelectionChange_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSelectionChange($event)); })("NewButtonClick", function GridViewRendererComponent_Template_mj_entity_data_grid_NewButtonClick_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onNewButtonClick()); })("RefreshButtonClick", function GridViewRendererComponent_Template_mj_entity_data_grid_RefreshButtonClick_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onRefreshButtonClick()); })("DeleteButtonClick", function GridViewRendererComponent_Template_mj_entity_data_grid_DeleteButtonClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onDeleteButtonClick($event)); })("AddToListRequested", function GridViewRendererComponent_Template_mj_entity_data_grid_AddToListRequested_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAddToListRequested($event)); })("ForeignKeyClick", function GridViewRendererComponent_Template_mj_entity_data_grid_ForeignKeyClick_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onForeignKeyClick($event)); })("PageChange", function GridViewRendererComponent_Template_mj_entity_data_grid_PageChange_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onPageChange($event)); })("ManageColumnsRequested", function GridViewRendererComponent_Template_mj_entity_data_grid_ManageColumnsRequested_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.configureRequested.emit()); });
444
467
  i0.ɵɵelementEnd();
445
468
  i0.ɵɵconditionalCreate(2, GridViewRendererComponent_Conditional_2_Template, 1, 3, "mj-list-management-dialog", 2);
446
469
  i0.ɵɵelementStart(3, "mj-ev-confirm-dialog", 3);
@@ -486,6 +509,7 @@ export class GridViewRendererComponent extends BaseAngularComponent {
486
509
  (AddToListRequested)="onAddToListRequested($event)"
487
510
  (ForeignKeyClick)="onForeignKeyClick($event)"
488
511
  (PageChange)="onPageChange($event)"
512
+ (ManageColumnsRequested)="configureRequested.emit()"
489
513
  >
490
514
  </mj-entity-data-grid>
491
515
 
@@ -547,6 +571,8 @@ export class GridViewRendererComponent extends BaseAngularComponent {
547
571
  type: Output
548
572
  }], dataRequest: [{
549
573
  type: Output
574
+ }], configureRequested: [{
575
+ type: Output
550
576
  }], openRelatedRecordRequested: [{
551
577
  type: Output
552
578
  }], createRecordRequested: [{
@@ -555,7 +581,7 @@ export class GridViewRendererComponent extends BaseAngularComponent {
555
581
  type: ViewChild,
556
582
  args: ['grid']
557
583
  }] }); })();
558
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GridViewRendererComponent, { className: "GridViewRendererComponent", filePath: "src/lib/view-types/renderers/grid-view-renderer.component.ts", lineNumber: 183 }); })();
584
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GridViewRendererComponent, { className: "GridViewRendererComponent", filePath: "src/lib/view-types/renderers/grid-view-renderer.component.ts", lineNumber: 184 }); })();
559
585
  /**
560
586
  * Tree-shaking guard. Force-references this renderer so bundlers (ESBuild/Vite) don't drop the
561
587
  * component in builds that only mount it dynamically via the ClassFactory/descriptor. Mirrors the