@memberjunction/ng-explorer-settings 6.2.0-edge.0 → 6.2.0-edge.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/lib/account-info/account-info.component.d.ts +1 -1
  2. package/dist/lib/account-info/account-info.component.js +2 -2
  3. package/dist/lib/account-info/account-info.component.js.map +1 -1
  4. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts +92 -10
  5. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
  6. package/dist/lib/application-management/application-dialog/application-dialog.component.js +222 -76
  7. package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
  8. package/dist/lib/application-management/application-management.component.d.ts +92 -10
  9. package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
  10. package/dist/lib/application-management/application-management.component.js +229 -65
  11. package/dist/lib/application-management/application-management.component.js.map +1 -1
  12. package/dist/lib/application-settings/application-settings.component.d.ts +4 -4
  13. package/dist/lib/application-settings/application-settings.component.js +10 -10
  14. package/dist/lib/application-settings/application-settings.component.js.map +1 -1
  15. package/dist/lib/entity-permissions/entity-permissions.component.d.ts +88 -10
  16. package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
  17. package/dist/lib/entity-permissions/entity-permissions.component.js +219 -63
  18. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
  19. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts +44 -6
  20. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
  21. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +117 -43
  22. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
  23. package/dist/lib/notification-preferences/notification-preferences.component.d.ts +25 -3
  24. package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
  25. package/dist/lib/notification-preferences/notification-preferences.component.js +62 -18
  26. package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
  27. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts +32 -4
  28. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts.map +1 -1
  29. package/dist/lib/role-management/role-dialog/role-dialog.component.js +84 -30
  30. package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
  31. package/dist/lib/role-management/role-management-agent-context.d.ts +12 -4
  32. package/dist/lib/role-management/role-management-agent-context.d.ts.map +1 -1
  33. package/dist/lib/role-management/role-management-agent-context.js +26 -10
  34. package/dist/lib/role-management/role-management-agent-context.js.map +1 -1
  35. package/dist/lib/role-management/role-management.component.d.ts +95 -11
  36. package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
  37. package/dist/lib/role-management/role-management.component.js +259 -91
  38. package/dist/lib/role-management/role-management.component.js.map +1 -1
  39. package/dist/lib/settings/settings.component.d.ts +87 -11
  40. package/dist/lib/settings/settings.component.d.ts.map +1 -1
  41. package/dist/lib/settings/settings.component.js +211 -65
  42. package/dist/lib/settings/settings.component.js.map +1 -1
  43. package/dist/lib/shared/settings-card.component.d.ts +24 -4
  44. package/dist/lib/shared/settings-card.component.d.ts.map +1 -1
  45. package/dist/lib/shared/settings-card.component.js +46 -6
  46. package/dist/lib/shared/settings-card.component.js.map +1 -1
  47. package/dist/lib/sql-logging/sql-logging.component.d.ts +172 -18
  48. package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -1
  49. package/dist/lib/sql-logging/sql-logging.component.js +320 -108
  50. package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
  51. package/dist/lib/user-app-config/user-app-config-content.component.js +3 -3
  52. package/dist/lib/user-app-config/user-app-config-content.component.js.map +1 -1
  53. package/dist/lib/user-app-config/user-app-config-reorder.d.ts +4 -0
  54. package/dist/lib/user-app-config/user-app-config-reorder.d.ts.map +1 -1
  55. package/dist/lib/user-app-config/user-app-config-reorder.js +11 -3
  56. package/dist/lib/user-app-config/user-app-config-reorder.js.map +1 -1
  57. package/dist/lib/user-management/transaction-group-refusals.d.ts +4 -2
  58. package/dist/lib/user-management/transaction-group-refusals.d.ts.map +1 -1
  59. package/dist/lib/user-management/transaction-group-refusals.js +7 -3
  60. package/dist/lib/user-management/transaction-group-refusals.js.map +1 -1
  61. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts +44 -6
  62. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts.map +1 -1
  63. package/dist/lib/user-management/user-dialog/user-dialog.component.js +121 -47
  64. package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
  65. package/dist/lib/user-management/user-management-agent-context.d.ts +10 -0
  66. package/dist/lib/user-management/user-management-agent-context.d.ts.map +1 -1
  67. package/dist/lib/user-management/user-management-agent-context.js +26 -6
  68. package/dist/lib/user-management/user-management-agent-context.js.map +1 -1
  69. package/dist/lib/user-management/user-management.component.d.ts +174 -16
  70. package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
  71. package/dist/lib/user-management/user-management.component.js +480 -171
  72. package/dist/lib/user-management/user-management.component.js.map +1 -1
  73. package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts +97 -15
  74. package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts.map +1 -1
  75. package/dist/lib/user-profile-settings/user-profile-settings.component.js +280 -116
  76. package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
  77. package/package.json +20 -20
