@memberjunction/ng-query-viewer 6.1.0-edge.5 → 6.1.0-edge.7
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/query-data-grid/query-data-grid.component.js +1 -1
- package/dist/lib/query-data-grid/query-data-grid.component.js.map +1 -1
- package/dist/lib/query-info-panel/query-info-panel.component.js +1 -1
- package/dist/lib/query-info-panel/query-info-panel.component.js.map +1 -1
- package/dist/lib/query-parameter-form/query-parameter-form.component.js +1 -1
- package/dist/lib/query-parameter-form/query-parameter-form.component.js.map +1 -1
- package/dist/lib/query-row-detail/query-row-detail.component.js +1 -1
- package/dist/lib/query-row-detail/query-row-detail.component.js.map +1 -1
- package/dist/lib/query-viewer/query-viewer.component.js +1 -1
- package/package.json +20 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-row-detail.component.js","sourceRoot":"","sources":["../../../src/lib/query-row-detail/query-row-detail.component.ts","../../../src/lib/query-row-detail/query-row-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n ElementRef,\n HostListener\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime } from 'rxjs/operators';\nimport { MJQueryEntityExtended } from '@memberjunction/core-entities';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { QueryGridColumnConfig } from '../query-data-grid/models/query-grid-types';\n\n/**\n * Event emitted when navigating to a linked entity record\n */\nexport interface RowDetailEntityLinkEvent {\n entityName: string;\n recordId: string;\n fieldName: string;\n}\n\n/**\n * Field display configuration for the detail panel\n */\ninterface DetailField {\n name: string;\n displayName: string;\n value: unknown;\n formattedValue: string;\n sqlType: string;\n isPrimaryKey: boolean;\n isForeignKey: boolean;\n targetEntityName?: string;\n targetEntityIcon?: string;\n sourceEntityName?: string;\n isLongText: boolean;\n isExpanded: boolean;\n}\n\n/**\n * Settings key for panel width persistence\n */\nconst PANEL_WIDTH_SETTING_KEY = 'QueryViewer_RowDetailPanel_Width';\n\n/**\n * Settings key for hide empty fields preference\n */\nconst HIDE_EMPTY_FIELDS_KEY = 'QueryViewer_RowDetailPanel_HideEmptyFields';\n\n/**\n * Row detail slide-in panel component.\n * Displays a single row's data in a formatted, grouped view with entity links.\n */\n@Component({\n standalone: false,\n selector: 'mj-query-row-detail',\n templateUrl: './query-row-detail.component.html',\n styleUrls: ['./query-row-detail.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('slideIn', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate('200ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('150ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\n ])\n ])\n ]\n})\nexport class QueryRowDetailComponent implements OnInit, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _rowData: Record<string, unknown> | null = null;\n @Input()\n set RowData(value: Record<string, unknown> | null) {\n this._rowData = value;\n if (value) {\n this.buildDetailFields();\n }\n }\n get RowData(): Record<string, unknown> | null {\n return this._rowData;\n }\n\n private _columns: QueryGridColumnConfig[] = [];\n @Input()\n set Columns(value: QueryGridColumnConfig[]) {\n this._columns = value || [];\n if (this._rowData) {\n this.buildDetailFields();\n }\n }\n get Columns(): QueryGridColumnConfig[] {\n return this._columns;\n }\n\n @Input() QueryInfo: MJQueryEntityExtended | null = null;\n @Input() Visible: boolean = false;\n @Input() RowIndex: number = 0;\n @Input() TotalRows: number = 0;\n\n // ========================================\n // Outputs\n // ========================================\n\n @Output() Close = new EventEmitter<void>();\n @Output() EntityLinkClick = new EventEmitter<RowDetailEntityLinkEvent>();\n @Output() NavigateRow = new EventEmitter<'prev' | 'next'>();\n\n // ========================================\n // Internal State\n // ========================================\n\n public PrimaryKeyFields: DetailField[] = [];\n public ForeignKeyFields: DetailField[] = [];\n public RegularFields: DetailField[] = [];\n public PanelWidth: number = 400;\n public IsResizing: boolean = false;\n public HideEmptyFields: boolean = true;\n\n private destroy$ = new Subject<void>();\n private widthPersistSubject = new Subject<number>();\n private minWidth = 300;\n private maxWidth = 800;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef\n ) {\n // Debounce width persistence\n this.widthPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(width => {\n this.persistPanelWidth(width);\n });\n }\n\n ngOnInit(): void {\n this.loadPersistedWidth();\n this.loadHideEmptyFieldsPreference();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Field Building\n // ========================================\n\n private buildDetailFields(): void {\n if (!this._rowData || !this._columns.length) {\n this.PrimaryKeyFields = [];\n this.ForeignKeyFields = [];\n this.RegularFields = [];\n return;\n }\n\n const primaryKeys: DetailField[] = [];\n const foreignKeys: DetailField[] = [];\n const regular: DetailField[] = [];\n\n for (const col of this._columns) {\n const value = this._rowData[col.field];\n const field = this.buildDetailField(col, value);\n\n if (field.isPrimaryKey) {\n primaryKeys.push(field);\n } else if (field.isForeignKey) {\n foreignKeys.push(field);\n } else {\n regular.push(field);\n }\n }\n\n this.PrimaryKeyFields = primaryKeys;\n this.ForeignKeyFields = foreignKeys;\n this.RegularFields = regular;\n this.cdr.markForCheck();\n }\n\n private buildDetailField(col: QueryGridColumnConfig, value: unknown): DetailField {\n const formattedValue = this.formatValue(value, col);\n const isLongText = typeof value === 'string' && value.length > 200;\n\n return {\n name: col.field,\n displayName: col.title,\n value,\n formattedValue,\n sqlType: col.sqlBaseType,\n isPrimaryKey: col.isPrimaryKey || false,\n isForeignKey: col.isForeignKey || false,\n targetEntityName: col.targetEntityName,\n targetEntityIcon: col.targetEntityIcon,\n sourceEntityName: col.sourceEntityName,\n isLongText,\n isExpanded: false\n };\n }\n\n private formatValue(value: unknown, col: QueryGridColumnConfig): string {\n if (value === null || value === undefined) {\n return '(empty)';\n }\n\n const baseType = col.sqlBaseType.toLowerCase();\n\n // Boolean\n if (baseType === 'bit') {\n return value ? 'Yes' : 'No';\n }\n\n // Date/Time\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n let relativeTime = '';\n if (diffHours < 1) {\n relativeTime = 'just now';\n } else if (diffHours < 24) {\n relativeTime = `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n } else if (diffDays < 7) {\n relativeTime = `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n }\n\n const formatted = baseType === 'date'\n ? date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' })\n : date.toLocaleString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: 'numeric', minute: '2-digit'\n });\n\n return relativeTime ? `${formatted} • ${relativeTime}` : formatted;\n }\n\n // Numbers\n if (['int', 'bigint', 'smallint', 'tinyint'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString();\n }\n\n if (['decimal', 'numeric', 'float', 'real'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 4 });\n }\n\n if (['money', 'smallmoney'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(num);\n }\n\n // JSON detection\n const strValue = String(value);\n if (strValue.startsWith('{') || strValue.startsWith('[')) {\n try {\n JSON.parse(strValue);\n return strValue; // Will be formatted as JSON in template\n } catch {\n // Not valid JSON, continue\n }\n }\n\n return strValue;\n }\n\n // ========================================\n // User Actions\n // ========================================\n\n public onClose(): void {\n this.Close.emit();\n }\n\n public onEntityLinkClick(field: DetailField): void {\n if (field.targetEntityName && field.value != null) {\n this.EntityLinkClick.emit({\n entityName: field.targetEntityName,\n recordId: String(field.value),\n fieldName: field.name\n });\n }\n }\n\n public onNavigatePrev(): void {\n this.NavigateRow.emit('prev');\n }\n\n public onNavigateNext(): void {\n this.NavigateRow.emit('next');\n }\n\n public toggleFieldExpand(field: DetailField): void {\n field.isExpanded = !field.isExpanded;\n this.cdr.markForCheck();\n }\n\n public copyValue(field: DetailField): void {\n const textToCopy = field.value != null ? String(field.value) : '';\n navigator.clipboard.writeText(textToCopy);\n }\n\n public copyRowAsJson(): void {\n if (this._rowData) {\n const json = JSON.stringify(this._rowData, null, 2);\n navigator.clipboard.writeText(json);\n }\n }\n\n public isJson(value: string): boolean {\n if (!value || typeof value !== 'string') return false;\n const trimmed = value.trim();\n return (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'));\n }\n\n public formatJson(value: string): string {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n\n // ========================================\n // Resize Handling\n // ========================================\n\n public onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n const containerRect = this.elementRef.nativeElement.parentElement?.getBoundingClientRect();\n if (!containerRect) return;\n\n const newWidth = containerRect.right - event.clientX;\n this.PanelWidth = Math.min(Math.max(newWidth, this.minWidth), this.maxWidth);\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.IsResizing) {\n this.IsResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.widthPersistSubject.next(this.PanelWidth);\n }\n }\n\n // ========================================\n // Persistence\n // ========================================\n\n private loadPersistedWidth(): void {\n try {\n const savedWidth = UserInfoEngine.Instance.GetSetting(PANEL_WIDTH_SETTING_KEY);\n if (savedWidth) {\n const width = parseInt(savedWidth, 10);\n if (!isNaN(width) && width >= this.minWidth && width <= this.maxWidth) {\n this.PanelWidth = width;\n }\n }\n } catch (error) {\n console.error('[query-row-detail] Failed to load persisted width:', error);\n }\n }\n\n private async persistPanelWidth(width: number): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(PANEL_WIDTH_SETTING_KEY, String(width));\n } catch (error) {\n console.error('[query-row-detail] Failed to persist panel width:', error);\n }\n }\n\n private loadHideEmptyFieldsPreference(): void {\n try {\n const saved = UserInfoEngine.Instance.GetSetting(HIDE_EMPTY_FIELDS_KEY);\n if (saved !== undefined) {\n this.HideEmptyFields = saved === 'true';\n }\n } catch (error) {\n console.error('[query-row-detail] Failed to load hide empty fields preference:', error);\n }\n }\n\n private async persistHideEmptyFieldsPreference(): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(HIDE_EMPTY_FIELDS_KEY, String(this.HideEmptyFields));\n } catch (error) {\n console.error('[query-row-detail] Failed to persist hide empty fields preference:', error);\n }\n }\n\n public toggleHideEmptyFields(): void {\n this.HideEmptyFields = !this.HideEmptyFields;\n this.persistHideEmptyFieldsPreference();\n this.cdr.markForCheck();\n }\n\n /**\n * Returns visible fields based on HideEmptyFields setting\n */\n public getVisibleFields(fields: DetailField[]): DetailField[] {\n if (!this.HideEmptyFields) {\n return fields;\n }\n return fields.filter(f => f.value !== null && f.value !== undefined && f.value !== '');\n }\n\n /**\n * Returns count of empty fields for display\n */\n public getEmptyFieldCount(fields: DetailField[]): number {\n return fields.filter(f => f.value === null || f.value === undefined || f.value === '').length;\n }\n\n // ========================================\n // Keyboard Navigation\n // ========================================\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (!this.Visible) return;\n\n if (event.key === 'Escape') {\n this.onClose();\n } else if (event.key === 'ArrowUp' || event.key === 'k') {\n if (this.RowIndex > 0) {\n this.onNavigatePrev();\n }\n } else if (event.key === 'ArrowDown' || event.key === 'j') {\n if (this.RowIndex < this.TotalRows - 1) {\n this.onNavigateNext();\n }\n }\n }\n}\n","<!-- Row Detail Slide-in Panel -->\n@if (Visible) {\n <div class=\"row-detail-panel\"\n @slideIn\n [style.width.px]=\"PanelWidth\">\n <!-- Resize handle -->\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.resizing]=\"IsResizing\">\n </div>\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-table-cells-large header-icon\"></i>\n <h3 class=\"panel-title\">Row Details</h3>\n </div>\n <div class=\"header-right\">\n <!-- Row navigation -->\n @if (TotalRows > 1) {\n <div class=\"row-nav\">\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex === 0\"\n (click)=\"onNavigatePrev()\"\n title=\"Previous row (↑ or K)\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <span class=\"row-indicator\">{{ RowIndex + 1 }} / {{ TotalRows }}</span>\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex >= TotalRows - 1\"\n (click)=\"onNavigateNext()\"\n title=\"Next row (↓ or J)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n }\n <!-- Toggle empty fields -->\n <button class=\"action-btn\"\n (click)=\"toggleHideEmptyFields()\"\n [class.active]=\"HideEmptyFields\"\n [title]=\"HideEmptyFields ? 'Show empty fields' : 'Hide empty fields'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!HideEmptyFields\" [class.fa-eye-slash]=\"HideEmptyFields\"></i>\n </button>\n <!-- Copy JSON button -->\n <button class=\"action-btn\" (click)=\"copyRowAsJson()\" title=\"Copy row as JSON\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n <!-- Close button -->\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Primary Keys Section -->\n @if (getVisibleFields(PrimaryKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-key section-icon pk-icon\"></i>\n Primary Key\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(PrimaryKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <div class=\"field-value\"\n [class.clickable]=\"field.targetEntityName\"\n (click)=\"field.targetEntityName && onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n @if (field.targetEntityName) {\n <i\n class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Foreign Keys Section -->\n @if (getVisibleFields(ForeignKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-link section-icon fk-icon\"></i>\n Related Records\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(ForeignKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n @if (field.targetEntityName) {\n <span class=\"target-entity\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n {{ field.targetEntityName }}\n </span>\n }\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (field.value != null) {\n <div class=\"field-value clickable\"\n (click)=\"onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n </div>\n }\n @if (field.value == null) {\n <div class=\"field-value empty\">\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Regular Fields Section -->\n @if (getVisibleFields(RegularFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-list section-icon\"></i>\n Fields\n @if (HideEmptyFields && getEmptyFieldCount(RegularFields) > 0) {\n <span class=\"hidden-count\">\n ({{ getEmptyFieldCount(RegularFields) }} empty hidden)\n </span>\n }\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(RegularFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <span class=\"field-type\">{{ field.sqlType }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <!-- JSON value -->\n @if (isJson(field.formattedValue)) {\n <div class=\"field-value json-value\"\n [class.expanded]=\"field.isExpanded\">\n <pre class=\"json-content\">{{ formatJson(field.formattedValue) }}</pre>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Collapse' : 'Expand' }}\n </button>\n </div>\n }\n <!-- Long text value -->\n @if (!isJson(field.formattedValue) && field.isLongText) {\n <div class=\"field-value long-text\"\n [class.expanded]=\"field.isExpanded\">\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Show less' : 'Show more' }}\n </button>\n </div>\n }\n <!-- Boolean value -->\n @if (field.sqlType.toLowerCase() === 'bit' && !isJson(field.formattedValue)) {\n <div class=\"field-value boolean-value\"\n >\n <i [class]=\"field.value ? 'fa-solid fa-check-circle bool-true' : 'fa-solid fa-times-circle bool-false'\"></i>\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n </div>\n }\n <!-- Empty value -->\n @if (field.value == null && !isJson(field.formattedValue)) {\n <div class=\"field-value empty\"\n >\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n <!-- Regular value -->\n @if (field.value != null && !isJson(field.formattedValue) && !field.isLongText && field.sqlType.toLowerCase() !== 'bit') {\n <div class=\"field-value\"\n >\n <span class=\"value-text\"\n [class.monospace]=\"field.sqlType.toLowerCase().includes('uniqueidentifier') || field.name.toLowerCase().includes('id')\">\n {{ field.formattedValue }}\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n\n<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\"\n (click)=\"onClose()\">\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"query-row-detail.component.js","sourceRoot":"","sources":["../../../src/lib/query-row-detail/query-row-detail.component.ts","../../../src/lib/query-row-detail/query-row-detail.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ChangeDetectionStrategy,\n ElementRef,\n HostListener\n} from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { Subject } from 'rxjs';\nimport { takeUntil, debounceTime } from 'rxjs/operators';\nimport { MJQueryEntityExtended } from '@memberjunction/core-entities';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { QueryGridColumnConfig } from '../query-data-grid/models/query-grid-types';\n\n/**\n * Event emitted when navigating to a linked entity record\n */\nexport interface RowDetailEntityLinkEvent {\n entityName: string;\n recordId: string;\n fieldName: string;\n}\n\n/**\n * Field display configuration for the detail panel\n */\ninterface DetailField {\n name: string;\n displayName: string;\n value: unknown;\n formattedValue: string;\n sqlType: string;\n isPrimaryKey: boolean;\n isForeignKey: boolean;\n targetEntityName?: string;\n targetEntityIcon?: string;\n sourceEntityName?: string;\n isLongText: boolean;\n isExpanded: boolean;\n}\n\n/**\n * Settings key for panel width persistence\n */\nconst PANEL_WIDTH_SETTING_KEY = 'QueryViewer_RowDetailPanel_Width';\n\n/**\n * Settings key for hide empty fields preference\n */\nconst HIDE_EMPTY_FIELDS_KEY = 'QueryViewer_RowDetailPanel_HideEmptyFields';\n\n/**\n * Row detail slide-in panel component.\n * Displays a single row's data in a formatted, grouped view with entity links.\n */\n@Component({\n standalone: false,\n selector: 'mj-query-row-detail',\n templateUrl: './query-row-detail.component.html',\n styleUrls: ['./query-row-detail.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('slideIn', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate('200ms ease-out', style({ transform: 'translateX(0)', opacity: 1 }))\n ]),\n transition(':leave', [\n animate('150ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))\n ])\n ])\n ]\n})\nexport class QueryRowDetailComponent implements OnInit, OnDestroy {\n // ========================================\n // Inputs\n // ========================================\n\n private _rowData: Record<string, unknown> | null = null;\n @Input()\n set RowData(value: Record<string, unknown> | null) {\n this._rowData = value;\n if (value) {\n this.buildDetailFields();\n }\n }\n get RowData(): Record<string, unknown> | null {\n return this._rowData;\n }\n\n private _columns: QueryGridColumnConfig[] = [];\n @Input()\n set Columns(value: QueryGridColumnConfig[]) {\n this._columns = value || [];\n if (this._rowData) {\n this.buildDetailFields();\n }\n }\n get Columns(): QueryGridColumnConfig[] {\n return this._columns;\n }\n\n @Input() QueryInfo: MJQueryEntityExtended | null = null;\n @Input() Visible: boolean = false;\n @Input() RowIndex: number = 0;\n @Input() TotalRows: number = 0;\n\n // ========================================\n // Outputs\n // ========================================\n\n @Output() Close = new EventEmitter<void>();\n @Output() EntityLinkClick = new EventEmitter<RowDetailEntityLinkEvent>();\n @Output() NavigateRow = new EventEmitter<'prev' | 'next'>();\n\n // ========================================\n // Internal State\n // ========================================\n\n public PrimaryKeyFields: DetailField[] = [];\n public ForeignKeyFields: DetailField[] = [];\n public RegularFields: DetailField[] = [];\n public PanelWidth: number = 400;\n public IsResizing: boolean = false;\n public HideEmptyFields: boolean = true;\n\n private destroy$ = new Subject<void>();\n private widthPersistSubject = new Subject<number>();\n private minWidth = 300;\n private maxWidth = 800;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private elementRef: ElementRef\n ) {\n // Debounce width persistence\n this.widthPersistSubject.pipe(\n debounceTime(500),\n takeUntil(this.destroy$)\n ).subscribe(width => {\n this.persistPanelWidth(width);\n });\n }\n\n ngOnInit(): void {\n this.loadPersistedWidth();\n this.loadHideEmptyFieldsPreference();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Field Building\n // ========================================\n\n private buildDetailFields(): void {\n if (!this._rowData || !this._columns.length) {\n this.PrimaryKeyFields = [];\n this.ForeignKeyFields = [];\n this.RegularFields = [];\n return;\n }\n\n const primaryKeys: DetailField[] = [];\n const foreignKeys: DetailField[] = [];\n const regular: DetailField[] = [];\n\n for (const col of this._columns) {\n const value = this._rowData[col.field];\n const field = this.buildDetailField(col, value);\n\n if (field.isPrimaryKey) {\n primaryKeys.push(field);\n } else if (field.isForeignKey) {\n foreignKeys.push(field);\n } else {\n regular.push(field);\n }\n }\n\n this.PrimaryKeyFields = primaryKeys;\n this.ForeignKeyFields = foreignKeys;\n this.RegularFields = regular;\n this.cdr.markForCheck();\n }\n\n private buildDetailField(col: QueryGridColumnConfig, value: unknown): DetailField {\n const formattedValue = this.formatValue(value, col);\n const isLongText = typeof value === 'string' && value.length > 200;\n\n return {\n name: col.field,\n displayName: col.title,\n value,\n formattedValue,\n sqlType: col.sqlBaseType,\n isPrimaryKey: col.isPrimaryKey || false,\n isForeignKey: col.isForeignKey || false,\n targetEntityName: col.targetEntityName,\n targetEntityIcon: col.targetEntityIcon,\n sourceEntityName: col.sourceEntityName,\n isLongText,\n isExpanded: false\n };\n }\n\n private formatValue(value: unknown, col: QueryGridColumnConfig): string {\n if (value === null || value === undefined) {\n return '(empty)';\n }\n\n const baseType = col.sqlBaseType.toLowerCase();\n\n // Boolean\n if (baseType === 'bit') {\n return value ? 'Yes' : 'No';\n }\n\n // Date/Time\n if (['date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset'].includes(baseType)) {\n const date = new Date(value as string);\n if (isNaN(date.getTime())) return String(value);\n\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffHours = Math.floor(diffMs / (1000 * 60 * 60));\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n let relativeTime = '';\n if (diffHours < 1) {\n relativeTime = 'just now';\n } else if (diffHours < 24) {\n relativeTime = `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;\n } else if (diffDays < 7) {\n relativeTime = `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;\n }\n\n const formatted = baseType === 'date'\n ? date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' })\n : date.toLocaleString('en-US', {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: 'numeric', minute: '2-digit'\n });\n\n return relativeTime ? `${formatted} • ${relativeTime}` : formatted;\n }\n\n // Numbers\n if (['int', 'bigint', 'smallint', 'tinyint'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString();\n }\n\n if (['decimal', 'numeric', 'float', 'real'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 4 });\n }\n\n if (['money', 'smallmoney'].includes(baseType)) {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(num);\n }\n\n // JSON detection\n const strValue = String(value);\n if (strValue.startsWith('{') || strValue.startsWith('[')) {\n try {\n JSON.parse(strValue);\n return strValue; // Will be formatted as JSON in template\n } catch {\n // Not valid JSON, continue\n }\n }\n\n return strValue;\n }\n\n // ========================================\n // User Actions\n // ========================================\n\n public onClose(): void {\n this.Close.emit();\n }\n\n public onEntityLinkClick(field: DetailField): void {\n if (field.targetEntityName && field.value != null) {\n this.EntityLinkClick.emit({\n entityName: field.targetEntityName,\n recordId: String(field.value),\n fieldName: field.name\n });\n }\n }\n\n public onNavigatePrev(): void {\n this.NavigateRow.emit('prev');\n }\n\n public onNavigateNext(): void {\n this.NavigateRow.emit('next');\n }\n\n public toggleFieldExpand(field: DetailField): void {\n field.isExpanded = !field.isExpanded;\n this.cdr.markForCheck();\n }\n\n public copyValue(field: DetailField): void {\n const textToCopy = field.value != null ? String(field.value) : '';\n navigator.clipboard.writeText(textToCopy);\n }\n\n public copyRowAsJson(): void {\n if (this._rowData) {\n const json = JSON.stringify(this._rowData, null, 2);\n navigator.clipboard.writeText(json);\n }\n }\n\n public isJson(value: string): boolean {\n if (!value || typeof value !== 'string') return false;\n const trimmed = value.trim();\n return (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'));\n }\n\n public formatJson(value: string): string {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n\n // ========================================\n // Resize Handling\n // ========================================\n\n public onResizeStart(event: MouseEvent): void {\n event.preventDefault();\n this.IsResizing = true;\n document.body.style.cursor = 'ew-resize';\n document.body.style.userSelect = 'none';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.IsResizing) return;\n\n const containerRect = this.elementRef.nativeElement.parentElement?.getBoundingClientRect();\n if (!containerRect) return;\n\n const newWidth = containerRect.right - event.clientX;\n this.PanelWidth = Math.min(Math.max(newWidth, this.minWidth), this.maxWidth);\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.IsResizing) {\n this.IsResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.widthPersistSubject.next(this.PanelWidth);\n }\n }\n\n // ========================================\n // Persistence\n // ========================================\n\n private loadPersistedWidth(): void {\n try {\n const savedWidth = UserInfoEngine.Instance.GetSetting(PANEL_WIDTH_SETTING_KEY);\n if (savedWidth) {\n const width = parseInt(savedWidth, 10);\n if (!isNaN(width) && width >= this.minWidth && width <= this.maxWidth) {\n this.PanelWidth = width;\n }\n }\n } catch (error) {\n console.error('[query-row-detail] Failed to load persisted width:', error);\n }\n }\n\n private async persistPanelWidth(width: number): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(PANEL_WIDTH_SETTING_KEY, String(width));\n } catch (error) {\n console.error('[query-row-detail] Failed to persist panel width:', error);\n }\n }\n\n private loadHideEmptyFieldsPreference(): void {\n try {\n const saved = UserInfoEngine.Instance.GetSetting(HIDE_EMPTY_FIELDS_KEY);\n if (saved !== undefined) {\n this.HideEmptyFields = saved === 'true';\n }\n } catch (error) {\n console.error('[query-row-detail] Failed to load hide empty fields preference:', error);\n }\n }\n\n private async persistHideEmptyFieldsPreference(): Promise<void> {\n try {\n await UserInfoEngine.Instance.SetSetting(HIDE_EMPTY_FIELDS_KEY, String(this.HideEmptyFields));\n } catch (error) {\n console.error('[query-row-detail] Failed to persist hide empty fields preference:', error);\n }\n }\n\n public toggleHideEmptyFields(): void {\n this.HideEmptyFields = !this.HideEmptyFields;\n this.persistHideEmptyFieldsPreference();\n this.cdr.markForCheck();\n }\n\n /**\n * Returns visible fields based on HideEmptyFields setting\n */\n public getVisibleFields(fields: DetailField[]): DetailField[] {\n if (!this.HideEmptyFields) {\n return fields;\n }\n return fields.filter(f => f.value !== null && f.value !== undefined && f.value !== '');\n }\n\n /**\n * Returns count of empty fields for display\n */\n public getEmptyFieldCount(fields: DetailField[]): number {\n return fields.filter(f => f.value === null || f.value === undefined || f.value === '').length;\n }\n\n // ========================================\n // Keyboard Navigation\n // ========================================\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n if (!this.Visible) return;\n\n if (event.key === 'Escape') {\n this.onClose();\n } else if (event.key === 'ArrowUp' || event.key === 'k') {\n if (this.RowIndex > 0) {\n this.onNavigatePrev();\n }\n } else if (event.key === 'ArrowDown' || event.key === 'j') {\n if (this.RowIndex < this.TotalRows - 1) {\n this.onNavigateNext();\n }\n }\n }\n}\n","<!-- Row Detail Slide-in Panel -->\n@if (Visible) {\n <div class=\"row-detail-panel\"\n @slideIn\n [style.width.px]=\"PanelWidth\">\n <!-- Resize handle -->\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.resizing]=\"IsResizing\">\n </div>\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"header-left\">\n <i class=\"fa-solid fa-table-cells-large header-icon\"></i>\n <h3 class=\"panel-title\">Row Details</h3>\n </div>\n <div class=\"header-right\">\n <!-- Row navigation -->\n @if (TotalRows > 1) {\n <div class=\"row-nav\">\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex === 0\"\n (click)=\"onNavigatePrev()\"\n title=\"Previous row (↑ or K)\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <span class=\"row-indicator\">{{ RowIndex + 1 }} / {{ TotalRows }}</span>\n <button class=\"nav-btn\"\n [disabled]=\"RowIndex >= TotalRows - 1\"\n (click)=\"onNavigateNext()\"\n title=\"Next row (↓ or J)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n }\n <!-- Toggle empty fields -->\n <button class=\"action-btn\"\n (click)=\"toggleHideEmptyFields()\"\n [class.active]=\"HideEmptyFields\"\n [title]=\"HideEmptyFields ? 'Show empty fields' : 'Hide empty fields'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!HideEmptyFields\" [class.fa-eye-slash]=\"HideEmptyFields\"></i>\n </button>\n <!-- Copy JSON button -->\n <button class=\"action-btn\" (click)=\"copyRowAsJson()\" title=\"Copy row as JSON\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n <!-- Close button -->\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Primary Keys Section -->\n @if (getVisibleFields(PrimaryKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-key section-icon pk-icon\"></i>\n Primary Key\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(PrimaryKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <div class=\"field-value\"\n [class.clickable]=\"field.targetEntityName\"\n (click)=\"field.targetEntityName && onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n @if (field.targetEntityName) {\n <i\n class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Foreign Keys Section -->\n @if (getVisibleFields(ForeignKeyFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-link section-icon fk-icon\"></i>\n Related Records\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(ForeignKeyFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n @if (field.targetEntityName) {\n <span class=\"target-entity\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n {{ field.targetEntityName }}\n </span>\n }\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (field.value != null) {\n <div class=\"field-value clickable\"\n (click)=\"onEntityLinkClick(field)\">\n @if (field.targetEntityIcon) {\n <i\n [class]=\"field.targetEntityIcon\"\n class=\"entity-icon\"></i>\n }\n <span class=\"value-text monospace\">{{ field.formattedValue }}</span>\n <i class=\"fa-solid fa-arrow-up-right-from-square link-icon\"></i>\n </div>\n }\n @if (field.value == null) {\n <div class=\"field-value empty\">\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n <!-- Regular Fields Section -->\n @if (getVisibleFields(RegularFields).length > 0) {\n <div class=\"field-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-list section-icon\"></i>\n Fields\n @if (HideEmptyFields && getEmptyFieldCount(RegularFields) > 0) {\n <span class=\"hidden-count\">\n ({{ getEmptyFieldCount(RegularFields) }} empty hidden)\n </span>\n }\n </h4>\n <div class=\"field-list\">\n @for (field of getVisibleFields(RegularFields); track field) {\n <div class=\"field-item\">\n <div class=\"field-header\">\n <span class=\"field-name\">{{ field.displayName }}</span>\n <span class=\"field-type\">{{ field.sqlType }}</span>\n <button class=\"copy-btn\" (click)=\"copyValue(field)\" title=\"Copy value\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n <!-- JSON value -->\n @if (isJson(field.formattedValue)) {\n <div class=\"field-value json-value\"\n [class.expanded]=\"field.isExpanded\">\n <pre class=\"json-content\">{{ formatJson(field.formattedValue) }}</pre>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Collapse' : 'Expand' }}\n </button>\n </div>\n }\n <!-- Long text value -->\n @if (!isJson(field.formattedValue) && field.isLongText) {\n <div class=\"field-value long-text\"\n [class.expanded]=\"field.isExpanded\">\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n <button class=\"expand-btn\" (click)=\"toggleFieldExpand(field)\">\n {{ field.isExpanded ? 'Show less' : 'Show more' }}\n </button>\n </div>\n }\n <!-- Boolean value -->\n @if (field.sqlType.toLowerCase() === 'bit' && !isJson(field.formattedValue)) {\n <div class=\"field-value boolean-value\"\n >\n <i [class]=\"field.value ? 'fa-solid fa-check-circle bool-true' : 'fa-solid fa-times-circle bool-false'\"></i>\n <span class=\"value-text\">{{ field.formattedValue }}</span>\n </div>\n }\n <!-- Empty value -->\n @if (field.value == null && !isJson(field.formattedValue)) {\n <div class=\"field-value empty\"\n >\n <span class=\"value-text\">(empty)</span>\n </div>\n }\n <!-- Regular value -->\n @if (field.value != null && !isJson(field.formattedValue) && !field.isLongText && field.sqlType.toLowerCase() !== 'bit') {\n <div class=\"field-value\"\n >\n <span class=\"value-text\"\n [class.monospace]=\"field.sqlType.toLowerCase().includes('uniqueidentifier') || field.name.toLowerCase().includes('id')\">\n {{ field.formattedValue }}\n </span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n\n<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\"\n (click)=\"onClose()\">\n </div>\n}\n"]}
|
|
@@ -611,7 +611,7 @@ export class QueryViewerComponent extends BaseAngularComponent {
|
|
|
611
611
|
i0.ɵɵproperty("QueryInfo", ctx.QueryInfo)("InitialValues", ctx.SavedParams)("IsOpen", ctx.ShowParamsPanel);
|
|
612
612
|
i0.ɵɵadvance();
|
|
613
613
|
i0.ɵɵproperty("QueryInfo", ctx.QueryInfo)("Visible", ctx.ShowInfoPanel);
|
|
614
|
-
} }, dependencies: [i1.QueryDataGridComponent, i2.QueryParameterFormComponent, i3.QueryInfoPanelComponent], styles: ["\n\n
|
|
614
|
+
} }, dependencies: [i1.QueryDataGridComponent, i2.QueryParameterFormComponent, i3.QueryInfoPanelComponent], styles: ["\n\n[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.query-viewer-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n position: relative;\n overflow: hidden;\n}\n\n\n.query-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.query-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.query-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.query-category[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.query-category[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.query-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.query-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n.execution-stats[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-muted);\n padding: 4px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n}\n\n.execution-stats[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n.query-content[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n\n.no-query-state[_ngcontent-%COMP%], \n.error-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 40px;\n text-align: center;\n}\n\n.state-icon[_ngcontent-%COMP%] {\n font-size: 64px;\n color: var(--mj-border-strong);\n margin-bottom: 20px;\n}\n\n.state-icon.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.state-message[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n\n.query-description[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n font-size: 13px;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n\n.query-description[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n\n.execution-error[_ngcontent-%COMP%] {\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n font-size: 13px;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.execution-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.execution-error[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\nmj-query-data-grid[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n}\n\n\n.btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 500;\n border: 1px solid transparent;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-default);\n}\n\n\n@media (max-width: 768px) {\n .query-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .query-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-end;\n }\n}"], changeDetection: 0 });
|
|
615
615
|
}
|
|
616
616
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryViewerComponent, [{
|
|
617
617
|
type: Component,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-query-viewer",
|
|
3
|
-
"version": "6.1.0-edge.
|
|
3
|
+
"version": "6.1.0-edge.7",
|
|
4
4
|
"description": "MemberJunction: Angular components for viewing and executing stored queries with parameter input, interactive results grid, and entity linking",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -19,32 +19,32 @@
|
|
|
19
19
|
"author": "",
|
|
20
20
|
"license": "BUSL-1.1",
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@angular/compiler": "21.
|
|
23
|
-
"@angular/compiler-cli": "21.
|
|
24
|
-
"@memberjunction/ng-test-utils": "6.1.0-edge.
|
|
22
|
+
"@angular/compiler": "21.2.22",
|
|
23
|
+
"@angular/compiler-cli": "21.2.22",
|
|
24
|
+
"@memberjunction/ng-test-utils": "6.1.0-edge.7",
|
|
25
25
|
"vitest": "^4.0.18"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@angular/common": "^21.
|
|
29
|
-
"@angular/core": "^21.
|
|
30
|
-
"@angular/forms": "^21.
|
|
31
|
-
"@angular/animations": "^21.
|
|
28
|
+
"@angular/common": "^21.2.22",
|
|
29
|
+
"@angular/core": "^21.2.22",
|
|
30
|
+
"@angular/forms": "^21.2.22",
|
|
31
|
+
"@angular/animations": "^21.2.22",
|
|
32
32
|
"ag-grid-angular": "^35.0.1",
|
|
33
33
|
"ag-grid-community": "^35.0.1"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@memberjunction/ng-ui-components": "6.1.0-edge.
|
|
37
|
-
"@memberjunction/core-entities": "6.1.0-edge.
|
|
38
|
-
"@memberjunction/export-engine": "6.1.0-edge.
|
|
39
|
-
"@memberjunction/global": "6.1.0-edge.
|
|
40
|
-
"@memberjunction/core": "6.1.0-edge.
|
|
41
|
-
"@memberjunction/ng-base-types": "6.1.0-edge.
|
|
42
|
-
"@memberjunction/ng-pagination": "6.1.0-edge.
|
|
43
|
-
"@memberjunction/ng-shared-generic": "6.1.0-edge.
|
|
44
|
-
"@memberjunction/ng-export-service": "6.1.0-edge.
|
|
45
|
-
"@memberjunction/ng-markdown": "6.1.0-edge.
|
|
46
|
-
"@memberjunction/ng-code-editor": "6.1.0-edge.
|
|
47
|
-
"@memberjunction/ng-notifications": "6.1.0-edge.
|
|
36
|
+
"@memberjunction/ng-ui-components": "6.1.0-edge.7",
|
|
37
|
+
"@memberjunction/core-entities": "6.1.0-edge.7",
|
|
38
|
+
"@memberjunction/export-engine": "6.1.0-edge.7",
|
|
39
|
+
"@memberjunction/global": "6.1.0-edge.7",
|
|
40
|
+
"@memberjunction/core": "6.1.0-edge.7",
|
|
41
|
+
"@memberjunction/ng-base-types": "6.1.0-edge.7",
|
|
42
|
+
"@memberjunction/ng-pagination": "6.1.0-edge.7",
|
|
43
|
+
"@memberjunction/ng-shared-generic": "6.1.0-edge.7",
|
|
44
|
+
"@memberjunction/ng-export-service": "6.1.0-edge.7",
|
|
45
|
+
"@memberjunction/ng-markdown": "6.1.0-edge.7",
|
|
46
|
+
"@memberjunction/ng-code-editor": "6.1.0-edge.7",
|
|
47
|
+
"@memberjunction/ng-notifications": "6.1.0-edge.7",
|
|
48
48
|
"rxjs": "^7.8.2",
|
|
49
49
|
"tslib": "^2.8.1"
|
|
50
50
|
},
|