@memberjunction/ng-query-viewer 5.51.0 → 6.1.0-edge.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/dist/lib/query-data-grid/models/query-grid-types.d.ts.map +1 -1
- package/dist/lib/query-data-grid/models/query-grid-types.js +2 -1
- package/dist/lib/query-data-grid/models/query-grid-types.js.map +1 -1
- package/dist/lib/query-viewer/query-viewer.component.js +1 -2
- package/dist/lib/query-viewer/query-viewer.component.js.map +1 -1
- package/package.json +22 -20
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 MemberJunction
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-grid-types.d.ts","sourceRoot":"","sources":["../../../../src/lib/query-data-grid/models/query-grid-types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"query-grid-types.d.ts","sourceRoot":"","sources":["../../../../src/lib/query-data-grid/models/query-grid-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,7 +81,8 @@ export function resolveTargetEntity(sourceEntityName, sourceFieldName, md) {
|
|
|
81
81
|
* Builds column configs from QueryFieldInfo metadata
|
|
82
82
|
*/
|
|
83
83
|
export function buildColumnsFromQueryFields(fields, provider) {
|
|
84
|
-
|
|
84
|
+
// Metadata.Provider IS the global IMetadataProvider — no cast needed, and it names the fallback.
|
|
85
|
+
const md = provider ?? Metadata.Provider;
|
|
85
86
|
return fields
|
|
86
87
|
.sort((a, b) => (a.Sequence || 0) - (b.Sequence || 0))
|
|
87
88
|
.map((field, index) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-grid-types.js","sourceRoot":"","sources":["../../../../src/lib/query-data-grid/models/query-grid-types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Types and interfaces for the Query Data Grid component.\n * These are tailored for query results which differ from entity data:\n * - Read-only (no CRUD operations)\n * - Client-side sorting only (query SQL defines ORDER BY)\n * - No smart filter (parameters only)\n * - Support for entity linking via SourceEntityID\n */\n\nimport { IMetadataProvider, Metadata } from '@memberjunction/core';\nimport { MJQueryFieldEntity } from '@memberjunction/core-entities';\n\n// ========================================\n// Selection Mode\n// ========================================\n\n/**\n * Selection mode for the query grid\n * - 'none': No selection allowed\n * - 'single': Only one row can be selected at a time\n * - 'multiple': Multiple rows can be selected (click to toggle)\n * - 'checkbox': Checkbox column for selection\n */\nexport type QueryGridSelectionMode = 'none' | 'single' | 'multiple' | 'checkbox';\n\n// ========================================\n// Column Configuration\n// ========================================\n\n/**\n * Configuration for a query grid column\n * Derived from QueryFieldInfo metadata\n */\nexport interface QueryGridColumnConfig {\n /** Field name from query results */\n field: string;\n\n /** Display title (defaults to field name) */\n title: string;\n\n /** Description/tooltip for the column header */\n description?: string;\n\n /** Column width in pixels */\n width?: number;\n\n /** Minimum width for resizing */\n minWidth?: number;\n\n /** Maximum width for resizing */\n maxWidth?: number;\n\n /** Column is visible */\n visible: boolean;\n\n /** Column is sortable (client-side) */\n sortable: boolean;\n\n /** Column is resizable */\n resizable: boolean;\n\n /** Column is reorderable */\n reorderable: boolean;\n\n /** SQL base type for formatting */\n sqlBaseType: string;\n\n /** SQL full type for display */\n sqlFullType: string;\n\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n\n /** Order/sequence of this column */\n order: number;\n\n /** Source entity ID if this column references an entity */\n sourceEntityId?: string;\n\n /** Source entity name if this column references an entity */\n sourceEntityName?: string;\n\n /** Source field name in the entity (e.g., 'ID' for primary key) */\n sourceFieldName?: string;\n\n /** Whether this column contains linkable entity IDs */\n isEntityLink: boolean;\n\n /**\n * The entity name to navigate to when clicking the link.\n * - For primary keys: this is the source entity itself\n * - For foreign keys: this is the related entity the FK points to\n */\n targetEntityName?: string;\n\n /**\n * The entity ID to navigate to when clicking the link.\n */\n targetEntityId?: string;\n\n /**\n * Whether this field is a primary key of the source entity\n */\n isPrimaryKey?: boolean;\n\n /**\n * Whether this field is a foreign key to another entity\n */\n isForeignKey?: boolean;\n\n /**\n * Icon class for the target entity (from EntityInfo.Icon)\n * Used to display the entity's icon in the column header\n */\n targetEntityIcon?: string;\n\n /** Column pinning position */\n pinned?: 'left' | 'right' | null;\n\n /** Flex grow factor for auto-sizing */\n flex?: number;\n}\n\n// ========================================\n// Sort State\n// ========================================\n\n/**\n * Sort state for a column (client-side sorting)\n */\nexport interface QueryGridSortState {\n /** Field name being sorted */\n field: string;\n /** Sort direction */\n direction: 'asc' | 'desc';\n /** Index for multi-sort ordering */\n index: number;\n}\n\n// ========================================\n// Grid State (for persistence)\n// ========================================\n\n/**\n * Complete grid state for persistence to User Settings\n */\nexport interface QueryGridState {\n /** Column states */\n columns: Array<{\n field: string;\n width?: number;\n visible: boolean;\n order: number;\n pinned?: 'left' | 'right' | null;\n }>;\n /** Sort state (client-side) */\n sort: QueryGridSortState[];\n}\n\n// ========================================\n// Parameter State (for persistence)\n// ========================================\n\n/**\n * Parameter values for a query execution\n */\nexport interface QueryParameterValues {\n [parameterName: string]: string | number | boolean | Date | string[] | null;\n}\n\n// ========================================\n// Visual Configuration\n// ========================================\n\n/**\n * Header style preset options\n */\nexport type QueryGridHeaderStyle = 'flat' | 'elevated' | 'gradient' | 'bold';\n\n/**\n * Configuration for query grid visual appearance\n */\nexport interface QueryGridVisualConfig {\n /** Header style preset */\n headerStyle?: QueryGridHeaderStyle;\n /** Custom header background color */\n headerBackground?: string;\n /** Custom header text color */\n headerTextColor?: string;\n /** Show bottom shadow/border on header */\n headerShadow?: boolean;\n /** Enable alternating row colors (zebra striping) */\n alternateRows?: boolean;\n /** Contrast level for alternating rows */\n alternateRowContrast?: 'subtle' | 'medium' | 'strong';\n /** Enable smooth hover transitions */\n hoverTransitions?: boolean;\n /** Right-align numeric columns automatically */\n rightAlignNumbers?: boolean;\n /** Format dates with a friendly format */\n friendlyDates?: boolean;\n /** Render email cells as clickable mailto links */\n clickableEmails?: boolean;\n /** Render boolean cells as checkmark/x icons */\n booleanIcons?: boolean;\n /** Render URL cells as clickable links */\n clickableUrls?: boolean;\n /** Selection indicator color */\n selectionIndicatorColor?: string;\n /** Selection indicator width */\n selectionIndicatorWidth?: number;\n /** Selection background color */\n selectionBackground?: string;\n /** Checkbox style */\n checkboxStyle?: 'default' | 'rounded' | 'filled';\n /** Checkbox accent color */\n checkboxColor?: string;\n /** Show skeleton loading rows */\n skeletonLoading?: boolean;\n /** Number of skeleton rows */\n skeletonRowCount?: number;\n /** Border radius for container */\n borderRadius?: number;\n /** Cell padding preset */\n cellPadding?: 'compact' | 'normal' | 'comfortable';\n /** Primary accent color */\n accentColor?: string;\n}\n\n/**\n * Default visual configuration for query grid\n */\nexport const DEFAULT_QUERY_VISUAL_CONFIG: Required<QueryGridVisualConfig> = {\n headerStyle: 'elevated',\n headerBackground: '',\n headerTextColor: '',\n headerShadow: true,\n alternateRows: true,\n alternateRowContrast: 'medium',\n hoverTransitions: true,\n rightAlignNumbers: true,\n friendlyDates: true,\n clickableEmails: true,\n booleanIcons: true,\n clickableUrls: true,\n selectionIndicatorColor: '#f9a825',\n selectionIndicatorWidth: 3,\n selectionBackground: '#fff9e6',\n checkboxStyle: 'rounded',\n checkboxColor: '#2196F3',\n skeletonLoading: true,\n skeletonRowCount: 8,\n borderRadius: 0,\n cellPadding: 'normal',\n accentColor: '#2196F3'\n};\n\n// ========================================\n// Export Options\n// ========================================\n\n/**\n * Export options for query results\n */\nexport interface QueryExportOptions {\n /** Export only visible columns */\n visibleColumnsOnly?: boolean;\n /** Export only selected rows */\n selectedRowsOnly?: boolean;\n /** Include headers */\n includeHeaders?: boolean;\n /** Custom column mapping */\n columnMapping?: Record<string, string>;\n}\n\n// ========================================\n// Events\n// ========================================\n\n/**\n * Event fired when a row is clicked\n */\nexport interface QueryRowClickEvent {\n /** The row data */\n rowData: Record<string, unknown>;\n /** Row index */\n rowIndex: number;\n /** Column that was clicked */\n column?: QueryGridColumnConfig;\n /** Cell value */\n cellValue?: unknown;\n /** Original mouse event */\n mouseEvent: MouseEvent;\n}\n\n/**\n * Event fired when an entity link is clicked\n */\nexport interface QueryEntityLinkClickEvent {\n /** Entity name */\n entityName: string;\n /** Record ID (primary key value) */\n recordId: string;\n /** The column config (null if clicked from row detail panel) */\n column: QueryGridColumnConfig | null;\n /** The row data */\n rowData: Record<string, unknown>;\n}\n\n/**\n * Event fired when grid state changes\n */\nexport interface QueryGridStateChangedEvent {\n /** The new grid state */\n state: QueryGridState;\n /** What changed */\n changeType: 'column-resize' | 'column-move' | 'column-visibility' | 'sort';\n}\n\n/**\n * Event fired when selection changes\n */\nexport interface QuerySelectionChangedEvent {\n /** Selected row indices */\n selectedIndices: number[];\n /** Selected row data */\n selectedRows: Record<string, unknown>[];\n}\n\n// ========================================\n// Utility Functions\n// ========================================\n\n/**\n * Result of resolving the target entity for navigation\n */\nexport interface TargetEntityInfo {\n targetEntityName?: string;\n targetEntityId?: string;\n targetEntityIcon?: string;\n isPrimaryKey: boolean;\n isForeignKey: boolean;\n}\n\n/**\n * Determines the target entity for navigation based on source entity field metadata.\n * - If the source field is a primary key, target is the source entity itself\n * - If the source field is a foreign key, target is the related entity\n * Also retrieves the target entity's icon for display in column headers.\n */\nexport function resolveTargetEntity(\n sourceEntityName: string | undefined,\n sourceFieldName: string | undefined,\n md: IMetadataProvider\n): TargetEntityInfo {\n if (!sourceEntityName || !sourceFieldName) {\n return { isPrimaryKey: false, isForeignKey: false };\n }\n\n // Look up the source entity\n const sourceEntity = md.EntityByName(sourceEntityName);\n if (!sourceEntity) {\n return { isPrimaryKey: false, isForeignKey: false };\n }\n\n // Find the field in the source entity\n const entityField = sourceEntity.Fields.find(f => f.Name === sourceFieldName);\n if (!entityField) {\n return { isPrimaryKey: false, isForeignKey: false };\n }\n\n // Check if it's a primary key\n if (entityField.IsPrimaryKey) {\n return {\n targetEntityName: sourceEntityName,\n targetEntityId: sourceEntity.ID,\n targetEntityIcon: sourceEntity.Icon || undefined,\n isPrimaryKey: true,\n isForeignKey: false\n };\n }\n\n // Check if it's a foreign key (has RelatedEntity)\n if (entityField.RelatedEntity && entityField.RelatedEntity.trim().length > 0) {\n const relatedEntity = md.EntityByName(entityField.RelatedEntity);\n return {\n targetEntityName: entityField.RelatedEntity,\n targetEntityId: relatedEntity?.ID,\n targetEntityIcon: relatedEntity?.Icon || undefined,\n isPrimaryKey: false,\n isForeignKey: true\n };\n }\n\n return { isPrimaryKey: false, isForeignKey: false };\n}\n\n/**\n * Builds column configs from QueryFieldInfo metadata\n */\nexport function buildColumnsFromQueryFields(fields: MJQueryFieldEntity[], provider?: IMetadataProvider): QueryGridColumnConfig[] {\n const md = provider ?? (new Metadata() as unknown as IMetadataProvider);\n\n return fields\n .sort((a, b) => (a.Sequence || 0) - (b.Sequence || 0))\n .map((field, index) => {\n // Resolve the target entity using metadata\n const targetInfo = resolveTargetEntity(field.SourceEntity ?? undefined, field.SourceFieldName ?? undefined, md);\n\n // Determine if this is an entity link\n // It's linkable if we have a valid target entity (either PK or FK)\n const isEntityLink = !!(targetInfo.targetEntityName && (targetInfo.isPrimaryKey || targetInfo.isForeignKey));\n\n // Determine alignment based on type\n let align: 'left' | 'center' | 'right' = 'left';\n const baseType = (field.SQLBaseType || '').toLowerCase();\n if (['int', 'bigint', 'decimal', 'numeric', 'float', 'money', 'smallmoney', 'real'].includes(baseType)) {\n align = 'right';\n } else if (['bit'].includes(baseType)) {\n align = 'center';\n }\n\n return {\n field: field.Name,\n title: field.Name, // Could be enhanced to parse CamelCase\n description: field.Description || undefined,\n width: undefined,\n minWidth: 80,\n maxWidth: undefined, // No max width limit - let users resize freely\n visible: true,\n sortable: true,\n resizable: true,\n reorderable: true,\n sqlBaseType: field.SQLBaseType || 'nvarchar',\n sqlFullType: field.SQLFullType || 'nvarchar(max)',\n align,\n order: index,\n sourceEntityId: field.SourceEntityID || undefined,\n sourceEntityName: field.SourceEntity || undefined,\n sourceFieldName: field.SourceFieldName || undefined,\n isEntityLink,\n targetEntityName: targetInfo.targetEntityName,\n targetEntityId: targetInfo.targetEntityId,\n isPrimaryKey: targetInfo.isPrimaryKey,\n isForeignKey: targetInfo.isForeignKey,\n targetEntityIcon: targetInfo.targetEntityIcon,\n pinned: null,\n flex: undefined\n };\n });\n}\n\n/**\n * Gets the User Settings key for query grid state\n */\nexport function getQueryGridStateKey(queryId: string): string {\n return `QueryViewer_${queryId}_GridState`;\n}\n\n/**\n * Gets the User Settings key for query parameters\n */\nexport function getQueryParamsKey(queryId: string): string {\n return `QueryViewer_${queryId}_LastParams`;\n}\n\n/**\n * Infers column configuration from actual data when query has no field metadata.\n * Examines the first row to determine column names and types.\n */\nexport function buildColumnsFromData(data: Record<string, unknown>[]): QueryGridColumnConfig[] {\n if (!data || data.length === 0) {\n return [];\n }\n\n // Get column names from first row\n const firstRow = data[0];\n const columnNames = Object.keys(firstRow);\n\n return columnNames.map((name, index) => {\n // Infer type from value\n const value = firstRow[name];\n let sqlBaseType = 'nvarchar';\n let align: 'left' | 'center' | 'right' = 'left';\n\n if (typeof value === 'number') {\n sqlBaseType = Number.isInteger(value) ? 'int' : 'decimal';\n align = 'right';\n } else if (typeof value === 'boolean') {\n sqlBaseType = 'bit';\n align = 'center';\n } else if (value instanceof Date) {\n sqlBaseType = 'datetime';\n } else if (typeof value === 'string') {\n // Check if it looks like a date\n const datePattern = /^\\d{4}-\\d{2}-\\d{2}/;\n if (datePattern.test(value)) {\n sqlBaseType = 'datetime';\n }\n }\n\n return {\n field: name,\n title: name,\n description: undefined,\n width: undefined,\n minWidth: 80,\n maxWidth: undefined,\n visible: true,\n sortable: true,\n resizable: true,\n reorderable: true,\n sqlBaseType,\n sqlFullType: sqlBaseType,\n align,\n order: index,\n sourceEntityId: undefined,\n sourceEntityName: undefined,\n sourceFieldName: undefined,\n isEntityLink: false,\n targetEntityName: undefined,\n targetEntityId: undefined,\n isPrimaryKey: false,\n isForeignKey: false,\n targetEntityIcon: undefined,\n pinned: null,\n flex: undefined\n };\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"query-grid-types.js","sourceRoot":"","sources":["../../../../src/lib/query-data-grid/models/query-grid-types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Types and interfaces for the Query Data Grid component.\n * These are tailored for query results which differ from entity data:\n * - Read-only (no CRUD operations)\n * - Client-side sorting only (query SQL defines ORDER BY)\n * - No smart filter (parameters only)\n * - Support for entity linking via SourceEntityID\n */\n\nimport { IMetadataProvider, Metadata } from '@memberjunction/core';\nimport { MJQueryFieldEntity } from '@memberjunction/core-entities';\n\n// ========================================\n// Selection Mode\n// ========================================\n\n/**\n * Selection mode for the query grid\n * - 'none': No selection allowed\n * - 'single': Only one row can be selected at a time\n * - 'multiple': Multiple rows can be selected (click to toggle)\n * - 'checkbox': Checkbox column for selection\n */\nexport type QueryGridSelectionMode = 'none' | 'single' | 'multiple' | 'checkbox';\n\n// ========================================\n// Column Configuration\n// ========================================\n\n/**\n * Configuration for a query grid column\n * Derived from QueryFieldInfo metadata\n */\nexport interface QueryGridColumnConfig {\n /** Field name from query results */\n field: string;\n\n /** Display title (defaults to field name) */\n title: string;\n\n /** Description/tooltip for the column header */\n description?: string;\n\n /** Column width in pixels */\n width?: number;\n\n /** Minimum width for resizing */\n minWidth?: number;\n\n /** Maximum width for resizing */\n maxWidth?: number;\n\n /** Column is visible */\n visible: boolean;\n\n /** Column is sortable (client-side) */\n sortable: boolean;\n\n /** Column is resizable */\n resizable: boolean;\n\n /** Column is reorderable */\n reorderable: boolean;\n\n /** SQL base type for formatting */\n sqlBaseType: string;\n\n /** SQL full type for display */\n sqlFullType: string;\n\n /** Text alignment */\n align?: 'left' | 'center' | 'right';\n\n /** Order/sequence of this column */\n order: number;\n\n /** Source entity ID if this column references an entity */\n sourceEntityId?: string;\n\n /** Source entity name if this column references an entity */\n sourceEntityName?: string;\n\n /** Source field name in the entity (e.g., 'ID' for primary key) */\n sourceFieldName?: string;\n\n /** Whether this column contains linkable entity IDs */\n isEntityLink: boolean;\n\n /**\n * The entity name to navigate to when clicking the link.\n * - For primary keys: this is the source entity itself\n * - For foreign keys: this is the related entity the FK points to\n */\n targetEntityName?: string;\n\n /**\n * The entity ID to navigate to when clicking the link.\n */\n targetEntityId?: string;\n\n /**\n * Whether this field is a primary key of the source entity\n */\n isPrimaryKey?: boolean;\n\n /**\n * Whether this field is a foreign key to another entity\n */\n isForeignKey?: boolean;\n\n /**\n * Icon class for the target entity (from EntityInfo.Icon)\n * Used to display the entity's icon in the column header\n */\n targetEntityIcon?: string;\n\n /** Column pinning position */\n pinned?: 'left' | 'right' | null;\n\n /** Flex grow factor for auto-sizing */\n flex?: number;\n}\n\n// ========================================\n// Sort State\n// ========================================\n\n/**\n * Sort state for a column (client-side sorting)\n */\nexport interface QueryGridSortState {\n /** Field name being sorted */\n field: string;\n /** Sort direction */\n direction: 'asc' | 'desc';\n /** Index for multi-sort ordering */\n index: number;\n}\n\n// ========================================\n// Grid State (for persistence)\n// ========================================\n\n/**\n * Complete grid state for persistence to User Settings\n */\nexport interface QueryGridState {\n /** Column states */\n columns: Array<{\n field: string;\n width?: number;\n visible: boolean;\n order: number;\n pinned?: 'left' | 'right' | null;\n }>;\n /** Sort state (client-side) */\n sort: QueryGridSortState[];\n}\n\n// ========================================\n// Parameter State (for persistence)\n// ========================================\n\n/**\n * Parameter values for a query execution\n */\nexport interface QueryParameterValues {\n [parameterName: string]: string | number | boolean | Date | string[] | null;\n}\n\n// ========================================\n// Visual Configuration\n// ========================================\n\n/**\n * Header style preset options\n */\nexport type QueryGridHeaderStyle = 'flat' | 'elevated' | 'gradient' | 'bold';\n\n/**\n * Configuration for query grid visual appearance\n */\nexport interface QueryGridVisualConfig {\n /** Header style preset */\n headerStyle?: QueryGridHeaderStyle;\n /** Custom header background color */\n headerBackground?: string;\n /** Custom header text color */\n headerTextColor?: string;\n /** Show bottom shadow/border on header */\n headerShadow?: boolean;\n /** Enable alternating row colors (zebra striping) */\n alternateRows?: boolean;\n /** Contrast level for alternating rows */\n alternateRowContrast?: 'subtle' | 'medium' | 'strong';\n /** Enable smooth hover transitions */\n hoverTransitions?: boolean;\n /** Right-align numeric columns automatically */\n rightAlignNumbers?: boolean;\n /** Format dates with a friendly format */\n friendlyDates?: boolean;\n /** Render email cells as clickable mailto links */\n clickableEmails?: boolean;\n /** Render boolean cells as checkmark/x icons */\n booleanIcons?: boolean;\n /** Render URL cells as clickable links */\n clickableUrls?: boolean;\n /** Selection indicator color */\n selectionIndicatorColor?: string;\n /** Selection indicator width */\n selectionIndicatorWidth?: number;\n /** Selection background color */\n selectionBackground?: string;\n /** Checkbox style */\n checkboxStyle?: 'default' | 'rounded' | 'filled';\n /** Checkbox accent color */\n checkboxColor?: string;\n /** Show skeleton loading rows */\n skeletonLoading?: boolean;\n /** Number of skeleton rows */\n skeletonRowCount?: number;\n /** Border radius for container */\n borderRadius?: number;\n /** Cell padding preset */\n cellPadding?: 'compact' | 'normal' | 'comfortable';\n /** Primary accent color */\n accentColor?: string;\n}\n\n/**\n * Default visual configuration for query grid\n */\nexport const DEFAULT_QUERY_VISUAL_CONFIG: Required<QueryGridVisualConfig> = {\n headerStyle: 'elevated',\n headerBackground: '',\n headerTextColor: '',\n headerShadow: true,\n alternateRows: true,\n alternateRowContrast: 'medium',\n hoverTransitions: true,\n rightAlignNumbers: true,\n friendlyDates: true,\n clickableEmails: true,\n booleanIcons: true,\n clickableUrls: true,\n selectionIndicatorColor: '#f9a825',\n selectionIndicatorWidth: 3,\n selectionBackground: '#fff9e6',\n checkboxStyle: 'rounded',\n checkboxColor: '#2196F3',\n skeletonLoading: true,\n skeletonRowCount: 8,\n borderRadius: 0,\n cellPadding: 'normal',\n accentColor: '#2196F3'\n};\n\n// ========================================\n// Export Options\n// ========================================\n\n/**\n * Export options for query results\n */\nexport interface QueryExportOptions {\n /** Export only visible columns */\n visibleColumnsOnly?: boolean;\n /** Export only selected rows */\n selectedRowsOnly?: boolean;\n /** Include headers */\n includeHeaders?: boolean;\n /** Custom column mapping */\n columnMapping?: Record<string, string>;\n}\n\n// ========================================\n// Events\n// ========================================\n\n/**\n * Event fired when a row is clicked\n */\nexport interface QueryRowClickEvent {\n /** The row data */\n rowData: Record<string, unknown>;\n /** Row index */\n rowIndex: number;\n /** Column that was clicked */\n column?: QueryGridColumnConfig;\n /** Cell value */\n cellValue?: unknown;\n /** Original mouse event */\n mouseEvent: MouseEvent;\n}\n\n/**\n * Event fired when an entity link is clicked\n */\nexport interface QueryEntityLinkClickEvent {\n /** Entity name */\n entityName: string;\n /** Record ID (primary key value) */\n recordId: string;\n /** The column config (null if clicked from row detail panel) */\n column: QueryGridColumnConfig | null;\n /** The row data */\n rowData: Record<string, unknown>;\n}\n\n/**\n * Event fired when grid state changes\n */\nexport interface QueryGridStateChangedEvent {\n /** The new grid state */\n state: QueryGridState;\n /** What changed */\n changeType: 'column-resize' | 'column-move' | 'column-visibility' | 'sort';\n}\n\n/**\n * Event fired when selection changes\n */\nexport interface QuerySelectionChangedEvent {\n /** Selected row indices */\n selectedIndices: number[];\n /** Selected row data */\n selectedRows: Record<string, unknown>[];\n}\n\n// ========================================\n// Utility Functions\n// ========================================\n\n/**\n * Result of resolving the target entity for navigation\n */\nexport interface TargetEntityInfo {\n targetEntityName?: string;\n targetEntityId?: string;\n targetEntityIcon?: string;\n isPrimaryKey: boolean;\n isForeignKey: boolean;\n}\n\n/**\n * Determines the target entity for navigation based on source entity field metadata.\n * - If the source field is a primary key, target is the source entity itself\n * - If the source field is a foreign key, target is the related entity\n * Also retrieves the target entity's icon for display in column headers.\n */\nexport function resolveTargetEntity(\n sourceEntityName: string | undefined,\n sourceFieldName: string | undefined,\n md: IMetadataProvider\n): TargetEntityInfo {\n if (!sourceEntityName || !sourceFieldName) {\n return { isPrimaryKey: false, isForeignKey: false };\n }\n\n // Look up the source entity\n const sourceEntity = md.EntityByName(sourceEntityName);\n if (!sourceEntity) {\n return { isPrimaryKey: false, isForeignKey: false };\n }\n\n // Find the field in the source entity\n const entityField = sourceEntity.Fields.find(f => f.Name === sourceFieldName);\n if (!entityField) {\n return { isPrimaryKey: false, isForeignKey: false };\n }\n\n // Check if it's a primary key\n if (entityField.IsPrimaryKey) {\n return {\n targetEntityName: sourceEntityName,\n targetEntityId: sourceEntity.ID,\n targetEntityIcon: sourceEntity.Icon || undefined,\n isPrimaryKey: true,\n isForeignKey: false\n };\n }\n\n // Check if it's a foreign key (has RelatedEntity)\n if (entityField.RelatedEntity && entityField.RelatedEntity.trim().length > 0) {\n const relatedEntity = md.EntityByName(entityField.RelatedEntity);\n return {\n targetEntityName: entityField.RelatedEntity,\n targetEntityId: relatedEntity?.ID,\n targetEntityIcon: relatedEntity?.Icon || undefined,\n isPrimaryKey: false,\n isForeignKey: true\n };\n }\n\n return { isPrimaryKey: false, isForeignKey: false };\n}\n\n/**\n * Builds column configs from QueryFieldInfo metadata\n */\nexport function buildColumnsFromQueryFields(fields: MJQueryFieldEntity[], provider?: IMetadataProvider): QueryGridColumnConfig[] {\n // Metadata.Provider IS the global IMetadataProvider — no cast needed, and it names the fallback.\n const md = provider ?? Metadata.Provider;\n\n return fields\n .sort((a, b) => (a.Sequence || 0) - (b.Sequence || 0))\n .map((field, index) => {\n // Resolve the target entity using metadata\n const targetInfo = resolveTargetEntity(field.SourceEntity ?? undefined, field.SourceFieldName ?? undefined, md);\n\n // Determine if this is an entity link\n // It's linkable if we have a valid target entity (either PK or FK)\n const isEntityLink = !!(targetInfo.targetEntityName && (targetInfo.isPrimaryKey || targetInfo.isForeignKey));\n\n // Determine alignment based on type\n let align: 'left' | 'center' | 'right' = 'left';\n const baseType = (field.SQLBaseType || '').toLowerCase();\n if (['int', 'bigint', 'decimal', 'numeric', 'float', 'money', 'smallmoney', 'real'].includes(baseType)) {\n align = 'right';\n } else if (['bit'].includes(baseType)) {\n align = 'center';\n }\n\n return {\n field: field.Name,\n title: field.Name, // Could be enhanced to parse CamelCase\n description: field.Description || undefined,\n width: undefined,\n minWidth: 80,\n maxWidth: undefined, // No max width limit - let users resize freely\n visible: true,\n sortable: true,\n resizable: true,\n reorderable: true,\n sqlBaseType: field.SQLBaseType || 'nvarchar',\n sqlFullType: field.SQLFullType || 'nvarchar(max)',\n align,\n order: index,\n sourceEntityId: field.SourceEntityID || undefined,\n sourceEntityName: field.SourceEntity || undefined,\n sourceFieldName: field.SourceFieldName || undefined,\n isEntityLink,\n targetEntityName: targetInfo.targetEntityName,\n targetEntityId: targetInfo.targetEntityId,\n isPrimaryKey: targetInfo.isPrimaryKey,\n isForeignKey: targetInfo.isForeignKey,\n targetEntityIcon: targetInfo.targetEntityIcon,\n pinned: null,\n flex: undefined\n };\n });\n}\n\n/**\n * Gets the User Settings key for query grid state\n */\nexport function getQueryGridStateKey(queryId: string): string {\n return `QueryViewer_${queryId}_GridState`;\n}\n\n/**\n * Gets the User Settings key for query parameters\n */\nexport function getQueryParamsKey(queryId: string): string {\n return `QueryViewer_${queryId}_LastParams`;\n}\n\n/**\n * Infers column configuration from actual data when query has no field metadata.\n * Examines the first row to determine column names and types.\n */\nexport function buildColumnsFromData(data: Record<string, unknown>[]): QueryGridColumnConfig[] {\n if (!data || data.length === 0) {\n return [];\n }\n\n // Get column names from first row\n const firstRow = data[0];\n const columnNames = Object.keys(firstRow);\n\n return columnNames.map((name, index) => {\n // Infer type from value\n const value = firstRow[name];\n let sqlBaseType = 'nvarchar';\n let align: 'left' | 'center' | 'right' = 'left';\n\n if (typeof value === 'number') {\n sqlBaseType = Number.isInteger(value) ? 'int' : 'decimal';\n align = 'right';\n } else if (typeof value === 'boolean') {\n sqlBaseType = 'bit';\n align = 'center';\n } else if (value instanceof Date) {\n sqlBaseType = 'datetime';\n } else if (typeof value === 'string') {\n // Check if it looks like a date\n const datePattern = /^\\d{4}-\\d{2}-\\d{2}/;\n if (datePattern.test(value)) {\n sqlBaseType = 'datetime';\n }\n }\n\n return {\n field: name,\n title: name,\n description: undefined,\n width: undefined,\n minWidth: 80,\n maxWidth: undefined,\n visible: true,\n sortable: true,\n resizable: true,\n reorderable: true,\n sqlBaseType,\n sqlFullType: sqlBaseType,\n align,\n order: index,\n sourceEntityId: undefined,\n sourceEntityName: undefined,\n sourceFieldName: undefined,\n isEntityLink: false,\n targetEntityName: undefined,\n targetEntityId: undefined,\n isPrimaryKey: false,\n isForeignKey: false,\n targetEntityIcon: undefined,\n pinned: null,\n flex: undefined\n };\n });\n}\n"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewChild } from '@angular/core';
|
|
2
2
|
import { Subject } from 'rxjs';
|
|
3
|
-
import { RunQuery } from '@memberjunction/core';
|
|
4
3
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
5
4
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
6
5
|
import { QueryEngine } from '@memberjunction/core-entities';
|
|
@@ -401,7 +400,7 @@ export class QueryViewerComponent extends BaseAngularComponent {
|
|
|
401
400
|
await this.saveParameters(normalizedParams);
|
|
402
401
|
const startTime = performance.now();
|
|
403
402
|
try {
|
|
404
|
-
const runQuery =
|
|
403
|
+
const runQuery = this.RunQueryToUse;
|
|
405
404
|
const runParams = {
|
|
406
405
|
QueryID: this._queryId,
|
|
407
406
|
Parameters: normalizedParams
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/query-viewer/query-viewer.component.ts","../../../src/lib/query-viewer/query-viewer.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 ViewChild\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RunQuery, RunQueryParams, RunQueryResult } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJQueryEntityExtended, QueryEngine } from '@memberjunction/core-entities';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\nimport { QueryDataGridComponent } from '../query-data-grid/query-data-grid.component';\nimport {\n QueryGridSelectionMode,\n QueryGridState,\n QueryGridVisualConfig,\n QueryParameterValues,\n QueryEntityLinkClickEvent,\n QueryGridStateChangedEvent,\n QuerySelectionChangedEvent,\n QueryRowClickEvent,\n getQueryGridStateKey,\n getQueryParamsKey\n} from '../query-data-grid/models/query-grid-types';\n\n/**\n * A composite component that provides a complete query viewing experience.\n * Features:\n * - Automatic parameter form display when query has parameters\n * - Grid state persistence to User Settings\n * - Parameter persistence to User Settings\n * - Entity linking for clickable record IDs\n * - Auto-run capability when all required params have saved values\n *\n * @example\n * ```html\n * <mj-query-viewer\n * [QueryId]=\"selectedQueryId\"\n * [AutoRun]=\"true\"\n * (EntityLinkClick)=\"openRecord($event)\">\n * </mj-query-viewer>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-query-viewer',\n templateUrl: './query-viewer.component.html',\n styleUrls: ['./query-viewer.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryViewerComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * Safety cap for the export path — deliberately large (exports should cover the full result set)\n * but bounded to protect the browser from an unbounded query. Kept in lockstep with the\n * entity-viewer's EXPORT_MAX_RECORDS so Export behaves the same across Queries and Data Explorer.\n */\n private static readonly EXPORT_MAX_RECORDS = 100000;\n\n // ========================================\n // Inputs\n // ========================================\n\n private _queryId: string | null = null;\n /**\n * The ID of the query to display\n */\n @Input()\n set QueryId(value: string | null) {\n const previous = this._queryId;\n this._queryId = value;\n if (value !== previous) {\n this.onQueryIdChanged();\n }\n }\n get QueryId(): string | null {\n return this._queryId;\n }\n\n /**\n * Whether to auto-run the query when all required params have saved values\n */\n @Input() AutoRun: boolean = true;\n\n /**\n * Selection mode for the grid\n */\n @Input() SelectionMode: QueryGridSelectionMode = 'single';\n\n /**\n * Whether to show the toolbar\n */\n @Input() ShowToolbar: boolean = true;\n\n /**\n * Visual configuration for the grid\n */\n @Input() VisualConfig: QueryGridVisualConfig = {};\n\n /**\n * Whether to persist grid state\n */\n @Input() PersistState: boolean = true;\n\n /**\n * Whether to persist parameter values\n */\n @Input() PersistParameters: boolean = true;\n\n /**\n * Number of rows per page for server-side paging.\n * Set to 0 to disable paging and load all rows at once.\n */\n @Input() PageSize: number = 100;\n\n // ========================================\n // Outputs\n // ========================================\n\n /**\n * Fired when an entity link is clicked in the grid\n */\n @Output() EntityLinkClick = new EventEmitter<QueryEntityLinkClickEvent>();\n\n /**\n * Fired when a row is double-clicked\n */\n @Output() RowDoubleClick = new EventEmitter<QueryRowClickEvent>();\n\n /**\n * Fired when selection changes\n */\n @Output() SelectionChange = new EventEmitter<QuerySelectionChangedEvent>();\n\n /**\n * Fired when query execution starts\n */\n @Output() QueryStart = new EventEmitter<void>();\n\n /**\n * Fired when query execution completes\n */\n @Output() QueryComplete = new EventEmitter<RunQueryResult>();\n\n /**\n * Fired when query execution fails\n */\n @Output() QueryError = new EventEmitter<Error>();\n\n /**\n * Fired when user wants to open the full query record\n */\n @Output() OpenQueryRecord = new EventEmitter<{ queryId: string; queryName: string }>();\n\n /**\n * Fired when a composition token ({{query:\"...\"}}) is clicked in the SQL info panel\n */\n @Output() CompositionTokenClick = new EventEmitter<CompositionTokenClickEvent>();\n\n // ========================================\n // View Children\n // ========================================\n\n @ViewChild(QueryDataGridComponent) DataGrid!: QueryDataGridComponent;\n\n // ========================================\n // Internal State\n // ========================================\n\n public QueryInfo: MJQueryEntityExtended | null = null;\n public QueryData: Record<string, unknown>[] = [];\n public IsLoading: boolean = false;\n public ShowParamsPanel: boolean = false;\n public ShowInfoPanel: boolean = false;\n public HasRun: boolean = false;\n public LastError: string | null = null;\n public ExecutionTimeMs: number | null = null;\n\n public SavedGridState: QueryGridState | null = null;\n public SavedParams: QueryParameterValues = {};\n\n /** Paging state */\n public QueryTotalRowCount: number = 0;\n public CurrentPageNumber: number = 1;\n\n private destroy$ = new Subject<void>();\n private userInfoEngine = UserInfoEngine.Instance;\n\n constructor(private cdr: ChangeDetectorRef) { super(); }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Query Loading\n // ========================================\n\n private async onQueryIdChanged(): Promise<void> {\n // Reset state\n this.QueryInfo = null;\n this.QueryData = [];\n this.HasRun = false;\n this.LastError = null;\n this.ExecutionTimeMs = null;\n this.SavedGridState = null;\n this.SavedParams = {};\n this.ShowParamsPanel = false;\n this.QueryTotalRowCount = 0;\n this.CurrentPageNumber = 1;\n this.cdr.markForCheck();\n\n if (!this._queryId) {\n return;\n }\n\n // Load query info from metadata\n this.QueryInfo = QueryEngine.Instance.Queries.find(q => UUIDsEqual(q.ID, this._queryId)) || null;\n\n if (!this.QueryInfo) {\n this.LastError = `Query with ID ${this._queryId} not found`;\n this.cdr.markForCheck();\n return;\n }\n\n // Load saved state from User Settings\n await this.loadSavedState();\n\n // Determine if we should show params or auto-run\n const hasParams = this.QueryInfo.QueryParameters && this.QueryInfo.QueryParameters.length > 0;\n const hasRequiredParams = hasParams && this.QueryInfo.QueryParameters.some(p => p.IsRequired);\n\n if (hasParams) {\n // Check if all required params have saved values\n const canAutoRun = this.AutoRun && this.canAutoRunWithSavedParams();\n\n if (canAutoRun) {\n // Auto-run with saved parameters\n await this.RunQuery(this.SavedParams);\n } else {\n // Show parameter panel\n this.ShowParamsPanel = true;\n }\n } else {\n // No parameters - auto-run immediately\n await this.RunQuery({});\n }\n\n this.cdr.markForCheck();\n }\n\n private canAutoRunWithSavedParams(): boolean {\n if (!this.QueryInfo) return false;\n\n const requiredParams = this.QueryInfo.QueryParameters?.filter(p => p.IsRequired) || [];\n\n for (const param of requiredParams) {\n const savedValue = this.SavedParams[param.Name];\n if (savedValue === null || savedValue === undefined || savedValue === '') {\n return false;\n }\n if (param.Type === 'array' && Array.isArray(savedValue) && savedValue.length === 0) {\n return false;\n }\n }\n\n return true;\n }\n\n // ========================================\n // State Persistence\n // ========================================\n\n private async loadSavedState(): Promise<void> {\n if (!this._queryId) return;\n\n try {\n // Load grid state\n if (this.PersistState) {\n const gridStateKey = getQueryGridStateKey(this._queryId);\n const gridStateSetting = await this.getUserSetting(gridStateKey);\n if (gridStateSetting) {\n this.SavedGridState = JSON.parse(gridStateSetting) as QueryGridState;\n }\n }\n\n // Load saved parameters\n if (this.PersistParameters) {\n const paramsKey = getQueryParamsKey(this._queryId);\n const paramsSetting = await this.getUserSetting(paramsKey);\n if (paramsSetting) {\n this.SavedParams = JSON.parse(paramsSetting) as QueryParameterValues;\n }\n }\n } catch (error) {\n console.warn('Error loading saved query state:', error);\n }\n }\n\n private async saveGridState(state: QueryGridState): Promise<void> {\n if (!this._queryId || !this.PersistState) return;\n\n try {\n const key = getQueryGridStateKey(this._queryId);\n await this.setUserSetting(key, JSON.stringify(state));\n } catch (error) {\n console.warn('Error saving grid state:', error);\n }\n }\n\n private async saveParameters(params: QueryParameterValues): Promise<void> {\n if (!this._queryId || !this.PersistParameters) return;\n\n try {\n const key = getQueryParamsKey(this._queryId);\n await this.setUserSetting(key, JSON.stringify(params));\n } catch (error) {\n console.warn('Error saving parameters:', error);\n }\n }\n\n private async getUserSetting(key: string): Promise<string | undefined> {\n return this.userInfoEngine.GetSetting(key);\n }\n\n private async setUserSetting(key: string, value: string): Promise<void> {\n await this.userInfoEngine.SetSetting(key, value);\n }\n\n // ========================================\n // Query Execution\n // ========================================\n\n public async RunQuery(params: QueryParameterValues, pageNumber: number = 1): Promise<void> {\n if (!this.QueryInfo || !this._queryId) return;\n\n // Normalize array parameters: saved state or callers may pass arrays\n // with JSON fragment strings (e.g. ['[\"A\"', '\"B\"]']) from the old\n // comma-split bug. Re-join and re-parse to clean them up.\n const normalizedParams = this.normalizeArrayParams(params);\n\n this.IsLoading = true;\n this.LastError = null;\n this.QueryStart.emit();\n this.cdr.markForCheck();\n\n // Save normalized parameters for next time\n this.SavedParams = normalizedParams;\n await this.saveParameters(normalizedParams);\n\n const startTime = performance.now();\n\n try {\n const runQuery = new RunQuery();\n const runParams: RunQueryParams = {\n QueryID: this._queryId,\n Parameters: normalizedParams as Record<string, unknown>\n };\n\n // Add server-side paging when PageSize > 0\n if (this.PageSize > 0) {\n runParams.MaxRows = this.PageSize;\n runParams.StartRow = (pageNumber - 1) * this.PageSize;\n }\n\n const result = await runQuery.RunQuery(runParams);\n\n this.ExecutionTimeMs = Math.round(performance.now() - startTime);\n\n if (result.Success) {\n this.QueryData = result.Results || [];\n this.HasRun = true;\n this.ShowParamsPanel = false;\n\n // Update paging state from result\n this.QueryTotalRowCount = result.TotalRowCount;\n this.CurrentPageNumber = result.PageNumber ?? pageNumber;\n\n this.QueryComplete.emit(result);\n } else {\n this.LastError = result.ErrorMessage || 'Query execution failed';\n this.QueryError.emit(new Error(this.LastError));\n MJNotificationService.Instance.CreateSimpleNotification(\n this.LastError,\n 'error',\n 5000\n );\n }\n } catch (error) {\n this.ExecutionTimeMs = Math.round(performance.now() - startTime);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.LastError = errorMessage;\n this.QueryError.emit(error instanceof Error ? error : new Error(errorMessage));\n MJNotificationService.Instance.CreateSimpleNotification(\n `Error running query: ${errorMessage}`,\n 'error',\n 5000\n );\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Fetches the FULL result set for the current query, used by the grid's export flow so exports\n * aren't capped at the on-screen page (bug B3). Bound as an arrow property so it can be passed to\n * the grid's ExportDataProvider input without losing `this`. Loads up to {@link EXPORT_MAX_RECORDS}\n * (kept in lockstep with the entity-viewer's export cap) and warns — rather than silently\n * truncating — when the query returns more. Uses the provider-scoped RunQuery so it targets the\n * correct server in multi-provider setups. Falls back to the currently-loaded page on failure.\n */\n public FetchAllRowsForExport = async (): Promise<Record<string, unknown>[]> => {\n if (!this._queryId) {\n return this.QueryData;\n }\n try {\n // MaxRows caps the pull to protect the browser from an unbounded query; StartRow 0 = from\n // the top. This is a much larger window than the on-screen page, so export covers the set.\n const result = await this.RunQueryToUse.RunQuery({\n QueryID: this._queryId,\n Parameters: this.SavedParams as Record<string, unknown>,\n MaxRows: QueryViewerComponent.EXPORT_MAX_RECORDS,\n StartRow: 0\n });\n if (result.Success) {\n if (result.TotalRowCount > QueryViewerComponent.EXPORT_MAX_RECORDS) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `This export is limited to the first ${QueryViewerComponent.EXPORT_MAX_RECORDS.toLocaleString()} of ` +\n `${result.TotalRowCount.toLocaleString()} rows. Refine the query to include the rest.`,\n 'warning',\n 6000\n );\n }\n return result.Results || [];\n }\n } catch {\n // Fall through to the loaded page.\n }\n return this.QueryData;\n };\n\n // ========================================\n // Event Handlers\n // ========================================\n\n public OnParametersSubmit(params: QueryParameterValues): void {\n this.RunQuery(params);\n }\n\n public OnParamsPanelClose(): void {\n this.ShowParamsPanel = false;\n this.cdr.markForCheck();\n }\n\n public OnGridStateChange(event: QueryGridStateChangedEvent): void {\n this.saveGridState(event.state);\n }\n\n public OnEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n this.EntityLinkClick.emit(event);\n }\n\n public OnRowDoubleClick(event: QueryRowClickEvent): void {\n this.RowDoubleClick.emit(event);\n }\n\n public OnSelectionChange(event: QuerySelectionChangedEvent): void {\n this.SelectionChange.emit(event);\n }\n\n public OnPageChange(event: PageChangeEvent): void {\n this.RunQuery(this.SavedParams, event.PageNumber);\n }\n\n public OnRefreshRequest(): void {\n if (this.HasRun) {\n this.RunQuery(this.SavedParams, this.CurrentPageNumber);\n } else if (this.QueryInfo?.QueryParameters?.length) {\n this.ShowParamsPanel = true;\n this.cdr.markForCheck();\n } else {\n this.RunQuery({});\n }\n }\n\n // ========================================\n // Public API\n // ========================================\n\n public OpenParametersPanel(): void {\n this.ShowParamsPanel = true;\n this.cdr.markForCheck();\n }\n\n public OpenInfoPanel(): void {\n this.ShowInfoPanel = true;\n this.cdr.markForCheck();\n }\n\n public CloseInfoPanel(): void {\n this.ShowInfoPanel = false;\n this.cdr.markForCheck();\n }\n\n public OnOpenQueryRecord(event: { queryId: string; queryName: string }): void {\n this.OpenQueryRecord.emit(event);\n }\n\n public OnCompositionTokenClick(event: CompositionTokenClickEvent): void {\n this.CompositionTokenClick.emit(event);\n }\n\n public Refresh(): void {\n this.OnRefreshRequest();\n }\n\n public get HasParameters(): boolean {\n return (this.QueryInfo?.QueryParameters?.length || 0) > 0;\n }\n\n /**\n * Normalizes array-typed parameters. Handles the case where saved state\n * contains JSON fragment arrays (e.g. `['[\"A\"', '\"B\"]']`) from the old\n * comma-split bug. Joins the fragments back into a string, detects JSON\n * array syntax, and parses cleanly.\n */\n private normalizeArrayParams(params: QueryParameterValues): QueryParameterValues {\n if (!this.QueryInfo?.QueryParameters?.length) return params;\n\n const result = { ...params };\n for (const paramDef of this.QueryInfo.QueryParameters) {\n if (paramDef.Type !== 'array' || !(paramDef.Name in result)) continue;\n\n const value = result[paramDef.Name];\n if (!Array.isArray(value) || value.length === 0) continue;\n\n // Check if the array looks like it was produced by naive comma-splitting\n // of a JSON array string (fragments contain brackets or quotes)\n const joined = value.join(', ');\n const trimmed = joined.trim();\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n result[paramDef.Name] = parsed.map((v: unknown) => String(v).trim()).filter((s: string) => s);\n continue;\n }\n } catch {\n // Not valid JSON after joining — leave as-is\n }\n }\n }\n return result;\n }\n}\n","<!-- Query Viewer Component -->\n<div class=\"query-viewer-container\">\n <!-- Header bar when query is loaded -->\n @if (QueryInfo) {\n <div class=\"query-header\">\n <div class=\"query-info\">\n <h3 class=\"query-name\">{{ QueryInfo.Name }}</h3>\n @if (QueryInfo.Category) {\n <span class=\"query-category\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ QueryInfo.Category }}\n </span>\n }\n </div>\n <div class=\"query-actions\">\n <!-- Info button -->\n <button (click)=\"OpenInfoPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Query information\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Info\n </button>\n <!-- Parameters button -->\n @if (HasParameters) {\n <button\n (click)=\"OpenParametersPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Edit parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </button>\n }\n <!-- Execution stats -->\n @if (ExecutionTimeMs !== null) {\n <span class=\"execution-stats\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ ExecutionTimeMs }}ms\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Main content area -->\n <div class=\"query-content\">\n <!-- No query selected state -->\n @if (!QueryId) {\n <div class=\"no-query-state\">\n <i class=\"fa-solid fa-database state-icon\"></i>\n <p class=\"state-message\">Select a query to view results</p>\n </div>\n }\n\n <!-- Query not found error -->\n @if (QueryId && !QueryInfo && LastError) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle state-icon error\"></i>\n <p class=\"state-message\">{{ LastError }}</p>\n </div>\n }\n\n <!-- Query description -->\n @if (QueryInfo?.Description && !HasRun) {\n <div class=\"query-description\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ QueryInfo?.Description }}\n </div>\n }\n\n <!-- Query execution error -->\n @if (LastError && HasRun) {\n <div class=\"execution-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ LastError }}</span>\n <button class=\"btn btn-secondary\" (click)=\"Refresh()\">Try Again</button>\n </div>\n }\n\n <!-- Grid -->\n @if (QueryInfo) {\n <mj-query-data-grid\n [QueryInfo]=\"QueryInfo\"\n [Data]=\"QueryData\"\n [ExportDataProvider]=\"FetchAllRowsForExport\"\n [TotalRowCount]=\"QueryTotalRowCount\"\n [PageNumber]=\"CurrentPageNumber\"\n [PageSize]=\"PageSize\"\n [SelectionMode]=\"SelectionMode\"\n [ShowToolbar]=\"ShowToolbar\"\n [VisualConfig]=\"VisualConfig\"\n [IsLoading]=\"IsLoading\"\n (PageChange)=\"OnPageChange($event)\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (RowDoubleClick)=\"OnRowDoubleClick($event)\"\n (SelectionChange)=\"OnSelectionChange($event)\"\n (GridStateChange)=\"OnGridStateChange($event)\"\n (RefreshRequest)=\"OnRefreshRequest()\">\n </mj-query-data-grid>\n }\n </div>\n\n <!-- Parameter form panel -->\n <mj-query-parameter-form\n [QueryInfo]=\"QueryInfo\"\n [InitialValues]=\"SavedParams\"\n [IsOpen]=\"ShowParamsPanel\"\n (ParametersSubmit)=\"OnParametersSubmit($event)\"\n (Close)=\"OnParamsPanelClose()\">\n </mj-query-parameter-form>\n\n <!-- Query info panel -->\n <mj-query-info-panel\n [QueryInfo]=\"QueryInfo\"\n [Visible]=\"ShowInfoPanel\"\n (Close)=\"CloseInfoPanel()\"\n (OpenRecord)=\"OnOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"OnCompositionTokenClick($event)\">\n </mj-query-info-panel>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"query-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/query-viewer/query-viewer.component.ts","../../../src/lib/query-viewer/query-viewer.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 ViewChild\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { RunQuery, RunQueryParams, RunQueryResult } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJQueryEntityExtended, QueryEngine } from '@memberjunction/core-entities';\nimport { PageChangeEvent } from '@memberjunction/ng-pagination';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CompositionTokenClickEvent } from '@memberjunction/ng-code-editor';\nimport { QueryDataGridComponent } from '../query-data-grid/query-data-grid.component';\nimport {\n QueryGridSelectionMode,\n QueryGridState,\n QueryGridVisualConfig,\n QueryParameterValues,\n QueryEntityLinkClickEvent,\n QueryGridStateChangedEvent,\n QuerySelectionChangedEvent,\n QueryRowClickEvent,\n getQueryGridStateKey,\n getQueryParamsKey\n} from '../query-data-grid/models/query-grid-types';\n\n/**\n * A composite component that provides a complete query viewing experience.\n * Features:\n * - Automatic parameter form display when query has parameters\n * - Grid state persistence to User Settings\n * - Parameter persistence to User Settings\n * - Entity linking for clickable record IDs\n * - Auto-run capability when all required params have saved values\n *\n * @example\n * ```html\n * <mj-query-viewer\n * [QueryId]=\"selectedQueryId\"\n * [AutoRun]=\"true\"\n * (EntityLinkClick)=\"openRecord($event)\">\n * </mj-query-viewer>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-query-viewer',\n templateUrl: './query-viewer.component.html',\n styleUrls: ['./query-viewer.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class QueryViewerComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * Safety cap for the export path — deliberately large (exports should cover the full result set)\n * but bounded to protect the browser from an unbounded query. Kept in lockstep with the\n * entity-viewer's EXPORT_MAX_RECORDS so Export behaves the same across Queries and Data Explorer.\n */\n private static readonly EXPORT_MAX_RECORDS = 100000;\n\n // ========================================\n // Inputs\n // ========================================\n\n private _queryId: string | null = null;\n /**\n * The ID of the query to display\n */\n @Input()\n set QueryId(value: string | null) {\n const previous = this._queryId;\n this._queryId = value;\n if (value !== previous) {\n this.onQueryIdChanged();\n }\n }\n get QueryId(): string | null {\n return this._queryId;\n }\n\n /**\n * Whether to auto-run the query when all required params have saved values\n */\n @Input() AutoRun: boolean = true;\n\n /**\n * Selection mode for the grid\n */\n @Input() SelectionMode: QueryGridSelectionMode = 'single';\n\n /**\n * Whether to show the toolbar\n */\n @Input() ShowToolbar: boolean = true;\n\n /**\n * Visual configuration for the grid\n */\n @Input() VisualConfig: QueryGridVisualConfig = {};\n\n /**\n * Whether to persist grid state\n */\n @Input() PersistState: boolean = true;\n\n /**\n * Whether to persist parameter values\n */\n @Input() PersistParameters: boolean = true;\n\n /**\n * Number of rows per page for server-side paging.\n * Set to 0 to disable paging and load all rows at once.\n */\n @Input() PageSize: number = 100;\n\n // ========================================\n // Outputs\n // ========================================\n\n /**\n * Fired when an entity link is clicked in the grid\n */\n @Output() EntityLinkClick = new EventEmitter<QueryEntityLinkClickEvent>();\n\n /**\n * Fired when a row is double-clicked\n */\n @Output() RowDoubleClick = new EventEmitter<QueryRowClickEvent>();\n\n /**\n * Fired when selection changes\n */\n @Output() SelectionChange = new EventEmitter<QuerySelectionChangedEvent>();\n\n /**\n * Fired when query execution starts\n */\n @Output() QueryStart = new EventEmitter<void>();\n\n /**\n * Fired when query execution completes\n */\n @Output() QueryComplete = new EventEmitter<RunQueryResult>();\n\n /**\n * Fired when query execution fails\n */\n @Output() QueryError = new EventEmitter<Error>();\n\n /**\n * Fired when user wants to open the full query record\n */\n @Output() OpenQueryRecord = new EventEmitter<{ queryId: string; queryName: string }>();\n\n /**\n * Fired when a composition token ({{query:\"...\"}}) is clicked in the SQL info panel\n */\n @Output() CompositionTokenClick = new EventEmitter<CompositionTokenClickEvent>();\n\n // ========================================\n // View Children\n // ========================================\n\n @ViewChild(QueryDataGridComponent) DataGrid!: QueryDataGridComponent;\n\n // ========================================\n // Internal State\n // ========================================\n\n public QueryInfo: MJQueryEntityExtended | null = null;\n public QueryData: Record<string, unknown>[] = [];\n public IsLoading: boolean = false;\n public ShowParamsPanel: boolean = false;\n public ShowInfoPanel: boolean = false;\n public HasRun: boolean = false;\n public LastError: string | null = null;\n public ExecutionTimeMs: number | null = null;\n\n public SavedGridState: QueryGridState | null = null;\n public SavedParams: QueryParameterValues = {};\n\n /** Paging state */\n public QueryTotalRowCount: number = 0;\n public CurrentPageNumber: number = 1;\n\n private destroy$ = new Subject<void>();\n private userInfoEngine = UserInfoEngine.Instance;\n\n constructor(private cdr: ChangeDetectorRef) { super(); }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ========================================\n // Query Loading\n // ========================================\n\n private async onQueryIdChanged(): Promise<void> {\n // Reset state\n this.QueryInfo = null;\n this.QueryData = [];\n this.HasRun = false;\n this.LastError = null;\n this.ExecutionTimeMs = null;\n this.SavedGridState = null;\n this.SavedParams = {};\n this.ShowParamsPanel = false;\n this.QueryTotalRowCount = 0;\n this.CurrentPageNumber = 1;\n this.cdr.markForCheck();\n\n if (!this._queryId) {\n return;\n }\n\n // Load query info from metadata\n this.QueryInfo = QueryEngine.Instance.Queries.find(q => UUIDsEqual(q.ID, this._queryId)) || null;\n\n if (!this.QueryInfo) {\n this.LastError = `Query with ID ${this._queryId} not found`;\n this.cdr.markForCheck();\n return;\n }\n\n // Load saved state from User Settings\n await this.loadSavedState();\n\n // Determine if we should show params or auto-run\n const hasParams = this.QueryInfo.QueryParameters && this.QueryInfo.QueryParameters.length > 0;\n const hasRequiredParams = hasParams && this.QueryInfo.QueryParameters.some(p => p.IsRequired);\n\n if (hasParams) {\n // Check if all required params have saved values\n const canAutoRun = this.AutoRun && this.canAutoRunWithSavedParams();\n\n if (canAutoRun) {\n // Auto-run with saved parameters\n await this.RunQuery(this.SavedParams);\n } else {\n // Show parameter panel\n this.ShowParamsPanel = true;\n }\n } else {\n // No parameters - auto-run immediately\n await this.RunQuery({});\n }\n\n this.cdr.markForCheck();\n }\n\n private canAutoRunWithSavedParams(): boolean {\n if (!this.QueryInfo) return false;\n\n const requiredParams = this.QueryInfo.QueryParameters?.filter(p => p.IsRequired) || [];\n\n for (const param of requiredParams) {\n const savedValue = this.SavedParams[param.Name];\n if (savedValue === null || savedValue === undefined || savedValue === '') {\n return false;\n }\n if (param.Type === 'array' && Array.isArray(savedValue) && savedValue.length === 0) {\n return false;\n }\n }\n\n return true;\n }\n\n // ========================================\n // State Persistence\n // ========================================\n\n private async loadSavedState(): Promise<void> {\n if (!this._queryId) return;\n\n try {\n // Load grid state\n if (this.PersistState) {\n const gridStateKey = getQueryGridStateKey(this._queryId);\n const gridStateSetting = await this.getUserSetting(gridStateKey);\n if (gridStateSetting) {\n this.SavedGridState = JSON.parse(gridStateSetting) as QueryGridState;\n }\n }\n\n // Load saved parameters\n if (this.PersistParameters) {\n const paramsKey = getQueryParamsKey(this._queryId);\n const paramsSetting = await this.getUserSetting(paramsKey);\n if (paramsSetting) {\n this.SavedParams = JSON.parse(paramsSetting) as QueryParameterValues;\n }\n }\n } catch (error) {\n console.warn('Error loading saved query state:', error);\n }\n }\n\n private async saveGridState(state: QueryGridState): Promise<void> {\n if (!this._queryId || !this.PersistState) return;\n\n try {\n const key = getQueryGridStateKey(this._queryId);\n await this.setUserSetting(key, JSON.stringify(state));\n } catch (error) {\n console.warn('Error saving grid state:', error);\n }\n }\n\n private async saveParameters(params: QueryParameterValues): Promise<void> {\n if (!this._queryId || !this.PersistParameters) return;\n\n try {\n const key = getQueryParamsKey(this._queryId);\n await this.setUserSetting(key, JSON.stringify(params));\n } catch (error) {\n console.warn('Error saving parameters:', error);\n }\n }\n\n private async getUserSetting(key: string): Promise<string | undefined> {\n return this.userInfoEngine.GetSetting(key);\n }\n\n private async setUserSetting(key: string, value: string): Promise<void> {\n await this.userInfoEngine.SetSetting(key, value);\n }\n\n // ========================================\n // Query Execution\n // ========================================\n\n public async RunQuery(params: QueryParameterValues, pageNumber: number = 1): Promise<void> {\n if (!this.QueryInfo || !this._queryId) return;\n\n // Normalize array parameters: saved state or callers may pass arrays\n // with JSON fragment strings (e.g. ['[\"A\"', '\"B\"]']) from the old\n // comma-split bug. Re-join and re-parse to clean them up.\n const normalizedParams = this.normalizeArrayParams(params);\n\n this.IsLoading = true;\n this.LastError = null;\n this.QueryStart.emit();\n this.cdr.markForCheck();\n\n // Save normalized parameters for next time\n this.SavedParams = normalizedParams;\n await this.saveParameters(normalizedParams);\n\n const startTime = performance.now();\n\n try {\n const runQuery = this.RunQueryToUse;\n const runParams: RunQueryParams = {\n QueryID: this._queryId,\n Parameters: normalizedParams as Record<string, unknown>\n };\n\n // Add server-side paging when PageSize > 0\n if (this.PageSize > 0) {\n runParams.MaxRows = this.PageSize;\n runParams.StartRow = (pageNumber - 1) * this.PageSize;\n }\n\n const result = await runQuery.RunQuery(runParams);\n\n this.ExecutionTimeMs = Math.round(performance.now() - startTime);\n\n if (result.Success) {\n this.QueryData = result.Results || [];\n this.HasRun = true;\n this.ShowParamsPanel = false;\n\n // Update paging state from result\n this.QueryTotalRowCount = result.TotalRowCount;\n this.CurrentPageNumber = result.PageNumber ?? pageNumber;\n\n this.QueryComplete.emit(result);\n } else {\n this.LastError = result.ErrorMessage || 'Query execution failed';\n this.QueryError.emit(new Error(this.LastError));\n MJNotificationService.Instance.CreateSimpleNotification(\n this.LastError,\n 'error',\n 5000\n );\n }\n } catch (error) {\n this.ExecutionTimeMs = Math.round(performance.now() - startTime);\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n this.LastError = errorMessage;\n this.QueryError.emit(error instanceof Error ? error : new Error(errorMessage));\n MJNotificationService.Instance.CreateSimpleNotification(\n `Error running query: ${errorMessage}`,\n 'error',\n 5000\n );\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Fetches the FULL result set for the current query, used by the grid's export flow so exports\n * aren't capped at the on-screen page (bug B3). Bound as an arrow property so it can be passed to\n * the grid's ExportDataProvider input without losing `this`. Loads up to {@link EXPORT_MAX_RECORDS}\n * (kept in lockstep with the entity-viewer's export cap) and warns — rather than silently\n * truncating — when the query returns more. Uses the provider-scoped RunQuery so it targets the\n * correct server in multi-provider setups. Falls back to the currently-loaded page on failure.\n */\n public FetchAllRowsForExport = async (): Promise<Record<string, unknown>[]> => {\n if (!this._queryId) {\n return this.QueryData;\n }\n try {\n // MaxRows caps the pull to protect the browser from an unbounded query; StartRow 0 = from\n // the top. This is a much larger window than the on-screen page, so export covers the set.\n const result = await this.RunQueryToUse.RunQuery({\n QueryID: this._queryId,\n Parameters: this.SavedParams as Record<string, unknown>,\n MaxRows: QueryViewerComponent.EXPORT_MAX_RECORDS,\n StartRow: 0\n });\n if (result.Success) {\n if (result.TotalRowCount > QueryViewerComponent.EXPORT_MAX_RECORDS) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `This export is limited to the first ${QueryViewerComponent.EXPORT_MAX_RECORDS.toLocaleString()} of ` +\n `${result.TotalRowCount.toLocaleString()} rows. Refine the query to include the rest.`,\n 'warning',\n 6000\n );\n }\n return result.Results || [];\n }\n } catch {\n // Fall through to the loaded page.\n }\n return this.QueryData;\n };\n\n // ========================================\n // Event Handlers\n // ========================================\n\n public OnParametersSubmit(params: QueryParameterValues): void {\n this.RunQuery(params);\n }\n\n public OnParamsPanelClose(): void {\n this.ShowParamsPanel = false;\n this.cdr.markForCheck();\n }\n\n public OnGridStateChange(event: QueryGridStateChangedEvent): void {\n this.saveGridState(event.state);\n }\n\n public OnEntityLinkClick(event: QueryEntityLinkClickEvent): void {\n this.EntityLinkClick.emit(event);\n }\n\n public OnRowDoubleClick(event: QueryRowClickEvent): void {\n this.RowDoubleClick.emit(event);\n }\n\n public OnSelectionChange(event: QuerySelectionChangedEvent): void {\n this.SelectionChange.emit(event);\n }\n\n public OnPageChange(event: PageChangeEvent): void {\n this.RunQuery(this.SavedParams, event.PageNumber);\n }\n\n public OnRefreshRequest(): void {\n if (this.HasRun) {\n this.RunQuery(this.SavedParams, this.CurrentPageNumber);\n } else if (this.QueryInfo?.QueryParameters?.length) {\n this.ShowParamsPanel = true;\n this.cdr.markForCheck();\n } else {\n this.RunQuery({});\n }\n }\n\n // ========================================\n // Public API\n // ========================================\n\n public OpenParametersPanel(): void {\n this.ShowParamsPanel = true;\n this.cdr.markForCheck();\n }\n\n public OpenInfoPanel(): void {\n this.ShowInfoPanel = true;\n this.cdr.markForCheck();\n }\n\n public CloseInfoPanel(): void {\n this.ShowInfoPanel = false;\n this.cdr.markForCheck();\n }\n\n public OnOpenQueryRecord(event: { queryId: string; queryName: string }): void {\n this.OpenQueryRecord.emit(event);\n }\n\n public OnCompositionTokenClick(event: CompositionTokenClickEvent): void {\n this.CompositionTokenClick.emit(event);\n }\n\n public Refresh(): void {\n this.OnRefreshRequest();\n }\n\n public get HasParameters(): boolean {\n return (this.QueryInfo?.QueryParameters?.length || 0) > 0;\n }\n\n /**\n * Normalizes array-typed parameters. Handles the case where saved state\n * contains JSON fragment arrays (e.g. `['[\"A\"', '\"B\"]']`) from the old\n * comma-split bug. Joins the fragments back into a string, detects JSON\n * array syntax, and parses cleanly.\n */\n private normalizeArrayParams(params: QueryParameterValues): QueryParameterValues {\n if (!this.QueryInfo?.QueryParameters?.length) return params;\n\n const result = { ...params };\n for (const paramDef of this.QueryInfo.QueryParameters) {\n if (paramDef.Type !== 'array' || !(paramDef.Name in result)) continue;\n\n const value = result[paramDef.Name];\n if (!Array.isArray(value) || value.length === 0) continue;\n\n // Check if the array looks like it was produced by naive comma-splitting\n // of a JSON array string (fragments contain brackets or quotes)\n const joined = value.join(', ');\n const trimmed = joined.trim();\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) {\n result[paramDef.Name] = parsed.map((v: unknown) => String(v).trim()).filter((s: string) => s);\n continue;\n }\n } catch {\n // Not valid JSON after joining — leave as-is\n }\n }\n }\n return result;\n }\n}\n","<!-- Query Viewer Component -->\n<div class=\"query-viewer-container\">\n <!-- Header bar when query is loaded -->\n @if (QueryInfo) {\n <div class=\"query-header\">\n <div class=\"query-info\">\n <h3 class=\"query-name\">{{ QueryInfo.Name }}</h3>\n @if (QueryInfo.Category) {\n <span class=\"query-category\">\n <i class=\"fa-solid fa-folder\"></i>\n {{ QueryInfo.Category }}\n </span>\n }\n </div>\n <div class=\"query-actions\">\n <!-- Info button -->\n <button (click)=\"OpenInfoPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Query information\">\n <i class=\"fa-solid fa-info-circle\"></i>\n Info\n </button>\n <!-- Parameters button -->\n @if (HasParameters) {\n <button\n (click)=\"OpenParametersPanel()\"\n [disabled]=\"IsLoading\"\n class=\"btn btn-secondary\"\n title=\"Edit parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n Parameters\n </button>\n }\n <!-- Execution stats -->\n @if (ExecutionTimeMs !== null) {\n <span class=\"execution-stats\">\n <i class=\"fa-solid fa-clock\"></i>\n {{ ExecutionTimeMs }}ms\n </span>\n }\n </div>\n </div>\n }\n\n <!-- Main content area -->\n <div class=\"query-content\">\n <!-- No query selected state -->\n @if (!QueryId) {\n <div class=\"no-query-state\">\n <i class=\"fa-solid fa-database state-icon\"></i>\n <p class=\"state-message\">Select a query to view results</p>\n </div>\n }\n\n <!-- Query not found error -->\n @if (QueryId && !QueryInfo && LastError) {\n <div class=\"error-state\">\n <i class=\"fa-solid fa-exclamation-triangle state-icon error\"></i>\n <p class=\"state-message\">{{ LastError }}</p>\n </div>\n }\n\n <!-- Query description -->\n @if (QueryInfo?.Description && !HasRun) {\n <div class=\"query-description\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ QueryInfo?.Description }}\n </div>\n }\n\n <!-- Query execution error -->\n @if (LastError && HasRun) {\n <div class=\"execution-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ LastError }}</span>\n <button class=\"btn btn-secondary\" (click)=\"Refresh()\">Try Again</button>\n </div>\n }\n\n <!-- Grid -->\n @if (QueryInfo) {\n <mj-query-data-grid\n [QueryInfo]=\"QueryInfo\"\n [Data]=\"QueryData\"\n [ExportDataProvider]=\"FetchAllRowsForExport\"\n [TotalRowCount]=\"QueryTotalRowCount\"\n [PageNumber]=\"CurrentPageNumber\"\n [PageSize]=\"PageSize\"\n [SelectionMode]=\"SelectionMode\"\n [ShowToolbar]=\"ShowToolbar\"\n [VisualConfig]=\"VisualConfig\"\n [IsLoading]=\"IsLoading\"\n (PageChange)=\"OnPageChange($event)\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (RowDoubleClick)=\"OnRowDoubleClick($event)\"\n (SelectionChange)=\"OnSelectionChange($event)\"\n (GridStateChange)=\"OnGridStateChange($event)\"\n (RefreshRequest)=\"OnRefreshRequest()\">\n </mj-query-data-grid>\n }\n </div>\n\n <!-- Parameter form panel -->\n <mj-query-parameter-form\n [QueryInfo]=\"QueryInfo\"\n [InitialValues]=\"SavedParams\"\n [IsOpen]=\"ShowParamsPanel\"\n (ParametersSubmit)=\"OnParametersSubmit($event)\"\n (Close)=\"OnParamsPanelClose()\">\n </mj-query-parameter-form>\n\n <!-- Query info panel -->\n <mj-query-info-panel\n [QueryInfo]=\"QueryInfo\"\n [Visible]=\"ShowInfoPanel\"\n (Close)=\"CloseInfoPanel()\"\n (OpenRecord)=\"OnOpenQueryRecord($event)\"\n (CompositionTokenClick)=\"OnCompositionTokenClick($event)\">\n </mj-query-info-panel>\n</div>\n"]}
|
package/package.json
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-query-viewer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.1.0-edge.0",
|
|
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",
|
|
7
7
|
"files": [
|
|
8
8
|
"/dist"
|
|
9
9
|
],
|
|
10
|
-
"scripts": {
|
|
11
|
-
"test": "vitest run",
|
|
12
|
-
"build": "ngc",
|
|
13
|
-
"test:watch": "vitest"
|
|
14
|
-
},
|
|
15
10
|
"keywords": [
|
|
16
11
|
"memberjunction",
|
|
17
12
|
"angular",
|
|
@@ -26,7 +21,7 @@
|
|
|
26
21
|
"devDependencies": {
|
|
27
22
|
"@angular/compiler": "21.1.3",
|
|
28
23
|
"@angular/compiler-cli": "21.1.3",
|
|
29
|
-
"@memberjunction/ng-test-utils": "
|
|
24
|
+
"@memberjunction/ng-test-utils": "6.1.0-edge.0",
|
|
30
25
|
"vitest": "^4.0.18"
|
|
31
26
|
},
|
|
32
27
|
"peerDependencies": {
|
|
@@ -38,18 +33,18 @@
|
|
|
38
33
|
"ag-grid-community": "^35.0.1"
|
|
39
34
|
},
|
|
40
35
|
"dependencies": {
|
|
41
|
-
"@memberjunction/ng-ui-components": "
|
|
42
|
-
"@memberjunction/core-entities": "
|
|
43
|
-
"@memberjunction/export-engine": "
|
|
44
|
-
"@memberjunction/global": "
|
|
45
|
-
"@memberjunction/core": "
|
|
46
|
-
"@memberjunction/ng-base-types": "
|
|
47
|
-
"@memberjunction/ng-pagination": "
|
|
48
|
-
"@memberjunction/ng-shared-generic": "
|
|
49
|
-
"@memberjunction/ng-export-service": "
|
|
50
|
-
"@memberjunction/ng-markdown": "
|
|
51
|
-
"@memberjunction/ng-code-editor": "
|
|
52
|
-
"@memberjunction/ng-notifications": "
|
|
36
|
+
"@memberjunction/ng-ui-components": "6.1.0-edge.0",
|
|
37
|
+
"@memberjunction/core-entities": "6.1.0-edge.0",
|
|
38
|
+
"@memberjunction/export-engine": "6.1.0-edge.0",
|
|
39
|
+
"@memberjunction/global": "6.1.0-edge.0",
|
|
40
|
+
"@memberjunction/core": "6.1.0-edge.0",
|
|
41
|
+
"@memberjunction/ng-base-types": "6.1.0-edge.0",
|
|
42
|
+
"@memberjunction/ng-pagination": "6.1.0-edge.0",
|
|
43
|
+
"@memberjunction/ng-shared-generic": "6.1.0-edge.0",
|
|
44
|
+
"@memberjunction/ng-export-service": "6.1.0-edge.0",
|
|
45
|
+
"@memberjunction/ng-markdown": "6.1.0-edge.0",
|
|
46
|
+
"@memberjunction/ng-code-editor": "6.1.0-edge.0",
|
|
47
|
+
"@memberjunction/ng-notifications": "6.1.0-edge.0",
|
|
53
48
|
"rxjs": "^7.8.2",
|
|
54
49
|
"tslib": "^2.8.1"
|
|
55
50
|
},
|
|
@@ -57,5 +52,12 @@
|
|
|
57
52
|
"repository": {
|
|
58
53
|
"type": "git",
|
|
59
54
|
"url": "https://github.com/MemberJunction/MJ"
|
|
55
|
+
},
|
|
56
|
+
"mjUILayer": "widgets",
|
|
57
|
+
"scripts": {
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:types": "tsc --noEmit -p tsconfig.spec.json",
|
|
60
|
+
"build": "ngc",
|
|
61
|
+
"test:watch": "vitest"
|
|
60
62
|
}
|
|
61
|
-
}
|
|
63
|
+
}
|