@@ -1 +1 @@
1
- {"version":3,"file":"sql-logging.component.js","sourceRoot":"","sources":["../../../src/lib/sql-logging/sql-logging.component.ts","../../../src/lib/sql-logging/sql-logging.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnDestroy, HostListener, ChangeDetectorRef } from '@angular/core';\nimport { Subject, interval } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Metadata } from '@memberjunction/core';\nimport { SharedService, BaseDashboard } from '@memberjunction/ng-shared';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { RegisterClass } from '@memberjunction/global';\nimport { ResourceData } from '@memberjunction/core-entities';\n\n/** Session options for SQL logging */\ninterface SqlLoggingSessionOptions {\n formatAsMigration: boolean;\n statementTypes: string;\n prettyPrint: boolean;\n}\n\n/** Represents an active SQL logging session */\ninterface SqlLoggingSession {\n id: string;\n filePath: string;\n startTime: string;\n statementCount: number;\n sessionName: string;\n filterByUserId?: string;\n options?: SqlLoggingSessionOptions;\n}\n\n/** SQL logging configuration from the server */\ninterface SqlLoggingConfig {\n enabled: boolean;\n allowedLogDirectory?: string;\n maxActiveSessions?: number;\n autoCleanupEmptyFiles?: boolean;\n sessionTimeout?: number;\n activeSessionCount?: number;\n defaultOptions?: SqlLoggingSessionOptions;\n}\n\n/**\n * Angular component for managing SQL logging sessions in MemberJunction.\n *\n * This component provides a user interface for:\n * - Viewing SQL logging configuration and status\n * - Starting and stopping SQL logging sessions\n * - Managing session options (filtering, formatting, etc.)\n * - Real-time monitoring of active sessions\n *\n * **Security**: Only users with 'Owner' type can access SQL logging features.\n *\n * @example\n * ```html\n * <mj-sql-logging></mj-sql-logging>\n * ```\n *\n * @requires Owner-level user privileges\n * @requires SQL logging enabled in server configuration\n */\n@Component({\n standalone: false,\n selector: 'mj-sql-logging',\n templateUrl: './sql-logging.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './sql-logging.component.css'],\n})\n@RegisterClass(BaseDashboard, 'SqlLogging')\nexport class SqlLoggingComponent extends BaseDashboard implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n /** Whether the component is currently performing an async operation */\n loading = false;\n\n /** Current error message to display to the user, if any */\n error: string | null = null;\n\n /** Whether the current user has Owner privileges to access SQL logging */\n isOwner = false;\n\n /** Whether SQL logging is enabled in the server configuration */\n configEnabled = false;\n\n /** Current SQL logging configuration from the server */\n sqlLoggingConfig: SqlLoggingConfig | null = null;\n\n /** List of currently active SQL logging sessions */\n activeSessions: SqlLoggingSession[] = [];\n\n /** Currently selected session for viewing logs */\n selectedSession: SqlLoggingSession | null = null;\n\n /** Content of the currently viewed log file */\n logContent = '';\n\n /** Whether to automatically refresh session data */\n autoRefresh = false;\n\n /** Interval in milliseconds for auto-refresh functionality */\n refreshInterval = 5000; // 5 seconds\n\n /** Whether the start session dialog is currently visible */\n showStartSessionDialog = false;\n\n /** Whether to show the statistics cards section */\n showStats = false;\n\n /** Whether the log viewer is in expanded (fullscreen) mode */\n isLogViewerExpanded = false;\n\n /** Whether the start session dialog is in fullscreen mode */\n isStartDialogFullscreen = false;\n\n /** Whether the stop session confirmation dialog is visible */\n showStopConfirmDialog = false;\n\n /** Session pending stop confirmation (single session or null for all) */\n sessionToStop: SqlLoggingSession | null = null;\n\n /** Whether stopping all sessions (vs single session) */\n isStoppingAll = false;\n\n /** Options for creating a new SQL logging session */\n newSessionOptions = {\n /** Custom filename for the log file */\n fileName: '',\n /** Whether to filter SQL statements to current user only */\n filterToCurrentUser: true,\n /** Whether to format output as migration file */\n formatAsMigration: false,\n /** Types of SQL statements to capture */\n statementTypes: 'both' as 'queries' | 'mutations' | 'both',\n /** Whether to format SQL with proper indentation */\n prettyPrint: true,\n /** Human-readable name for the session */\n sessionName: '',\n /** Regex filter options */\n filterPatterns: '' as string, // Comma or newline separated patterns\n filterType: 'exclude' as 'include' | 'exclude',\n verboseOutput: false,\n defaultSchemaName: '__mj', // Default MJ schema\n };\n\n /** Available options for SQL statement type filtering */\n statementTypeOptions = [\n { text: 'Both Queries and Mutations', value: 'both' },\n { text: 'Queries Only', value: 'queries' },\n { text: 'Mutations Only', value: 'mutations' },\n ];\n\n /** Options for Regex filter */\n filterTypeOptions = [\n { text: 'Exclude Matching (default)', value: 'exclude' },\n { text: 'Include Matching Only', value: 'include' },\n ];\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'SQL Logging';\n }\n\n protected initDashboard(): void {\n this.startAutoRefresh();\n }\n\n protected async loadData(): Promise<void> {\n await this.checkUserPermissions();\n if (this.isOwner) {\n await this.loadSqlLoggingConfig();\n await this.loadActiveSessions();\n }\n }\n\n override ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n super.ngOnDestroy();\n }\n\n /**\n * Starts the auto-refresh timer for session data.\n * Only refreshes when autoRefresh is enabled and user is Owner.\n *\n * @private\n */\n private startAutoRefresh() {\n interval(this.refreshInterval)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.autoRefresh && this.isOwner) {\n this.loadActiveSessions();\n if (this.selectedSession) {\n this.loadSessionLog(this.selectedSession);\n }\n }\n });\n }\n\n /**\n * Checks if the current user has Owner privileges required for SQL logging.\n * Updates the isOwner flag and handles error states.\n *\n * @private\n */\n private async checkUserPermissions() {\n try {\n // Try multiple ways to get the current user\n const md = this.ProviderToUse;\n const currentUser = md.CurrentUser;\n\n console.log('Method 1 - Metadata.CurrentUser:', {\n email: currentUser?.Email,\n type: currentUser?.Type,\n name: currentUser?.Name,\n id: currentUser?.ID,\n });\n\n // Use the current user from Metadata\n const userToCheck = currentUser;\n\n if (userToCheck && userToCheck.Type?.trim().toLowerCase() === 'owner') {\n this.isOwner = true;\n console.log('User is an Owner - SQL logging features enabled');\n } else {\n this.isOwner = false;\n this.error = 'SQL logging requires Owner privileges';\n console.log('User is NOT an Owner. Type:', userToCheck?.Type);\n\n // Also check if it's a string comparison issue\n if (userToCheck) {\n console.log('Type value (raw):', JSON.stringify(userToCheck.Type));\n console.log('Type trimmed:', JSON.stringify(userToCheck.Type?.trim()));\n console.log('Type comparison:', userToCheck.Type?.trim().toLowerCase(), '===', 'owner', ':', userToCheck.Type?.trim().toLowerCase() === 'owner');\n }\n }\n } catch (error) {\n console.error('Error checking user permissions:', error);\n this.isOwner = false;\n this.error = 'Error checking permissions';\n }\n }\n\n /**\n * Opens the dialog for creating a new SQL logging session.\n * Sets default values for session name and filename.\n */\n openStartSessionDialog() {\n // Set default session name\n const currentUser = this.ProviderToUse.CurrentUser;\n this.newSessionOptions.sessionName = `SQL Logging - ${currentUser?.Name || currentUser?.Email || 'Unknown'} - ${new Date().toLocaleString()}`;\n this.newSessionOptions.fileName = `sql-log-${new Date().toISOString().replace(/[:.]/g, '-')}.sql`;\n this.showStartSessionDialog = true;\n }\n\n /**\n * Creates and starts a new SQL logging session with the configured options.\n * Shows success/error notifications and refreshes the sessions list.\n */\n async startNewSession() {\n try {\n this.loading = true;\n\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const mutation = `\n mutation StartSqlLogging($input: StartSqlLoggingInput!) {\n startSqlLogging(input: $input) {\n id\n filePath\n startTime\n statementCount\n sessionName\n filterByUserId\n options {\n formatAsMigration\n statementTypes\n prettyPrint\n }\n }\n }\n `;\n\n const variables = {\n input: {\n fileName: this.newSessionOptions.fileName,\n filterToCurrentUser: this.newSessionOptions.filterToCurrentUser,\n options: {\n formatAsMigration: this.newSessionOptions.formatAsMigration,\n statementTypes: this.newSessionOptions.statementTypes,\n prettyPrint: this.newSessionOptions.prettyPrint,\n sessionName: this.newSessionOptions.sessionName,\n // Regex Filter Option\n filterPatterns: this.parseFilterPatterns(this.newSessionOptions.filterPatterns),\n filterType: this.newSessionOptions.filterType,\n verboseOutput: this.newSessionOptions.verboseOutput,\n defaultSchemaName: this.newSessionOptions.defaultSchemaName,\n },\n },\n };\n\n const result = await dataProvider.ExecuteGQL(mutation, variables);\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n const newSession = result?.startSqlLogging;\n\n if (!newSession) {\n throw new Error('Failed to start SQL logging session - no session data returned');\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`SQL logging session started: ${newSession.sessionName}`, 'success', 5000);\n\n this.showStartSessionDialog = false;\n await this.loadActiveSessions();\n this.selectSession(newSession);\n } catch (error: any) {\n console.error('Error starting SQL logging session:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${error.message || 'Failed to start SQL logging session'}`, 'error', 5000);\n } finally {\n this.loading = false;\n }\n }\n\n /**\n * Executes the stop operation for a specific SQL logging session.\n * Called after user confirms via the confirmation dialog.\n *\n * @param session - The session object to stop\n */\n private async executeStopSession(session: SqlLoggingSession) {\n try {\n this.loading = true;\n\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const mutation = `\n mutation StopSqlLogging($sessionId: String!) {\n stopSqlLogging(sessionId: $sessionId)\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(mutation, { sessionId: session.id });\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n MJNotificationService.Instance.CreateSimpleNotification('SQL logging session stopped', 'success', 3000);\n\n if (this.selectedSession?.id === session.id) {\n this.selectedSession = null;\n this.logContent = '';\n }\n\n await this.loadActiveSessions();\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to stop SQL logging session';\n console.error('Error stopping SQL logging session:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${errorMessage}`, 'error', 5000);\n } finally {\n this.loading = false;\n }\n }\n\n /**\n * Executes the stop operation for all active SQL logging sessions.\n * Called after user confirms via the confirmation dialog.\n */\n private async executeStopAllSessions() {\n try {\n this.loading = true;\n\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const mutation = `\n mutation StopAllSqlLogging {\n stopAllSqlLogging\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(mutation, {});\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n MJNotificationService.Instance.CreateSimpleNotification('All SQL logging sessions stopped', 'success', 3000);\n\n this.selectedSession = null;\n this.logContent = '';\n await this.loadActiveSessions();\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to stop all SQL logging sessions';\n console.error('Error stopping all SQL logging sessions:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${errorMessage}`, 'error', 5000);\n } finally {\n this.loading = false;\n }\n }\n\n /**\n * Selects a session for viewing and loads its log content.\n *\n * @param session - The session to select\n */\n selectSession(session: any) {\n this.selectedSession = session;\n this.loadSessionLog(session);\n }\n\n /**\n * Loads the log file content for a specific session using real-time GraphQL query.\n * Reads actual SQL statements from the log file on the server.\n *\n * @param session - The session whose log to load\n */\n async loadSessionLog(session: any) {\n try {\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const query = `\n query ReadSqlLogFile($sessionId: String!, $maxLines: Int) {\n readSqlLogFile(sessionId: $sessionId, maxLines: $maxLines)\n }\n `;\n\n const variables = {\n sessionId: session.id,\n maxLines: 1000, // Limit to last 1000 lines for performance\n };\n\n const result = await dataProvider.ExecuteGQL(query, variables);\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n const logContent = result?.readSqlLogFile || '';\n\n // Add session header information (show only filename for security)\n const fileName = session.filePath ? session.filePath.split(/[\\\\\\/]/).pop() : 'unknown';\n const header =\n `-- =====================================================\\n` +\n `-- SQL Log File: ${fileName}\\n` +\n `-- Session: ${session.sessionName}\\n` +\n `-- Started: ${new Date(session.startTime).toLocaleString()}\\n` +\n `-- Statements Captured: ${session.statementCount}\\n` +\n `-- User Filter: ${session.filterByUserId || 'All Users'}\\n` +\n `-- Statement Types: ${session.options?.statementTypes || 'both'}\\n` +\n `-- Pretty Print: ${session.options?.prettyPrint ? 'Yes' : 'No'}\\n` +\n `-- Migration Format: ${session.options?.formatAsMigration ? 'Yes' : 'No'}\\n` +\n `-- =====================================================\\n\\n`;\n\n this.logContent = header + (logContent || '-- No SQL statements captured yet --');\n } catch (error: any) {\n console.error('Error loading session log:', error);\n this.logContent =\n `-- Error loading log file --\\n-- ${error.message || 'Unknown error occurred'} --\\n\\n` +\n `-- Session Info --\\n` +\n `-- File: ${session.filePath}\\n` +\n `-- Session: ${session.sessionName}\\n` +\n `-- Started: ${new Date(session.startTime).toLocaleString()}\\n`;\n }\n }\n\n /**\n * Loads the SQL logging configuration from the server.\n * Updates component state with current settings and capabilities.\n *\n * @private\n */\n async loadSqlLoggingConfig() {\n try {\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const query = `\n query SqlLoggingConfig {\n sqlLoggingConfig {\n enabled\n allowedLogDirectory\n maxActiveSessions\n autoCleanupEmptyFiles\n sessionTimeout\n activeSessionCount\n defaultOptions {\n formatAsMigration\n statementTypes\n batchSeparator\n prettyPrint\n logRecordChangeMetadata\n retainEmptyLogFiles\n }\n }\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(query, {});\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n // Debug logging to understand the response structure\n console.log('SQL Logging Config Result:', result);\n console.log('Result keys:', Object.keys(result || {}));\n console.log('Direct result.sqlLoggingConfig:', result?.sqlLoggingConfig);\n\n // Access the data directly from the result, matching AI prompt pattern\n const configData = result?.sqlLoggingConfig;\n console.log('Extracted config data:', configData);\n\n this.sqlLoggingConfig = configData || null;\n this.configEnabled = this.sqlLoggingConfig?.enabled || false;\n this.cdr.detectChanges();\n\n console.log('Component state after update:');\n console.log(' this.sqlLoggingConfig:', this.sqlLoggingConfig);\n console.log(' this.configEnabled:', this.configEnabled);\n console.log(' this.isOwner:', this.isOwner);\n } catch (error: any) {\n console.error('Error loading SQL logging config:', error);\n this.error = error.message || 'Failed to load SQL logging configuration';\n }\n }\n\n /**\n * Loads the list of currently active SQL logging sessions.\n * Updates the activeSessions array and handles session selection state.\n *\n * @private\n */\n async loadActiveSessions() {\n try {\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const query = `\n query ActiveSqlLoggingSessions {\n activeSqlLoggingSessions {\n id\n filePath\n startTime\n statementCount\n sessionName\n filterByUserId\n options {\n formatAsMigration\n statementTypes\n prettyPrint\n }\n }\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(query, {});\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n // Debug logging to understand the response structure\n console.log('Active Sessions Result:', result);\n console.log('Result keys:', Object.keys(result || {}));\n\n // Access the data directly from the result, matching AI prompt pattern\n const sessionsData = result?.activeSqlLoggingSessions;\n console.log('Extracted sessions data:', sessionsData);\n\n this.activeSessions = sessionsData || [];\n this.cdr.detectChanges();\n\n // Update selected session if it still exists\n if (this.selectedSession) {\n const selectedId = this.selectedSession.id;\n const stillExists = this.activeSessions.find((s) => s.id === selectedId);\n if (stillExists) {\n this.selectedSession = stillExists;\n } else {\n this.selectedSession = null;\n this.logContent = '';\n }\n }\n } catch (error: any) {\n console.error('Error loading active sessions:', error);\n }\n }\n\n /**\n * Calculates and formats the duration of a logging session.\n *\n * @param startTime - ISO string of when the session started\n * @returns Formatted duration string (e.g., \"2h 30m\", \"45m 23s\", \"12s\")\n */\n getSessionDuration(startTime: string): string {\n const start = new Date(startTime);\n const now = new Date();\n const diff = now.getTime() - start.getTime();\n\n const hours = Math.floor(diff / (1000 * 60 * 60));\n const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));\n const seconds = Math.floor((diff % (1000 * 60)) / 1000);\n\n if (hours > 0) {\n return `${hours}h ${minutes}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n /**\n * Refreshes user data and re-checks permissions.\n * Useful when user privileges have been updated.\n */\n async refreshUserPermissions() {\n console.log('Refreshing user permissions...');\n this.loading = true;\n\n try {\n // Try to refresh SharedService data\n await SharedService.RefreshData(false);\n\n // Wait a moment for data to propagate\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Re-check permissions\n await this.checkUserPermissions();\n\n console.log('Permissions refreshed');\n } catch (error) {\n console.error('Error refreshing permissions:', error);\n } finally {\n this.loading = false;\n }\n }\n\n /**\n * Extracts the filename from a full file path for security purposes.\n * Only shows the filename, not the full server path.\n *\n * @param filePath - Full file path from server\n * @returns Just the filename portion\n */\n getFileName(filePath: string): string {\n if (!filePath) return 'unknown';\n return filePath.split(/[\\\\\\/]/).pop() || 'unknown';\n }\n\n /**\n * Calculates the total number of SQL statements across all active sessions.\n * @returns Total statement count\n */\n getTotalStatementCount(): number {\n return this.activeSessions.reduce((sum, session) => sum + (session.statementCount || 0), 0);\n }\n\n /**\n * Parses a string of filter patterns (comma or newline separated) into an array\n * @param patternsString - Comma or newline separated patterns\n * @returns Array of pattern strings, or undefined if empty\n */\n private parseFilterPatterns(patternsString: string): string[] | undefined {\n if (!patternsString || !patternsString.trim()) {\n return undefined;\n }\n\n /** Split by comma or newline, trim whitespace, filter empty */\n return patternsString\n .split(/[,\\n]/)\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n }\n\n /**\n * Toggles the log viewer between normal and expanded (fullscreen) mode.\n */\n toggleLogViewerExpand() {\n this.isLogViewerExpanded = !this.isLogViewerExpanded;\n }\n\n /**\n * Toggles the start session dialog between normal and fullscreen mode.\n */\n toggleStartDialogFullscreen() {\n this.isStartDialogFullscreen = !this.isStartDialogFullscreen;\n }\n\n /**\n * Handles keyboard events for the component.\n * Closes expanded log viewer or confirmation dialog when Escape is pressed.\n */\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.showStopConfirmDialog) {\n this.cancelStopConfirm();\n } else if (this.isLogViewerExpanded) {\n this.isLogViewerExpanded = false;\n } else if (this.isStartDialogFullscreen) {\n this.isStartDialogFullscreen = false;\n } else if (this.showStartSessionDialog) {\n this.showStartSessionDialog = false;\n }\n }\n\n /**\n * Opens the confirmation dialog for stopping a single session.\n *\n * @param session - The session to stop\n * @param event - Optional event to stop propagation\n */\n openStopSessionConfirm(session: SqlLoggingSession, event?: Event) {\n if (event) {\n event.stopPropagation();\n }\n this.sessionToStop = session;\n this.isStoppingAll = false;\n this.showStopConfirmDialog = true;\n }\n\n /**\n * Opens the confirmation dialog for stopping all sessions.\n */\n openStopAllSessionsConfirm() {\n this.sessionToStop = null;\n this.isStoppingAll = true;\n this.showStopConfirmDialog = true;\n }\n\n /**\n * Closes the stop confirmation dialog without taking action.\n */\n cancelStopConfirm() {\n this.showStopConfirmDialog = false;\n this.sessionToStop = null;\n this.isStoppingAll = false;\n }\n\n /**\n * Confirms and executes the stop action (single session or all sessions).\n */\n async confirmStopSession() {\n if (this.isStoppingAll) {\n await this.executeStopAllSessions();\n } else if (this.sessionToStop) {\n await this.executeStopSession(this.sessionToStop);\n }\n this.cancelStopConfirm();\n }\n\n /**\n * Debug method to test contextUser flow for SQL filtering.\n * This shows how the new architecture handles user context without storing email in provider.\n */\n async debugUserEmail() {\n try {\n this.loading = true;\n\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const query = `\n query DebugCurrentUserEmail {\n debugCurrentUserEmail\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(query, {});\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n const debugInfo = result?.debugCurrentUserEmail || 'No debug info returned';\n\n alert(`Context User Info:\\n\\n${debugInfo}\\n\\nThe system now passes user context through method calls instead of storing it in the provider.`);\n } catch (error: any) {\n console.error('Error getting context user info:', error);\n alert(`Error: ${error.message || 'Failed to get debug info'}`);\n } finally {\n this.loading = false;\n }\n }\n}\n","<!--\n Interior chrome — sub-page of Admin's Monitoring left-nav shell. Single section\n (no L2 tab nav) so [toolbar] is empty; actions land in [actions]. See Section 10\n of plans/explorer-chrome-conventions.md.\n-->\n<mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"SQL logging actions\"\n Title=\"SQL Logging\"\n Subtitle=\"Capture and download SQL statements executed by the API\">\n <div actions>\n <mj-refresh-button\n [Loading]=\"loading\"\n (Clicked)=\"loadActiveSessions()\">\n </mj-refresh-button>\n @if (isOwner && configEnabled) {\n <button mjButton\n variant=\"primary\"\n size=\"sm\"\n [disabled]=\"loading || activeSessions.length >= (sqlLoggingConfig?.maxActiveSessions || 5)\"\n (click)=\"openStartSessionDialog()\"\n [attr.aria-label]=\"'Start new SQL logging session' + (activeSessions.length >= (sqlLoggingConfig?.maxActiveSessions || 5) ? ' (maximum sessions reached)' : '')\">\n <i class=\"fa-solid fa-play\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">Start New Session</span>\n </button>\n }\n </div>\n</mj-page-header-interior>\n\n<mj-page-body-interior>\n\n <!-- Stats Cards with Toggle -->\n @if (isOwner && configEnabled) {\n <mj-accordion-panel class=\"stats-toggle-container\" Size=\"sm\" [(Expanded)]=\"showStats\">\n <ng-template mjAccordionTitle>\n <div class=\"stats-toggle-icon\">\n <i class=\"fa-solid fa-chart-line\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stats-toggle-text\">\n <h3 class=\"stats-toggle-title\">Statistics</h3>\n <p class=\"stats-toggle-subtitle\">View session statistics and metrics</p>\n </div>\n </ng-template>\n <ng-template mjAccordionBody>\n <div id=\"stats-grid-content\" class=\"stats-grid\" role=\"region\" aria-label=\"SQL logging statistics\">\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-status\">\n <i class=\"fa-solid fa-power-off\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" [attr.aria-label]=\"'Status: ' + (configEnabled ? 'Enabled' : 'Disabled')\">\n {{ configEnabled ? \"Enabled\" : \"Disabled\" }}\n </div>\n <div class=\"stat-label\">Status</div>\n </div>\n </div>\n\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-active\">\n <i class=\"fa-solid fa-play-circle\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" [attr.aria-label]=\"activeSessions.length + ' active sessions'\">\n {{ activeSessions.length }}\n </div>\n <div class=\"stat-label\">Active Sessions</div>\n </div>\n </div>\n\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-limit\">\n <i class=\"fa-solid fa-gauge-high\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" [attr.aria-label]=\"(sqlLoggingConfig?.maxActiveSessions || 5) + ' maximum sessions allowed'\">\n {{ sqlLoggingConfig?.maxActiveSessions || 5 }}\n </div>\n <div class=\"stat-label\">Max Sessions</div>\n </div>\n </div>\n\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-total\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" [attr.aria-label]=\"getTotalStatementCount() + ' total SQL statements captured'\">\n {{ getTotalStatementCount() }}\n </div>\n <div class=\"stat-label\">Total Statements</div>\n </div>\n </div>\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Loading State -->\n @if (loading && !activeSessions.length) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <mj-loading text=\"Loading SQL logging configuration...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Content Area -->\n @if (!loading || activeSessions.length > 0) {\n <div class=\"content-area\">\n @if (!isOwner) {\n <!-- Not authorized -->\n <mj-empty-state\n Variant=\"error\"\n Icon=\"fa-solid fa-lock\"\n Title=\"Access Denied\"\n Message=\"SQL logging requires Owner privileges. Please contact your system administrator for access.\"\n ActionText=\"Refresh Permissions\"\n ActionIcon=\"fa-solid fa-arrows-rotate\"\n ActionVariant=\"secondary\"\n (Action)=\"refreshUserPermissions()\" />\n } @else if (!configEnabled) {\n <!-- Not enabled in config -->\n <mj-empty-state\n Variant=\"warning\"\n Role=\"alert\"\n Title=\"SQL Logging Disabled\"\n Message=\"SQL logging is not enabled in the server configuration.\">\n <div class=\"info-box\">\n <h4>To enable SQL logging:</h4>\n <ol>\n <li>Set <code>sqlLogging.enabled = true</code> in mj.config.cjs</li>\n <li>Restart the MJ API server</li>\n <li>Refresh this page</li>\n </ol>\n </div>\n </mj-empty-state>\n } @else if (activeSessions.length === 0) {\n <!-- No active sessions -->\n <mj-empty-state\n Icon=\"fa-solid fa-file-code\"\n Title=\"No Active Sessions\"\n Message=\"Start a new SQL logging session to begin capturing SQL statements.\"\n ActionText=\"Start New Session\"\n ActionIcon=\"fa-solid fa-play\"\n (Action)=\"openStartSessionDialog()\" />\n } @else {\n <!-- Sessions layout -->\n <div class=\"sessions-layout\">\n <!-- Sessions panel -->\n <div class=\"sessions-panel\" role=\"region\" aria-label=\"Active sessions list\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">Active Sessions</h3>\n @if (activeSessions.length > 0) {\n <button mjButton\n variant=\"danger\"\n size=\"sm\"\n (click)=\"openStopAllSessionsConfirm()\"\n [disabled]=\"loading\"\n aria-label=\"Stop all active sessions\"\n >\n <i class=\"fa-solid fa-stop\" aria-hidden=\"true\"></i>\n Stop All\n </button>\n }\n </div>\n <div class=\"sessions-list\" role=\"list\" aria-label=\"SQL logging sessions\">\n @for (session of activeSessions; track session.id) {\n <div\n class=\"session-card\"\n [class.selected]=\"selectedSession?.id === session.id\"\n (click)=\"selectSession(session)\"\n role=\"listitem\"\n tabindex=\"0\"\n (keydown.enter)=\"selectSession(session)\"\n (keydown.space)=\"selectSession(session); $event.preventDefault()\"\n [attr.aria-label]=\"'Session: ' + session.sessionName + ', ' + session.statementCount + ' statements, duration ' + getSessionDuration(session.startTime)\"\n [attr.aria-selected]=\"selectedSession?.id === session.id\"\n >\n <div class=\"session-header\">\n <div class=\"session-info\">\n <h4 class=\"session-title\">{{ session.sessionName }}</h4>\n <div class=\"session-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-clock\" aria-hidden=\"true\"></i>\n {{ getSessionDuration(session.startTime) }}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n {{ session.statementCount }} statements\n </span>\n </div>\n </div>\n <button mjButton\n variant=\"danger\"\n size=\"sm\"\n (click)=\"openStopSessionConfirm(session, $event)\"\n [attr.aria-label]=\"'Stop session ' + session.sessionName\"\n >\n <i class=\"fa-solid fa-stop\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"session-badges\">\n @if (session.filterByUserId) {\n <span class=\"badge badge-user\">\n <i class=\"fa-solid fa-user\" aria-hidden=\"true\"></i>\n User Filtered\n </span>\n }\n @if (session.options?.formatAsMigration) {\n <span class=\"badge badge-migration\">\n <i class=\"fa-solid fa-code-branch\" aria-hidden=\"true\"></i>\n Migration\n </span>\n }\n <span class=\"badge badge-type\">\n {{ session.options?.statementTypes || \"both\" }}\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Log viewer panel -->\n <div class=\"log-viewer-panel\" [class.expanded]=\"isLogViewerExpanded\" role=\"region\" aria-label=\"SQL log viewer\">\n @if (selectedSession) {\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">{{ selectedSession.sessionName }}</h3>\n <div class=\"panel-actions\">\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"autoRefresh\"\n aria-label=\"Enable auto-refresh\"\n />\n Auto-refresh\n </label>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"loadSessionLog(selectedSession)\"\n aria-label=\"Refresh log content\"\n >\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"loading\" aria-hidden=\"true\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"toggleLogViewerExpand()\"\n [attr.aria-label]=\"isLogViewerExpanded ? 'Collapse log viewer' : 'Expand log viewer to fullscreen'\"\n [attr.aria-expanded]=\"isLogViewerExpanded\"\n >\n <i class=\"fa-solid\" [class.fa-expand]=\"!isLogViewerExpanded\" [class.fa-compress]=\"isLogViewerExpanded\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"log-content\">\n <mj-code-editor\n [value]=\"logContent\"\n [readonly]=\"true\"\n [disabled]=\"true\"\n [language]=\"'sql'\"\n [setup]=\"'basic'\"\n [lineWrapping]=\"true\"\n [highlightWhitespace]=\"false\"\n style=\"height: 100%\"\n aria-label=\"SQL log content\"\n ></mj-code-editor>\n </div>\n } @else {\n <mj-empty-state\n Icon=\"fa-solid fa-arrow-left\"\n Title=\"Select a Session\"\n Message=\"Choose a session from the list to view its SQL log.\" />\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Start Session Dialog -->\n @if (showStartSessionDialog) {\n <div\n class=\"modal-backdrop\"\n (click)=\"showStartSessionDialog = false\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"start-session-dialog-title\"\n >\n <div class=\"modal-dialog modal-large\" [class.fullscreen]=\"isStartDialogFullscreen\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"start-session-dialog-title\">\n <i class=\"fa-solid fa-play\" aria-hidden=\"true\"></i>\n Start SQL Logging Session\n </h3>\n <div class=\"modal-header-actions\">\n <button\n class=\"modal-action-btn\"\n (click)=\"toggleStartDialogFullscreen()\"\n [attr.aria-label]=\"isStartDialogFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'\"\n type=\"button\"\n >\n <i class=\"fa-solid\" [class.fa-compress]=\"isStartDialogFullscreen\" [class.fa-expand]=\"!isStartDialogFullscreen\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"modal-close\" (click)=\"showStartSessionDialog = false\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"session-name\">Session Name</label>\n <input\n type=\"text\"\n id=\"session-name\"\n class=\"form-input\"\n [(ngModel)]=\"newSessionOptions.sessionName\"\n placeholder=\"Enter a descriptive name for this session\"\n aria-describedby=\"session-name-hint\"\n />\n <div id=\"session-name-hint\" class=\"form-hint\">A descriptive name to identify this logging session</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"file-name\">File Name</label>\n <input\n type=\"text\"\n id=\"file-name\"\n class=\"form-input\"\n [(ngModel)]=\"newSessionOptions.fileName\"\n placeholder=\"sql-log-2024-01-01.sql\"\n aria-describedby=\"file-name-hint\"\n />\n <div id=\"file-name-hint\" class=\"form-hint\">The SQL log will be saved to this file</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"statement-types\">Statement Types</label>\n <select\n id=\"statement-types\"\n class=\"form-select\"\n [(ngModel)]=\"newSessionOptions.statementTypes\"\n aria-describedby=\"statement-types-hint\"\n >\n @for (option of statementTypeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n <div id=\"statement-types-hint\" class=\"form-hint\">Filter which types of SQL statements to capture</div>\n </div>\n\n <div class=\"form-checkboxes\" role=\"group\" aria-label=\"Session options\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"newSessionOptions.filterToCurrentUser\" />\n Filter to my SQL statements only\n </label>\n\n\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"newSessionOptions.formatAsMigration\" />\n Format as migration file\n </label>\n\n\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"newSessionOptions.prettyPrint\" />\n Pretty print SQL statements\n </label>\n </div>\n\n <!-- SQL Pattern Filtering Section -->\n <div class=\"form-section\">\n <h4 class=\"form-section-title\">\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n SQL Pattern Filtering\n </h4>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"filter-type\">Filter Mode</label>\n <select\n id=\"filter-type\"\n class=\"form-select\"\n [(ngModel)]=\"newSessionOptions.filterType\"\n aria-describedby=\"filter-type-hint\"\n >\n @for (option of filterTypeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n <div id=\"filter-type-hint\" class=\"form-hint\">Exclude: Skip SQL matching any pattern. Include: Only log SQL matching a pattern.</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"filter-patterns\">Filter Patterns (one per line or comma-separated)</label>\n <textarea\n id=\"filter-patterns\"\n class=\"form-textarea\"\n [(ngModel)]=\"newSessionOptions.filterPatterns\"\n rows=\"4\"\n placeholder=\"Examples:&#10;*AIPrompt*&#10;/spCreate.*Run/i&#10;SELECT * FROM vwMetadata\"\n aria-describedby=\"filter-patterns-hint\"\n ></textarea>\n <div id=\"filter-patterns-hint\" class=\"form-hint\">Supports wildcards (*) and regex (/pattern/flags). Example: *spCreate* matches any SP starting with spCreate.</div>\n </div>\n </div>\n\n <!-- Advanced Options Section -->\n <div class=\"form-section\">\n <h4 class=\"form-section-title\">\n <i class=\"fa-solid fa-cog\" aria-hidden=\"true\"></i>\n Advanced Options\n </h4>\n\n @if (newSessionOptions.formatAsMigration) {\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"default-schema\">Default Schema Name</label>\n <input\n type=\"text\"\n id=\"default-schema\"\n class=\"form-input\"\n [(ngModel)]=\"newSessionOptions.defaultSchemaName\"\n placeholder=\"__mj\"\n aria-describedby=\"default-schema-hint\"\n />\n <div id=\"default-schema-hint\" class=\"form-hint\">Schema name to replace with $&#123;flyway:defaultSchema&#125; placeholder.</div>\n </div>\n }\n\n <div class=\"form-checkboxes\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"newSessionOptions.verboseOutput\" />\n Verbose Debug Output\n </label>\n <div class=\"form-hint\" style=\"margin-left: 1.75rem\">Log detailed filter decisions to server console (for debugging).</div>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button mjButton variant=\"primary\" size=\"md\" (click)=\"startNewSession()\" [disabled]=\"loading\" aria-label=\"Start the SQL logging session\">\n @if (loading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Starting...\n } @else {\n <i class=\"fa-solid fa-play\" aria-hidden=\"true\"></i>\n Start Session\n }\n </button>\n <button mjButton variant=\"secondary\" size=\"md\" (click)=\"showStartSessionDialog = false\" aria-label=\"Cancel and close dialog\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- Stop Session Confirmation Dialog -->\n @if (showStopConfirmDialog) {\n <div\n class=\"modal-backdrop\"\n (click)=\"cancelStopConfirm()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"stop-dialog-title\"\n aria-describedby=\"stop-dialog-desc\"\n >\n <div class=\"confirm-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"confirm-dialog-icon\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"confirm-dialog-content\">\n <h3 class=\"confirm-dialog-title\" id=\"stop-dialog-title\">\n @if (isStoppingAll) {\n Stop All Sessions?\n } @else {\n Stop Session?\n }\n </h3>\n <p class=\"confirm-dialog-message\" id=\"stop-dialog-desc\">\n @if (isStoppingAll) {\n Are you sure you want to stop <strong>all {{ activeSessions.length }} active</strong> SQL logging sessions? This action cannot be undone.\n } @else if (sessionToStop) {\n Are you sure you want to stop the session <strong>\"{{ sessionToStop.sessionName }}\"</strong>?\n <span class=\"confirm-dialog-details\"> This session has captured {{ sessionToStop.statementCount }} SQL statements. </span>\n }\n </p>\n </div>\n <div class=\"confirm-dialog-actions\">\n <button mjButton variant=\"danger\" size=\"md\" (click)=\"confirmStopSession()\" [disabled]=\"loading\" [attr.aria-label]=\"isStoppingAll ? 'Confirm stop all sessions' : 'Confirm stop session'\">\n @if (loading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Stopping...\n } @else {\n <i class=\"fa-solid fa-stop\" aria-hidden=\"true\"></i>\n @if (isStoppingAll) {\n Stop All Sessions\n } @else {\n Stop Session\n }\n }\n </button>\n <button mjButton variant=\"secondary\" size=\"md\" (click)=\"cancelStopConfirm()\" [disabled]=\"loading\" aria-label=\"Cancel and keep sessions running\">Cancel</button>\n </div>\n </div>\n </div>\n }\n</mj-page-body-interior>\n"]}
1
+ {"version":3,"file":"sql-logging.component.js","sourceRoot":"","sources":["../../../src/lib/sql-logging/sql-logging.component.ts","../../../src/lib/sql-logging/sql-logging.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnDestroy, HostListener, ChangeDetectorRef } from '@angular/core';\nimport { Subject, interval } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { Metadata } from '@memberjunction/core';\nimport { SharedService, BaseDashboard } from '@memberjunction/ng-shared';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { RegisterClass } from '@memberjunction/global';\nimport { ResourceData } from '@memberjunction/core-entities';\n\n/** Session options for SQL logging */\ninterface SqlLoggingSessionOptions {\n formatAsMigration: boolean;\n statementTypes: string;\n prettyPrint: boolean;\n}\n\n/** Represents an active SQL logging session */\ninterface SqlLoggingSession {\n id: string;\n filePath: string;\n startTime: string;\n statementCount: number;\n sessionName: string;\n filterByUserId?: string;\n options?: SqlLoggingSessionOptions;\n}\n\n/** SQL logging configuration from the server */\ninterface SqlLoggingConfig {\n enabled: boolean;\n allowedLogDirectory?: string;\n maxActiveSessions?: number;\n autoCleanupEmptyFiles?: boolean;\n sessionTimeout?: number;\n activeSessionCount?: number;\n defaultOptions?: SqlLoggingSessionOptions;\n}\n\n/**\n * Angular component for managing SQL logging sessions in MemberJunction.\n *\n * This component provides a user interface for:\n * - Viewing SQL logging configuration and status\n * - Starting and stopping SQL logging sessions\n * - Managing session options (filtering, formatting, etc.)\n * - Real-time monitoring of active sessions\n *\n * **Security**: Only users with 'Owner' type can access SQL logging features.\n *\n * @example\n * ```html\n * <mj-sql-logging></mj-sql-logging>\n * ```\n *\n * @requires Owner-level user privileges\n * @requires SQL logging enabled in server configuration\n */\n@Component({\n standalone: false,\n selector: 'mj-sql-logging',\n templateUrl: './sql-logging.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './sql-logging.component.css'],\n})\n@RegisterClass(BaseDashboard, 'SqlLogging')\nexport class SqlLoggingComponent extends BaseDashboard implements OnDestroy {\n protected override destroy$ = new Subject<void>();\n\n /** Whether the component is currently performing an async operation */\n Loading = false;\n\n /** @deprecated Use {@link Loading}. */\n get loading() {\n return this.Loading;\n }\n /** @deprecated Use {@link Loading}. */\n set loading(value) {\n this.Loading = value;\n }\n\n /** Current error message to display to the user, if any */\n error: string | null = null;\n\n /** Whether the current user has Owner privileges to access SQL logging */\n isOwner = false;\n\n /** Whether SQL logging is enabled in the server configuration */\n ConfigEnabled = false;\n\n /** @deprecated Use {@link ConfigEnabled}. */\n get configEnabled() {\n return this.ConfigEnabled;\n }\n /** @deprecated Use {@link ConfigEnabled}. */\n set configEnabled(value) {\n this.ConfigEnabled = value;\n }\n\n /** Current SQL logging configuration from the server */\n SqlLoggingConfig: SqlLoggingConfig | null = null;\n\n /** @deprecated Use {@link SqlLoggingConfig}. */\n get sqlLoggingConfig(): SqlLoggingConfig | null {\n return this.SqlLoggingConfig;\n }\n /** @deprecated Use {@link SqlLoggingConfig}. */\n set sqlLoggingConfig(value: SqlLoggingConfig | null) {\n this.SqlLoggingConfig = value;\n }\n\n /** List of currently active SQL logging sessions */\n ActiveSessions: SqlLoggingSession[] = [];\n\n /** @deprecated Use {@link ActiveSessions}. */\n get activeSessions(): SqlLoggingSession[] {\n return this.ActiveSessions;\n }\n /** @deprecated Use {@link ActiveSessions}. */\n set activeSessions(value: SqlLoggingSession[]) {\n this.ActiveSessions = value;\n }\n\n /** Currently selected session for viewing logs */\n SelectedSession: SqlLoggingSession | null = null;\n\n /** @deprecated Use {@link SelectedSession}. */\n get selectedSession(): SqlLoggingSession | null {\n return this.SelectedSession;\n }\n /** @deprecated Use {@link SelectedSession}. */\n set selectedSession(value: SqlLoggingSession | null) {\n this.SelectedSession = value;\n }\n\n /** Content of the currently viewed log file */\n LogContent = '';\n\n /** @deprecated Use {@link LogContent}. */\n get logContent() {\n return this.LogContent;\n }\n /** @deprecated Use {@link LogContent}. */\n set logContent(value) {\n this.LogContent = value;\n }\n\n /** Whether to automatically refresh session data */\n AutoRefresh = false;\n\n /** @deprecated Use {@link AutoRefresh}. */\n get autoRefresh() {\n return this.AutoRefresh;\n }\n /** @deprecated Use {@link AutoRefresh}. */\n set autoRefresh(value) {\n this.AutoRefresh = value;\n }\n\n /** Interval in milliseconds for auto-refresh functionality */\n RefreshInterval = 5000;\n\n /** @deprecated Use {@link RefreshInterval}. */\n get refreshInterval() {\n return this.RefreshInterval;\n }\n /** @deprecated Use {@link RefreshInterval}. */\n set refreshInterval(value) {\n this.RefreshInterval = value;\n } // 5 seconds\n\n /** Whether the start session dialog is currently visible */\n ShowStartSessionDialog = false;\n\n /** @deprecated Use {@link ShowStartSessionDialog}. */\n get showStartSessionDialog() {\n return this.ShowStartSessionDialog;\n }\n /** @deprecated Use {@link ShowStartSessionDialog}. */\n set showStartSessionDialog(value) {\n this.ShowStartSessionDialog = value;\n }\n\n /** Whether to show the statistics cards section */\n ShowStats = false;\n\n /** @deprecated Use {@link ShowStats}. */\n get showStats() {\n return this.ShowStats;\n }\n /** @deprecated Use {@link ShowStats}. */\n set showStats(value) {\n this.ShowStats = value;\n }\n\n /** Whether the log viewer is in expanded (fullscreen) mode */\n IsLogViewerExpanded = false;\n\n /** @deprecated Use {@link IsLogViewerExpanded}. */\n get isLogViewerExpanded() {\n return this.IsLogViewerExpanded;\n }\n /** @deprecated Use {@link IsLogViewerExpanded}. */\n set isLogViewerExpanded(value) {\n this.IsLogViewerExpanded = value;\n }\n\n /** Whether the start session dialog is in fullscreen mode */\n IsStartDialogFullscreen = false;\n\n /** @deprecated Use {@link IsStartDialogFullscreen}. */\n get isStartDialogFullscreen() {\n return this.IsStartDialogFullscreen;\n }\n /** @deprecated Use {@link IsStartDialogFullscreen}. */\n set isStartDialogFullscreen(value) {\n this.IsStartDialogFullscreen = value;\n }\n\n /** Whether the stop session confirmation dialog is visible */\n ShowStopConfirmDialog = false;\n\n /** @deprecated Use {@link ShowStopConfirmDialog}. */\n get showStopConfirmDialog() {\n return this.ShowStopConfirmDialog;\n }\n /** @deprecated Use {@link ShowStopConfirmDialog}. */\n set showStopConfirmDialog(value) {\n this.ShowStopConfirmDialog = value;\n }\n\n /** Session pending stop confirmation (single session or null for all) */\n SessionToStop: SqlLoggingSession | null = null;\n\n /** @deprecated Use {@link SessionToStop}. */\n get sessionToStop(): SqlLoggingSession | null {\n return this.SessionToStop;\n }\n /** @deprecated Use {@link SessionToStop}. */\n set sessionToStop(value: SqlLoggingSession | null) {\n this.SessionToStop = value;\n }\n\n /** Whether stopping all sessions (vs single session) */\n IsStoppingAll = false;\n\n /** @deprecated Use {@link IsStoppingAll}. */\n get isStoppingAll() {\n return this.IsStoppingAll;\n }\n /** @deprecated Use {@link IsStoppingAll}. */\n set isStoppingAll(value) {\n this.IsStoppingAll = value;\n }\n\n /** Options for creating a new SQL logging session */\n NewSessionOptions = {\n /** Custom filename for the log file */\n fileName: '',\n /** Whether to filter SQL statements to current user only */\n filterToCurrentUser: true,\n /** Whether to format output as migration file */\n formatAsMigration: false,\n /** Types of SQL statements to capture */\n statementTypes: 'both' as 'queries' | 'mutations' | 'both',\n /** Whether to format SQL with proper indentation */\n prettyPrint: true,\n /** Human-readable name for the session */\n sessionName: '',\n /** Regex filter options */\n filterPatterns: '' as string, // Comma or newline separated patterns\n filterType: 'exclude' as 'include' | 'exclude',\n verboseOutput: false,\n defaultSchemaName: '__mj', // Default MJ schema\n };\n\n /** @deprecated Use {@link NewSessionOptions}. */\n get newSessionOptions() {\n return this.NewSessionOptions;\n }\n /** @deprecated Use {@link NewSessionOptions}. */\n set newSessionOptions(value) {\n this.NewSessionOptions = value;\n }\n\n /** Available options for SQL statement type filtering */\n StatementTypeOptions = [\n { text: 'Both Queries and Mutations', value: 'both' },\n { text: 'Queries Only', value: 'queries' },\n { text: 'Mutations Only', value: 'mutations' },\n ];\n\n /** @deprecated Use {@link StatementTypeOptions}. */\n get statementTypeOptions() {\n return this.StatementTypeOptions;\n }\n /** @deprecated Use {@link StatementTypeOptions}. */\n set statementTypeOptions(value) {\n this.StatementTypeOptions = value;\n }\n\n /** Options for Regex filter */\n FilterTypeOptions = [\n { text: 'Exclude Matching (default)', value: 'exclude' },\n { text: 'Include Matching Only', value: 'include' },\n ];\n\n /** @deprecated Use {@link FilterTypeOptions}. */\n get filterTypeOptions() {\n return this.FilterTypeOptions;\n }\n /** @deprecated Use {@link FilterTypeOptions}. */\n set filterTypeOptions(value) {\n this.FilterTypeOptions = value;\n }\n\n constructor(\n private sharedService: SharedService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'SQL Logging';\n }\n\n protected initDashboard(): void {\n this.startAutoRefresh();\n }\n\n protected async loadData(): Promise<void> {\n await this.checkUserPermissions();\n if (this.isOwner) {\n await this.LoadSqlLoggingConfig();\n await this.LoadActiveSessions();\n }\n }\n\n override ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n super.ngOnDestroy();\n }\n\n /**\n * Starts the auto-refresh timer for session data.\n * Only refreshes when autoRefresh is enabled and user is Owner.\n *\n * @private\n */\n private startAutoRefresh() {\n interval(this.RefreshInterval)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n if (this.AutoRefresh && this.isOwner) {\n this.LoadActiveSessions();\n if (this.SelectedSession) {\n this.LoadSessionLog(this.SelectedSession);\n }\n }\n });\n }\n\n /**\n * Checks if the current user has Owner privileges required for SQL logging.\n * Updates the isOwner flag and handles error states.\n *\n * @private\n */\n private async checkUserPermissions() {\n try {\n // Try multiple ways to get the current user\n const md = this.ProviderToUse;\n const currentUser = md.CurrentUser;\n\n console.log('Method 1 - Metadata.CurrentUser:', {\n email: currentUser?.Email,\n type: currentUser?.Type,\n name: currentUser?.Name,\n id: currentUser?.ID,\n });\n\n // Use the current user from Metadata\n const userToCheck = currentUser;\n\n if (userToCheck && userToCheck.Type?.trim().toLowerCase() === 'owner') {\n this.isOwner = true;\n console.log('User is an Owner - SQL logging features enabled');\n } else {\n this.isOwner = false;\n this.error = 'SQL logging requires Owner privileges';\n console.log('User is NOT an Owner. Type:', userToCheck?.Type);\n\n // Also check if it's a string comparison issue\n if (userToCheck) {\n console.log('Type value (raw):', JSON.stringify(userToCheck.Type));\n console.log('Type trimmed:', JSON.stringify(userToCheck.Type?.trim()));\n console.log('Type comparison:', userToCheck.Type?.trim().toLowerCase(), '===', 'owner', ':', userToCheck.Type?.trim().toLowerCase() === 'owner');\n }\n }\n } catch (error) {\n console.error('Error checking user permissions:', error);\n this.isOwner = false;\n this.error = 'Error checking permissions';\n }\n }\n\n /**\n * Opens the dialog for creating a new SQL logging session.\n * Sets default values for session name and filename.\n */\n OpenStartSessionDialog() {\n // Set default session name\n const currentUser = this.ProviderToUse.CurrentUser;\n this.NewSessionOptions.sessionName = `SQL Logging - ${currentUser?.Name || currentUser?.Email || 'Unknown'} - ${new Date().toLocaleString()}`;\n this.NewSessionOptions.fileName = `sql-log-${new Date().toISOString().replace(/[:.]/g, '-')}.sql`;\n this.ShowStartSessionDialog = true;\n }\n\n /** @deprecated Use {@link OpenStartSessionDialog}. */\n openStartSessionDialog() {\n return this.OpenStartSessionDialog();\n }\n\n /**\n * Creates and starts a new SQL logging session with the configured options.\n * Shows success/error notifications and refreshes the sessions list.\n */\n async StartNewSession() {\n try {\n this.Loading = true;\n\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const mutation = `\n mutation StartSqlLogging($input: StartSqlLoggingInput!) {\n startSqlLogging(input: $input) {\n id\n filePath\n startTime\n statementCount\n sessionName\n filterByUserId\n options {\n formatAsMigration\n statementTypes\n prettyPrint\n }\n }\n }\n `;\n\n const variables = {\n input: {\n fileName: this.NewSessionOptions.fileName,\n filterToCurrentUser: this.NewSessionOptions.filterToCurrentUser,\n options: {\n formatAsMigration: this.NewSessionOptions.formatAsMigration,\n statementTypes: this.NewSessionOptions.statementTypes,\n prettyPrint: this.NewSessionOptions.prettyPrint,\n sessionName: this.NewSessionOptions.sessionName,\n // Regex Filter Option\n filterPatterns: this.parseFilterPatterns(this.NewSessionOptions.filterPatterns),\n filterType: this.NewSessionOptions.filterType,\n verboseOutput: this.NewSessionOptions.verboseOutput,\n defaultSchemaName: this.NewSessionOptions.defaultSchemaName,\n },\n },\n };\n\n const result = await dataProvider.ExecuteGQL(mutation, variables);\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n const newSession = result?.startSqlLogging;\n\n if (!newSession) {\n throw new Error('Failed to start SQL logging session - no session data returned');\n }\n\n MJNotificationService.Instance.CreateSimpleNotification(`SQL logging session started: ${newSession.sessionName}`, 'success', 5000);\n\n this.ShowStartSessionDialog = false;\n await this.LoadActiveSessions();\n this.SelectSession(newSession);\n } catch (error: any) {\n console.error('Error starting SQL logging session:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${error.message || 'Failed to start SQL logging session'}`, 'error', 5000);\n } finally {\n this.Loading = false;\n }\n }\n\n /** @deprecated Use {@link StartNewSession}. */\n async startNewSession() {\n return this.StartNewSession();\n }\n\n /**\n * Executes the stop operation for a specific SQL logging session.\n * Called after user confirms via the confirmation dialog.\n *\n * @param session - The session object to stop\n */\n private async executeStopSession(session: SqlLoggingSession) {\n try {\n this.Loading = true;\n\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const mutation = `\n mutation StopSqlLogging($sessionId: String!) {\n stopSqlLogging(sessionId: $sessionId)\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(mutation, { sessionId: session.id });\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n MJNotificationService.Instance.CreateSimpleNotification('SQL logging session stopped', 'success', 3000);\n\n if (this.SelectedSession?.id === session.id) {\n this.SelectedSession = null;\n this.LogContent = '';\n }\n\n await this.LoadActiveSessions();\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to stop SQL logging session';\n console.error('Error stopping SQL logging session:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${errorMessage}`, 'error', 5000);\n } finally {\n this.Loading = false;\n }\n }\n\n /**\n * Executes the stop operation for all active SQL logging sessions.\n * Called after user confirms via the confirmation dialog.\n */\n private async executeStopAllSessions() {\n try {\n this.Loading = true;\n\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const mutation = `\n mutation StopAllSqlLogging {\n stopAllSqlLogging\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(mutation, {});\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n MJNotificationService.Instance.CreateSimpleNotification('All SQL logging sessions stopped', 'success', 3000);\n\n this.SelectedSession = null;\n this.LogContent = '';\n await this.LoadActiveSessions();\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to stop all SQL logging sessions';\n console.error('Error stopping all SQL logging sessions:', error);\n MJNotificationService.Instance.CreateSimpleNotification(`Error: ${errorMessage}`, 'error', 5000);\n } finally {\n this.Loading = false;\n }\n }\n\n /**\n * Selects a session for viewing and loads its log content.\n *\n * @param session - The session to select\n */\n SelectSession(session: any) {\n this.SelectedSession = session;\n this.LoadSessionLog(session);\n }\n\n /** @deprecated Use {@link SelectSession}. */\n selectSession(session: any) {\n return this.SelectSession(session);\n }\n\n /**\n * Loads the log file content for a specific session using real-time GraphQL query.\n * Reads actual SQL statements from the log file on the server.\n *\n * @param session - The session whose log to load\n */\n async LoadSessionLog(session: any) {\n try {\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const query = `\n query ReadSqlLogFile($sessionId: String!, $maxLines: Int) {\n readSqlLogFile(sessionId: $sessionId, maxLines: $maxLines)\n }\n `;\n\n const variables = {\n sessionId: session.id,\n maxLines: 1000, // Limit to last 1000 lines for performance\n };\n\n const result = await dataProvider.ExecuteGQL(query, variables);\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n const logContent = result?.readSqlLogFile || '';\n\n // Add session header information (show only filename for security)\n const fileName = session.filePath ? session.filePath.split(/[\\\\\\/]/).pop() : 'unknown';\n const header =\n `-- =====================================================\\n` +\n `-- SQL Log File: ${fileName}\\n` +\n `-- Session: ${session.sessionName}\\n` +\n `-- Started: ${new Date(session.startTime).toLocaleString()}\\n` +\n `-- Statements Captured: ${session.statementCount}\\n` +\n `-- User Filter: ${session.filterByUserId || 'All Users'}\\n` +\n `-- Statement Types: ${session.options?.statementTypes || 'both'}\\n` +\n `-- Pretty Print: ${session.options?.prettyPrint ? 'Yes' : 'No'}\\n` +\n `-- Migration Format: ${session.options?.formatAsMigration ? 'Yes' : 'No'}\\n` +\n `-- =====================================================\\n\\n`;\n\n this.LogContent = header + (logContent || '-- No SQL statements captured yet --');\n } catch (error: any) {\n console.error('Error loading session log:', error);\n this.LogContent =\n `-- Error loading log file --\\n-- ${error.message || 'Unknown error occurred'} --\\n\\n` +\n `-- Session Info --\\n` +\n `-- File: ${session.filePath}\\n` +\n `-- Session: ${session.sessionName}\\n` +\n `-- Started: ${new Date(session.startTime).toLocaleString()}\\n`;\n }\n }\n\n /** @deprecated Use {@link LoadSessionLog}. */\n async loadSessionLog(session: any) {\n return this.LoadSessionLog(session);\n }\n\n /**\n * Loads the SQL logging configuration from the server.\n * Updates component state with current settings and capabilities.\n *\n * @private\n */\n async LoadSqlLoggingConfig() {\n try {\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const query = `\n query SqlLoggingConfig {\n sqlLoggingConfig {\n enabled\n allowedLogDirectory\n maxActiveSessions\n autoCleanupEmptyFiles\n sessionTimeout\n activeSessionCount\n defaultOptions {\n formatAsMigration\n statementTypes\n batchSeparator\n prettyPrint\n logRecordChangeMetadata\n retainEmptyLogFiles\n }\n }\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(query, {});\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n // Debug logging to understand the response structure\n console.log('SQL Logging Config Result:', result);\n console.log('Result keys:', Object.keys(result || {}));\n console.log('Direct result.sqlLoggingConfig:', result?.sqlLoggingConfig);\n\n // Access the data directly from the result, matching AI prompt pattern\n const configData = result?.sqlLoggingConfig;\n console.log('Extracted config data:', configData);\n\n this.SqlLoggingConfig = configData || null;\n this.ConfigEnabled = this.SqlLoggingConfig?.enabled || false;\n this.cdr.detectChanges();\n\n console.log('Component state after update:');\n console.log(' this.sqlLoggingConfig:', this.SqlLoggingConfig);\n console.log(' this.configEnabled:', this.ConfigEnabled);\n console.log(' this.isOwner:', this.isOwner);\n } catch (error: any) {\n console.error('Error loading SQL logging config:', error);\n this.error = error.message || 'Failed to load SQL logging configuration';\n }\n }\n\n /** @deprecated Use {@link LoadSqlLoggingConfig}. */\n async loadSqlLoggingConfig() {\n return this.LoadSqlLoggingConfig();\n }\n\n /**\n * Loads the list of currently active SQL logging sessions.\n * Updates the activeSessions array and handles session selection state.\n *\n * @private\n */\n async LoadActiveSessions() {\n try {\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const query = `\n query ActiveSqlLoggingSessions {\n activeSqlLoggingSessions {\n id\n filePath\n startTime\n statementCount\n sessionName\n filterByUserId\n options {\n formatAsMigration\n statementTypes\n prettyPrint\n }\n }\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(query, {});\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n // Debug logging to understand the response structure\n console.log('Active Sessions Result:', result);\n console.log('Result keys:', Object.keys(result || {}));\n\n // Access the data directly from the result, matching AI prompt pattern\n const sessionsData = result?.activeSqlLoggingSessions;\n console.log('Extracted sessions data:', sessionsData);\n\n this.ActiveSessions = sessionsData || [];\n this.cdr.detectChanges();\n\n // Update selected session if it still exists\n if (this.SelectedSession) {\n const selectedId = this.SelectedSession.id;\n const stillExists = this.ActiveSessions.find((s) => s.id === selectedId);\n if (stillExists) {\n this.SelectedSession = stillExists;\n } else {\n this.SelectedSession = null;\n this.LogContent = '';\n }\n }\n } catch (error: any) {\n console.error('Error loading active sessions:', error);\n }\n }\n\n /** @deprecated Use {@link LoadActiveSessions}. */\n async loadActiveSessions() {\n return this.LoadActiveSessions();\n }\n\n /**\n * Calculates and formats the duration of a logging session.\n *\n * @param startTime - ISO string of when the session started\n * @returns Formatted duration string (e.g., \"2h 30m\", \"45m 23s\", \"12s\")\n */\n GetSessionDuration(startTime: string): string {\n const start = new Date(startTime);\n const now = new Date();\n const diff = now.getTime() - start.getTime();\n\n const hours = Math.floor(diff / (1000 * 60 * 60));\n const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));\n const seconds = Math.floor((diff % (1000 * 60)) / 1000);\n\n if (hours > 0) {\n return `${hours}h ${minutes}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n /** @deprecated Use {@link GetSessionDuration}. */\n getSessionDuration(startTime: string): string {\n return this.GetSessionDuration(startTime);\n }\n\n /**\n * Refreshes user data and re-checks permissions.\n * Useful when user privileges have been updated.\n */\n async RefreshUserPermissions() {\n console.log('Refreshing user permissions...');\n this.Loading = true;\n\n try {\n // Try to refresh SharedService data\n await SharedService.RefreshData(false);\n\n // Wait a moment for data to propagate\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Re-check permissions\n await this.checkUserPermissions();\n\n console.log('Permissions refreshed');\n } catch (error) {\n console.error('Error refreshing permissions:', error);\n } finally {\n this.Loading = false;\n }\n }\n\n /** @deprecated Use {@link RefreshUserPermissions}. */\n async refreshUserPermissions() {\n return this.RefreshUserPermissions();\n }\n\n /**\n * Extracts the filename from a full file path for security purposes.\n * Only shows the filename, not the full server path.\n *\n * @param filePath - Full file path from server\n * @returns Just the filename portion\n */\n GetFileName(filePath: string): string {\n if (!filePath) return 'unknown';\n return filePath.split(/[\\\\\\/]/).pop() || 'unknown';\n }\n\n /** @deprecated Use {@link GetFileName}. */\n getFileName(filePath: string): string {\n return this.GetFileName(filePath);\n }\n\n /**\n * Calculates the total number of SQL statements across all active sessions.\n * @returns Total statement count\n */\n GetTotalStatementCount(): number {\n return this.ActiveSessions.reduce((sum, session) => sum + (session.statementCount || 0), 0);\n }\n\n /** @deprecated Use {@link GetTotalStatementCount}. */\n getTotalStatementCount(): number {\n return this.GetTotalStatementCount();\n }\n\n /**\n * Parses a string of filter patterns (comma or newline separated) into an array\n * @param patternsString - Comma or newline separated patterns\n * @returns Array of pattern strings, or undefined if empty\n */\n private parseFilterPatterns(patternsString: string): string[] | undefined {\n if (!patternsString || !patternsString.trim()) {\n return undefined;\n }\n\n /** Split by comma or newline, trim whitespace, filter empty */\n return patternsString\n .split(/[,\\n]/)\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n }\n\n /**\n * Toggles the log viewer between normal and expanded (fullscreen) mode.\n */\n ToggleLogViewerExpand() {\n this.IsLogViewerExpanded = !this.IsLogViewerExpanded;\n }\n\n /** @deprecated Use {@link ToggleLogViewerExpand}. */\n toggleLogViewerExpand() {\n return this.ToggleLogViewerExpand();\n }\n\n /**\n * Toggles the start session dialog between normal and fullscreen mode.\n */\n ToggleStartDialogFullscreen() {\n this.IsStartDialogFullscreen = !this.IsStartDialogFullscreen;\n }\n\n /** @deprecated Use {@link ToggleStartDialogFullscreen}. */\n toggleStartDialogFullscreen() {\n return this.ToggleStartDialogFullscreen();\n }\n\n /**\n * Handles keyboard events for the component.\n * Closes expanded log viewer or confirmation dialog when Escape is pressed.\n */\n @HostListener('document:keydown.escape')\n onEscapeKey() {\n if (this.ShowStopConfirmDialog) {\n this.CancelStopConfirm();\n } else if (this.IsLogViewerExpanded) {\n this.IsLogViewerExpanded = false;\n } else if (this.IsStartDialogFullscreen) {\n this.IsStartDialogFullscreen = false;\n } else if (this.ShowStartSessionDialog) {\n this.ShowStartSessionDialog = false;\n }\n }\n\n /**\n * Opens the confirmation dialog for stopping a single session.\n *\n * @param session - The session to stop\n * @param event - Optional event to stop propagation\n */\n OpenStopSessionConfirm(session: SqlLoggingSession, event?: Event) {\n if (event) {\n event.stopPropagation();\n }\n this.SessionToStop = session;\n this.IsStoppingAll = false;\n this.ShowStopConfirmDialog = true;\n }\n\n /** @deprecated Use {@link OpenStopSessionConfirm}. */\n openStopSessionConfirm(session: SqlLoggingSession, event?: Event) {\n return this.OpenStopSessionConfirm(session, event);\n }\n\n /**\n * Opens the confirmation dialog for stopping all sessions.\n */\n OpenStopAllSessionsConfirm() {\n this.SessionToStop = null;\n this.IsStoppingAll = true;\n this.ShowStopConfirmDialog = true;\n }\n\n /** @deprecated Use {@link OpenStopAllSessionsConfirm}. */\n openStopAllSessionsConfirm() {\n return this.OpenStopAllSessionsConfirm();\n }\n\n /**\n * Closes the stop confirmation dialog without taking action.\n */\n CancelStopConfirm() {\n this.ShowStopConfirmDialog = false;\n this.SessionToStop = null;\n this.IsStoppingAll = false;\n }\n\n /** @deprecated Use {@link CancelStopConfirm}. */\n cancelStopConfirm() {\n return this.CancelStopConfirm();\n }\n\n /**\n * Confirms and executes the stop action (single session or all sessions).\n */\n async ConfirmStopSession() {\n if (this.IsStoppingAll) {\n await this.executeStopAllSessions();\n } else if (this.SessionToStop) {\n await this.executeStopSession(this.SessionToStop);\n }\n this.CancelStopConfirm();\n }\n\n /** @deprecated Use {@link ConfirmStopSession}. */\n async confirmStopSession() {\n return this.ConfirmStopSession();\n }\n\n /**\n * Debug method to test contextUser flow for SQL filtering.\n * This shows how the new architecture handles user context without storing email in provider.\n */\n async DebugUserEmail() {\n try {\n this.Loading = true;\n\n const dataProvider = this.ProviderToUse as GraphQLDataProvider;\n const query = `\n query DebugCurrentUserEmail {\n debugCurrentUserEmail\n }\n `;\n\n const result = await dataProvider.ExecuteGQL(query, {});\n\n if (result.errors) {\n throw new Error(result.errors[0].message);\n }\n\n const debugInfo = result?.debugCurrentUserEmail || 'No debug info returned';\n\n alert(`Context User Info:\\n\\n${debugInfo}\\n\\nThe system now passes user context through method calls instead of storing it in the provider.`);\n } catch (error: any) {\n console.error('Error getting context user info:', error);\n alert(`Error: ${error.message || 'Failed to get debug info'}`);\n } finally {\n this.Loading = false;\n }\n }\n\n /** @deprecated Use {@link DebugUserEmail}. */\n async debugUserEmail() {\n return this.DebugUserEmail();\n }\n}\n","<!--\n Interior chrome — sub-page of Admin's Monitoring left-nav shell. Single section\n (no L2 tab nav) so [toolbar] is empty; actions land in [actions]. See Section 10\n of plans/explorer-chrome-conventions.md.\n-->\n<mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"SQL logging actions\"\n Title=\"SQL Logging\"\n Subtitle=\"Capture and download SQL statements executed by the API\">\n <div actions>\n <mj-refresh-button\n [Loading]=\"loading\"\n (Clicked)=\"loadActiveSessions()\">\n </mj-refresh-button>\n @if (isOwner && configEnabled) {\n <button mjButton\n variant=\"primary\"\n size=\"sm\"\n [disabled]=\"loading || activeSessions.length >= (sqlLoggingConfig?.maxActiveSessions || 5)\"\n (click)=\"openStartSessionDialog()\"\n [attr.aria-label]=\"'Start new SQL logging session' + (activeSessions.length >= (sqlLoggingConfig?.maxActiveSessions || 5) ? ' (maximum sessions reached)' : '')\">\n <i class=\"fa-solid fa-play\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">Start New Session</span>\n </button>\n }\n </div>\n</mj-page-header-interior>\n\n<mj-page-body-interior>\n\n <!-- Stats Cards with Toggle -->\n @if (isOwner && configEnabled) {\n <mj-accordion-panel class=\"stats-toggle-container\" Size=\"sm\" [(Expanded)]=\"showStats\">\n <ng-template mjAccordionTitle>\n <div class=\"stats-toggle-icon\">\n <i class=\"fa-solid fa-chart-line\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stats-toggle-text\">\n <h3 class=\"stats-toggle-title\">Statistics</h3>\n <p class=\"stats-toggle-subtitle\">View session statistics and metrics</p>\n </div>\n </ng-template>\n <ng-template mjAccordionBody>\n <div id=\"stats-grid-content\" class=\"stats-grid\" role=\"region\" aria-label=\"SQL logging statistics\">\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-status\">\n <i class=\"fa-solid fa-power-off\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" [attr.aria-label]=\"'Status: ' + (configEnabled ? 'Enabled' : 'Disabled')\">\n {{ configEnabled ? \"Enabled\" : \"Disabled\" }}\n </div>\n <div class=\"stat-label\">Status</div>\n </div>\n </div>\n\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-active\">\n <i class=\"fa-solid fa-play-circle\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" [attr.aria-label]=\"activeSessions.length + ' active sessions'\">\n {{ activeSessions.length }}\n </div>\n <div class=\"stat-label\">Active Sessions</div>\n </div>\n </div>\n\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-limit\">\n <i class=\"fa-solid fa-gauge-high\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" [attr.aria-label]=\"(sqlLoggingConfig?.maxActiveSessions || 5) + ' maximum sessions allowed'\">\n {{ sqlLoggingConfig?.maxActiveSessions || 5 }}\n </div>\n <div class=\"stat-label\">Max Sessions</div>\n </div>\n </div>\n\n <div class=\"stat-card\">\n <div class=\"stat-icon stat-icon-total\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" [attr.aria-label]=\"getTotalStatementCount() + ' total SQL statements captured'\">\n {{ getTotalStatementCount() }}\n </div>\n <div class=\"stat-label\">Total Statements</div>\n </div>\n </div>\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Loading State -->\n @if (loading && !activeSessions.length) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <mj-loading text=\"Loading SQL logging configuration...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Content Area -->\n @if (!loading || activeSessions.length > 0) {\n <div class=\"content-area\">\n @if (!isOwner) {\n <!-- Not authorized -->\n <mj-empty-state\n Variant=\"error\"\n Icon=\"fa-solid fa-lock\"\n Title=\"Access Denied\"\n Message=\"SQL logging requires Owner privileges. Please contact your system administrator for access.\"\n ActionText=\"Refresh Permissions\"\n ActionIcon=\"fa-solid fa-arrows-rotate\"\n ActionVariant=\"secondary\"\n (Action)=\"refreshUserPermissions()\" />\n } @else if (!configEnabled) {\n <!-- Not enabled in config -->\n <mj-empty-state\n Variant=\"warning\"\n Role=\"alert\"\n Title=\"SQL Logging Disabled\"\n Message=\"SQL logging is not enabled in the server configuration.\">\n <div class=\"info-box\">\n <h4>To enable SQL logging:</h4>\n <ol>\n <li>Set <code>sqlLogging.enabled = true</code> in mj.config.cjs</li>\n <li>Restart the MJ API server</li>\n <li>Refresh this page</li>\n </ol>\n </div>\n </mj-empty-state>\n } @else if (activeSessions.length === 0) {\n <!-- No active sessions -->\n <mj-empty-state\n Icon=\"fa-solid fa-file-code\"\n Title=\"No Active Sessions\"\n Message=\"Start a new SQL logging session to begin capturing SQL statements.\"\n ActionText=\"Start New Session\"\n ActionIcon=\"fa-solid fa-play\"\n (Action)=\"openStartSessionDialog()\" />\n } @else {\n <!-- Sessions layout -->\n <div class=\"sessions-layout\">\n <!-- Sessions panel -->\n <div class=\"sessions-panel\" role=\"region\" aria-label=\"Active sessions list\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">Active Sessions</h3>\n @if (activeSessions.length > 0) {\n <button mjButton\n variant=\"danger\"\n size=\"sm\"\n (click)=\"openStopAllSessionsConfirm()\"\n [disabled]=\"loading\"\n aria-label=\"Stop all active sessions\"\n >\n <i class=\"fa-solid fa-stop\" aria-hidden=\"true\"></i>\n Stop All\n </button>\n }\n </div>\n <div class=\"sessions-list\" role=\"list\" aria-label=\"SQL logging sessions\">\n @for (session of activeSessions; track session.id) {\n <div\n class=\"session-card\"\n [class.selected]=\"selectedSession?.id === session.id\"\n (click)=\"selectSession(session)\"\n role=\"listitem\"\n tabindex=\"0\"\n (keydown.enter)=\"selectSession(session)\"\n (keydown.space)=\"selectSession(session); $event.preventDefault()\"\n [attr.aria-label]=\"'Session: ' + session.sessionName + ', ' + session.statementCount + ' statements, duration ' + getSessionDuration(session.startTime)\"\n [attr.aria-selected]=\"selectedSession?.id === session.id\"\n >\n <div class=\"session-header\">\n <div class=\"session-info\">\n <h4 class=\"session-title\">{{ session.sessionName }}</h4>\n <div class=\"session-meta\">\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-clock\" aria-hidden=\"true\"></i>\n {{ getSessionDuration(session.startTime) }}\n </span>\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n {{ session.statementCount }} statements\n </span>\n </div>\n </div>\n <button mjButton\n variant=\"danger\"\n size=\"sm\"\n (click)=\"openStopSessionConfirm(session, $event)\"\n [attr.aria-label]=\"'Stop session ' + session.sessionName\"\n >\n <i class=\"fa-solid fa-stop\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"session-badges\">\n @if (session.filterByUserId) {\n <span class=\"badge badge-user\">\n <i class=\"fa-solid fa-user\" aria-hidden=\"true\"></i>\n User Filtered\n </span>\n }\n @if (session.options?.formatAsMigration) {\n <span class=\"badge badge-migration\">\n <i class=\"fa-solid fa-code-branch\" aria-hidden=\"true\"></i>\n Migration\n </span>\n }\n <span class=\"badge badge-type\">\n {{ session.options?.statementTypes || \"both\" }}\n </span>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Log viewer panel -->\n <div class=\"log-viewer-panel\" [class.expanded]=\"isLogViewerExpanded\" role=\"region\" aria-label=\"SQL log viewer\">\n @if (selectedSession) {\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">{{ selectedSession.sessionName }}</h3>\n <div class=\"panel-actions\">\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"autoRefresh\"\n aria-label=\"Enable auto-refresh\"\n />\n Auto-refresh\n </label>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"loadSessionLog(selectedSession)\"\n aria-label=\"Refresh log content\"\n >\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"loading\" aria-hidden=\"true\"></i>\n </button>\n <button mjButton\n variant=\"flat\"\n size=\"sm\"\n (click)=\"toggleLogViewerExpand()\"\n [attr.aria-label]=\"isLogViewerExpanded ? 'Collapse log viewer' : 'Expand log viewer to fullscreen'\"\n [attr.aria-expanded]=\"isLogViewerExpanded\"\n >\n <i class=\"fa-solid\" [class.fa-expand]=\"!isLogViewerExpanded\" [class.fa-compress]=\"isLogViewerExpanded\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"log-content\">\n <mj-code-editor\n [value]=\"logContent\"\n [readonly]=\"true\"\n [disabled]=\"true\"\n [language]=\"'sql'\"\n [setup]=\"'basic'\"\n [lineWrapping]=\"true\"\n [highlightWhitespace]=\"false\"\n style=\"height: 100%\"\n aria-label=\"SQL log content\"\n ></mj-code-editor>\n </div>\n } @else {\n <mj-empty-state\n Icon=\"fa-solid fa-arrow-left\"\n Title=\"Select a Session\"\n Message=\"Choose a session from the list to view its SQL log.\" />\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Start Session Dialog -->\n @if (showStartSessionDialog) {\n <div\n class=\"modal-backdrop\"\n (click)=\"showStartSessionDialog = false\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"start-session-dialog-title\"\n >\n <div class=\"modal-dialog modal-large\" [class.fullscreen]=\"isStartDialogFullscreen\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"start-session-dialog-title\">\n <i class=\"fa-solid fa-play\" aria-hidden=\"true\"></i>\n Start SQL Logging Session\n </h3>\n <div class=\"modal-header-actions\">\n <button\n class=\"modal-action-btn\"\n (click)=\"toggleStartDialogFullscreen()\"\n [attr.aria-label]=\"isStartDialogFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'\"\n type=\"button\"\n >\n <i class=\"fa-solid\" [class.fa-compress]=\"isStartDialogFullscreen\" [class.fa-expand]=\"!isStartDialogFullscreen\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"modal-close\" (click)=\"showStartSessionDialog = false\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"session-name\">Session Name</label>\n <input\n type=\"text\"\n id=\"session-name\"\n class=\"form-input\"\n [(ngModel)]=\"newSessionOptions.sessionName\"\n placeholder=\"Enter a descriptive name for this session\"\n aria-describedby=\"session-name-hint\"\n />\n <div id=\"session-name-hint\" class=\"form-hint\">A descriptive name to identify this logging session</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"file-name\">File Name</label>\n <input\n type=\"text\"\n id=\"file-name\"\n class=\"form-input\"\n [(ngModel)]=\"newSessionOptions.fileName\"\n placeholder=\"sql-log-2024-01-01.sql\"\n aria-describedby=\"file-name-hint\"\n />\n <div id=\"file-name-hint\" class=\"form-hint\">The SQL log will be saved to this file</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"statement-types\">Statement Types</label>\n <select\n id=\"statement-types\"\n class=\"form-select\"\n [(ngModel)]=\"newSessionOptions.statementTypes\"\n aria-describedby=\"statement-types-hint\"\n >\n @for (option of statementTypeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n <div id=\"statement-types-hint\" class=\"form-hint\">Filter which types of SQL statements to capture</div>\n </div>\n\n <div class=\"form-checkboxes\" role=\"group\" aria-label=\"Session options\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"newSessionOptions.filterToCurrentUser\" />\n Filter to my SQL statements only\n </label>\n\n\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"newSessionOptions.formatAsMigration\" />\n Format as migration file\n </label>\n\n\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"newSessionOptions.prettyPrint\" />\n Pretty print SQL statements\n </label>\n </div>\n\n <!-- SQL Pattern Filtering Section -->\n <div class=\"form-section\">\n <h4 class=\"form-section-title\">\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n SQL Pattern Filtering\n </h4>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"filter-type\">Filter Mode</label>\n <select\n id=\"filter-type\"\n class=\"form-select\"\n [(ngModel)]=\"newSessionOptions.filterType\"\n aria-describedby=\"filter-type-hint\"\n >\n @for (option of filterTypeOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.text }}</option>\n }\n </select>\n <div id=\"filter-type-hint\" class=\"form-hint\">Exclude: Skip SQL matching any pattern. Include: Only log SQL matching a pattern.</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"filter-patterns\">Filter Patterns (one per line or comma-separated)</label>\n <textarea\n id=\"filter-patterns\"\n class=\"form-textarea\"\n [(ngModel)]=\"newSessionOptions.filterPatterns\"\n rows=\"4\"\n placeholder=\"Examples:&#10;*AIPrompt*&#10;/spCreate.*Run/i&#10;SELECT * FROM vwMetadata\"\n aria-describedby=\"filter-patterns-hint\"\n ></textarea>\n <div id=\"filter-patterns-hint\" class=\"form-hint\">Supports wildcards (*) and regex (/pattern/flags). Example: *spCreate* matches any SP starting with spCreate.</div>\n </div>\n </div>\n\n <!-- Advanced Options Section -->\n <div class=\"form-section\">\n <h4 class=\"form-section-title\">\n <i class=\"fa-solid fa-cog\" aria-hidden=\"true\"></i>\n Advanced Options\n </h4>\n\n @if (newSessionOptions.formatAsMigration) {\n <div class=\"form-group\">\n <label class=\"form-label\" for=\"default-schema\">Default Schema Name</label>\n <input\n type=\"text\"\n id=\"default-schema\"\n class=\"form-input\"\n [(ngModel)]=\"newSessionOptions.defaultSchemaName\"\n placeholder=\"__mj\"\n aria-describedby=\"default-schema-hint\"\n />\n <div id=\"default-schema-hint\" class=\"form-hint\">Schema name to replace with $&#123;flyway:defaultSchema&#125; placeholder.</div>\n </div>\n }\n\n <div class=\"form-checkboxes\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"newSessionOptions.verboseOutput\" />\n Verbose Debug Output\n </label>\n <div class=\"form-hint\" style=\"margin-left: 1.75rem\">Log detailed filter decisions to server console (for debugging).</div>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button mjButton variant=\"primary\" size=\"md\" (click)=\"startNewSession()\" [disabled]=\"loading\" aria-label=\"Start the SQL logging session\">\n @if (loading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Starting...\n } @else {\n <i class=\"fa-solid fa-play\" aria-hidden=\"true\"></i>\n Start Session\n }\n </button>\n <button mjButton variant=\"secondary\" size=\"md\" (click)=\"showStartSessionDialog = false\" aria-label=\"Cancel and close dialog\">Cancel</button>\n </div>\n </div>\n </div>\n }\n\n <!-- Stop Session Confirmation Dialog -->\n @if (showStopConfirmDialog) {\n <div\n class=\"modal-backdrop\"\n (click)=\"cancelStopConfirm()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"stop-dialog-title\"\n aria-describedby=\"stop-dialog-desc\"\n >\n <div class=\"confirm-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"confirm-dialog-icon\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"confirm-dialog-content\">\n <h3 class=\"confirm-dialog-title\" id=\"stop-dialog-title\">\n @if (isStoppingAll) {\n Stop All Sessions?\n } @else {\n Stop Session?\n }\n </h3>\n <p class=\"confirm-dialog-message\" id=\"stop-dialog-desc\">\n @if (isStoppingAll) {\n Are you sure you want to stop <strong>all {{ activeSessions.length }} active</strong> SQL logging sessions? This action cannot be undone.\n } @else if (sessionToStop) {\n Are you sure you want to stop the session <strong>\"{{ sessionToStop.sessionName }}\"</strong>?\n <span class=\"confirm-dialog-details\"> This session has captured {{ sessionToStop.statementCount }} SQL statements. </span>\n }\n </p>\n </div>\n <div class=\"confirm-dialog-actions\">\n <button mjButton variant=\"danger\" size=\"md\" (click)=\"confirmStopSession()\" [disabled]=\"loading\" [attr.aria-label]=\"isStoppingAll ? 'Confirm stop all sessions' : 'Confirm stop session'\">\n @if (loading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Stopping...\n } @else {\n <i class=\"fa-solid fa-stop\" aria-hidden=\"true\"></i>\n @if (isStoppingAll) {\n Stop All Sessions\n } @else {\n Stop Session\n }\n }\n </button>\n <button mjButton variant=\"secondary\" size=\"md\" (click)=\"cancelStopConfirm()\" [disabled]=\"loading\" aria-label=\"Cancel and keep sessions running\">Cancel</button>\n </div>\n </div>\n </div>\n }\n</mj-page-body-interior>\n"]}
@@ -5,7 +5,7 @@ import { ApplicationManager } from '@memberjunction/ng-base-application';
5
5
  import { SharedService } from '@memberjunction/ng-shared';
6
6
  import { UUIDsEqual } from '@memberjunction/global';
7
7
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
8
- import { moveAndResequence, resequenceItems } from './user-app-config-reorder';
8
+ import { MoveAndResequence, ResequenceItems } from './user-app-config-reorder';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "@memberjunction/ng-shared-generic";
11
11
  import * as i2 from "@memberjunction/ng-ui-components";
@@ -421,7 +421,7 @@ export class UserAppConfigContentComponent extends BaseAngularComponent {
421
421
  }
422
422
  }
423
423
  moveActiveApp(fromIndex, toIndex) {
424
- this.ActiveApps = moveAndResequence(this.ActiveApps, fromIndex, toIndex);
424
+ this.ActiveApps = MoveAndResequence(this.ActiveApps, fromIndex, toIndex);
425
425
  }
426
426
  /**
427
427
  * Checks if there are any unsaved changes
@@ -678,7 +678,7 @@ export class UserAppConfigContentComponent extends BaseAngularComponent {
678
678
  .sort((a, b) => a.app.Name.localeCompare(b.app.Name));
679
679
  }
680
680
  resequenceActiveApps() {
681
- resequenceItems(this.ActiveApps);
681
+ ResequenceItems(this.ActiveApps);
682
682
  }
683
683
  async updateUserApplication(md, item) {
684
684
  const userApp = await md.GetEntityObject('MJ: User Applications', md.CurrentUser);