@memberjunction/ng-explorer-settings 5.4.0 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
  2. package/dist/lib/application-management/application-dialog/application-dialog.component.js +6 -5
  3. package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
  4. package/dist/lib/application-management/application-management.component.js +2 -2
  5. package/dist/lib/application-management/application-management.component.js.map +1 -1
  6. package/dist/lib/application-settings/application-settings.component.d.ts.map +1 -1
  7. package/dist/lib/application-settings/application-settings.component.js +3 -2
  8. package/dist/lib/application-settings/application-settings.component.js.map +1 -1
  9. package/dist/lib/entity-permissions/entity-permissions.component.js +2 -2
  10. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
  11. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
  12. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +6 -5
  13. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
  14. package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
  15. package/dist/lib/notification-preferences/notification-preferences.component.js +3 -2
  16. package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
  17. package/dist/lib/user-app-config/user-app-config.component.d.ts.map +1 -1
  18. package/dist/lib/user-app-config/user-app-config.component.js +3 -2
  19. package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
  20. package/dist/lib/user-management/user-management.component.js +2 -2
  21. package/dist/lib/user-management/user-management.component.js.map +1 -1
  22. package/package.json +17 -17
@@ -1 +1 @@
1
- {"version":3,"file":"user-management.component.js","sourceRoot":"","sources":["../../../src/lib/user-management/user-management.component.ts","../../../src/lib/user-management/user-management.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnDestroy, ChangeDetectorRef, NgZone } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJUserEntity, MJRoleEntity, MJUserRoleEntity, ResourceData } from '@memberjunction/core-entities';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { UserDialogData, UserDialogResult } from './user-dialog/user-dialog.component';\n\ninterface UserStats {\n totalUsers: number;\n activeUsers: number;\n inactiveUsers: number;\n adminUsers: number;\n}\n\ninterface FilterOptions {\n status: 'all' | 'active' | 'inactive';\n role: string;\n search: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-user-management',\n templateUrl: './user-management.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './user-management.component.css']\n})\n@RegisterClass(BaseDashboard, 'UserManagement')\nexport class UserManagementComponent extends BaseDashboard implements OnDestroy {\n \n // State management\n public users: MJUserEntity[] = [];\n public filteredUsers: MJUserEntity[] = [];\n public roles: MJRoleEntity[] = [];\n public selectedUser: MJUserEntity | null = null;\n public isLoading = false;\n public error: string | null = null;\n\n // Selection state for bulk actions\n public selectedUserIds = new Set<string>();\n\n // Dialog state\n public showUserDialog = false;\n public userDialogData: UserDialogData | null = null;\n\n // Bulk action dialog state\n public showBulkActionConfirm = false;\n public bulkActionType: 'enable' | 'disable' | 'delete' | null = null;\n public showBulkRoleAssign = false;\n public bulkRoleId: string = '';\n \n // Stats\n public stats: UserStats = {\n totalUsers: 0,\n activeUsers: 0,\n inactiveUsers: 0,\n adminUsers: 0 // This will be based on roles, not Type\n };\n \n // Filters\n public filters$ = new BehaviorSubject<FilterOptions>({\n status: 'all',\n role: '',\n search: ''\n });\n \n // UI State\n public showCreateDialog = false;\n public showEditDialog = false;\n public showDeleteConfirm = false;\n public showMobileFilters = false;\n\n // Mobile expansion state\n private expandedUserIds = new Set<string>();\n\n // User-Role mapping\n private userRoleMap = new Map<string, string[]>(); // userId -> roleIds[]\n \n // Grid configuration\n public gridConfig = {\n pageSize: 20,\n sortField: 'Name',\n sortDirection: 'asc'\n };\n \n private destroy$ = new Subject<void>();\n private metadata = new Metadata();\n\n constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"User Management\"\n }\n\n protected initDashboard(): void {\n this.setupFilterSubscription();\n }\n\n protected loadData(): void {\n this.loadInitialData();\n }\n\n override ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n super.ngOnDestroy();\n }\n \n public async loadInitialData(): Promise<void> {\n try {\n this.isLoading = true;\n this.error = null;\n \n // Load users, roles, and user-role relationships in parallel\n const [users, roles, userRoles] = await Promise.all([\n this.loadUsers(),\n this.loadRoles(),\n this.loadUserRoles()\n ]);\n \n this.users = users;\n this.roles = roles;\n \n // Build user-role mapping\n this.buildUserRoleMapping(userRoles);\n \n this.calculateStats();\n this.applyFilters();\n \n } catch (error) {\n console.error('Error loading user data:', error);\n this.error = 'Failed to load user data. Please try again.';\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async loadUsers(): Promise<MJUserEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ResultType: 'entity_object'\n });\n \n return result.Success ? result.Results : [];\n }\n \n private async loadRoles(): Promise<MJRoleEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJRoleEntity>({\n EntityName: 'MJ: Roles',\n ResultType: 'entity_object',\n OrderBy: 'Name ASC'\n });\n \n return result.Success ? result.Results : [];\n }\n\n private async loadUserRoles(): Promise<MJUserRoleEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJUserRoleEntity>({\n EntityName: 'MJ: User Roles',\n ResultType: 'entity_object'\n });\n \n return result.Success ? result.Results : [];\n }\n\n private buildUserRoleMapping(userRoles: MJUserRoleEntity[]): void {\n this.userRoleMap.clear();\n \n userRoles.forEach(userRole => {\n const userId = userRole.UserID;\n const roleId = userRole.RoleID;\n \n if (!this.userRoleMap.has(userId)) {\n this.userRoleMap.set(userId, []);\n }\n \n this.userRoleMap.get(userId)!.push(roleId);\n });\n }\n \n private setupFilterSubscription(): void {\n this.filters$\n .pipe(\n debounceTime(300),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.applyFilters();\n });\n }\n \n private applyFilters(): void {\n const filters = this.filters$.value;\n let filtered = [...this.users];\n \n // Apply status filter\n if (filters.status !== 'all') {\n filtered = filtered.filter(user => \n filters.status === 'active' ? user.IsActive : !user.IsActive\n );\n }\n \n // Apply role filter\n if (filters.role) {\n filtered = filtered.filter(user => {\n const userRoles = this.userRoleMap.get(user.ID) || [];\n return userRoles.includes(filters.role);\n });\n }\n \n // Apply search filter\n if (filters.search) {\n const searchLower = filters.search.toLowerCase();\n filtered = filtered.filter(user =>\n user.Name?.toLowerCase().includes(searchLower) ||\n user.Email?.toLowerCase().includes(searchLower) ||\n user.FirstName?.toLowerCase().includes(searchLower) ||\n user.LastName?.toLowerCase().includes(searchLower)\n );\n }\n \n this.filteredUsers = filtered;\n }\n \n private calculateStats(): void {\n this.stats = {\n totalUsers: this.users.length,\n activeUsers: this.users.filter(u => u.IsActive).length,\n inactiveUsers: this.users.filter(u => !u.IsActive).length,\n adminUsers: this.users.filter(u => u.Type === 'Owner').length // Using Owner as admin type\n };\n }\n \n // Public methods for template\n public onSearchChange(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.updateFilter({ search: value });\n }\n \n public onStatusFilterChange(status: 'all' | 'active' | 'inactive'): void {\n this.updateFilter({ status });\n }\n \n public onRoleFilterChange(role: string): void {\n this.updateFilter({ role });\n }\n \n public updateFilter(partial: Partial<FilterOptions>): void {\n this.filters$.next({\n ...this.filters$.value,\n ...partial\n });\n }\n \n public selectUser(user: MJUserEntity): void {\n this.selectedUser = user;\n this.showEditDialog = true;\n }\n \n public createNewUser(): void {\n this.userDialogData = {\n mode: 'create',\n availableRoles: this.roles\n };\n this.showUserDialog = true;\n }\n \n public editUser(user: MJUserEntity): void {\n this.userDialogData = {\n user: user,\n mode: 'edit',\n availableRoles: this.roles\n };\n this.showUserDialog = true;\n }\n \n public confirmDeleteUser(user: MJUserEntity): void {\n this.selectedUser = user;\n this.showDeleteConfirm = true;\n }\n \n public async deleteUser(): Promise<void> {\n if (!this.selectedUser) return;\n \n try {\n // Load user entity to delete\n const user = await this.metadata.GetEntityObject<MJUserEntity>('MJ: Users');\n const loadResult = await user.Load(this.selectedUser.ID);\n \n if (loadResult) {\n const deleteResult = await user.Delete();\n if (deleteResult) {\n this.showDeleteConfirm = false;\n this.selectedUser = null;\n await this.loadInitialData();\n } else {\n throw new Error(user.LatestResult?.Message || 'Failed to delete user');\n }\n } else {\n throw new Error('User not found or permission denied');\n }\n } catch (error: unknown) {\n console.error('Error deleting user:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Failed to delete user';\n this.cdr.markForCheck();\n });\n }\n }\n \n public async toggleUserStatus(user: MJUserEntity): Promise<void> {\n try {\n user.IsActive = !user.IsActive;\n await user.Save();\n this.ngZone.run(() => {\n this.calculateStats();\n this.cdr.markForCheck();\n });\n } catch (error) {\n console.error('Error updating user status:', error);\n this.ngZone.run(() => {\n user.IsActive = !user.IsActive; // Revert on error\n this.cdr.markForCheck();\n });\n }\n }\n \n public exportUsers(): void {\n if (this.filteredUsers.length === 0) {\n this.error = 'No users to export';\n return;\n }\n\n try {\n // Create CSV content\n const headers = ['Name', 'First Name', 'Last Name', 'Email', 'Type', 'Status', 'Created', 'Updated'];\n const csvRows = [headers.join(',')];\n\n // Add user data\n this.filteredUsers.forEach(user => {\n const row = [\n this.escapeCSV(user.Name || ''),\n this.escapeCSV(user.FirstName || ''),\n this.escapeCSV(user.LastName || ''),\n this.escapeCSV(user.Email || ''),\n this.escapeCSV(user.Type || ''),\n user.IsActive ? 'Active' : 'Inactive',\n user.__mj_CreatedAt ? new Date(user.__mj_CreatedAt).toLocaleDateString() : '',\n user.__mj_UpdatedAt ? new Date(user.__mj_UpdatedAt).toLocaleDateString() : ''\n ];\n csvRows.push(row.join(','));\n });\n\n // Create and download file\n const csvContent = csvRows.join('\\n');\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n \n if (link.download !== undefined) {\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', `users_export_${new Date().toISOString().split('T')[0]}.csv`);\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n } catch (error) {\n console.error('Error exporting users:', error);\n this.error = 'Failed to export users';\n }\n }\n\n private escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n \n public refreshData(): void {\n this.loadInitialData();\n }\n \n public getStatusIcon(user: MJUserEntity): string {\n return user.IsActive ? 'fa-check-circle' : 'fa-times-circle';\n }\n \n public getStatusClass(user: MJUserEntity): string {\n return user.IsActive ? 'status-active' : 'status-inactive';\n }\n \n public getUserTypeIcon(user: MJUserEntity): string {\n switch (user.Type) {\n case 'Owner':\n return 'fa-shield-halved';\n case 'User':\n return 'fa-user';\n default:\n return 'fa-user';\n }\n }\n \n public getUserInitials(user: MJUserEntity): string {\n const first = user.FirstName?.charAt(0) || '';\n const last = user.LastName?.charAt(0) || '';\n return (first + last).toUpperCase() || user.Name?.charAt(0).toUpperCase() || 'U';\n }\n\n public onUserDialogResult(result: UserDialogResult): void {\n this.showUserDialog = false;\n this.userDialogData = null;\n\n if (result.action === 'save') {\n // Refresh the user list to show changes\n this.loadInitialData();\n }\n }\n\n // Selection methods for bulk actions\n public get isAllSelected(): boolean {\n return this.filteredUsers.length > 0 &&\n this.filteredUsers.every(user => this.selectedUserIds.has(user.ID));\n }\n\n public get isIndeterminate(): boolean {\n const selectedCount = this.filteredUsers.filter(user => this.selectedUserIds.has(user.ID)).length;\n return selectedCount > 0 && selectedCount < this.filteredUsers.length;\n }\n\n public get hasSelection(): boolean {\n return this.selectedUserIds.size > 0;\n }\n\n public get selectedCount(): number {\n return this.selectedUserIds.size;\n }\n\n public get hasActiveFilters(): boolean {\n const filters = this.filters$.value;\n return filters.status !== 'all' || filters.role !== '';\n }\n\n public get activeFilterCount(): number {\n let count = 0;\n const filters = this.filters$.value;\n if (filters.status !== 'all') count++;\n if (filters.role !== '') count++;\n return count;\n }\n\n public clearFilters(): void {\n this.filters$.next({\n ...this.filters$.value,\n status: 'all',\n role: ''\n });\n this.showMobileFilters = false;\n }\n\n public toggleSelectAll(): void {\n if (this.isAllSelected) {\n // Deselect all filtered users\n this.filteredUsers.forEach(user => this.selectedUserIds.delete(user.ID));\n } else {\n // Select all filtered users\n this.filteredUsers.forEach(user => this.selectedUserIds.add(user.ID));\n }\n }\n\n public toggleUserSelection(userId: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.selectedUserIds.has(userId)) {\n this.selectedUserIds.delete(userId);\n } else {\n this.selectedUserIds.add(userId);\n }\n }\n\n public isUserSelected(userId: string): boolean {\n return this.selectedUserIds.has(userId);\n }\n\n public clearSelection(): void {\n this.selectedUserIds.clear();\n }\n\n // Bulk action methods\n public confirmBulkAction(action: 'enable' | 'disable' | 'delete'): void {\n if (!this.hasSelection) return;\n this.bulkActionType = action;\n this.showBulkActionConfirm = true;\n }\n\n public cancelBulkAction(): void {\n this.showBulkActionConfirm = false;\n this.bulkActionType = null;\n }\n\n public async executeBulkAction(): Promise<void> {\n if (!this.bulkActionType || !this.hasSelection) return;\n\n try {\n this.isLoading = true;\n const selectedUsers = this.users.filter(user => this.selectedUserIds.has(user.ID));\n\n switch (this.bulkActionType) {\n case 'enable':\n await this.bulkSetUserStatus(selectedUsers, true);\n break;\n case 'disable':\n await this.bulkSetUserStatus(selectedUsers, false);\n break;\n case 'delete':\n await this.bulkDeleteUsers(selectedUsers);\n break;\n }\n\n this.clearSelection();\n this.showBulkActionConfirm = false;\n this.bulkActionType = null;\n await this.loadInitialData();\n } catch (error: unknown) {\n console.error('Bulk action failed:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Bulk action failed';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async bulkSetUserStatus(users: MJUserEntity[], isActive: boolean): Promise<void> {\n for (const user of users) {\n user.IsActive = isActive;\n const result = await user.Save();\n if (!result) {\n throw new Error(`Failed to update user ${user.Name}: ${user.LatestResult?.Message}`);\n }\n }\n }\n\n private async bulkDeleteUsers(users: MJUserEntity[]): Promise<void> {\n for (const user of users) {\n const result = await user.Delete();\n if (!result) {\n throw new Error(`Failed to delete user ${user.Name}: ${user.LatestResult?.Message}`);\n }\n }\n }\n\n // Bulk role assignment\n public openBulkRoleAssign(): void {\n if (!this.hasSelection) return;\n this.bulkRoleId = '';\n this.showBulkRoleAssign = true;\n }\n\n public cancelBulkRoleAssign(): void {\n this.showBulkRoleAssign = false;\n this.bulkRoleId = '';\n }\n\n public async executeBulkRoleAssign(): Promise<void> {\n if (!this.bulkRoleId || !this.hasSelection) return;\n\n try {\n this.isLoading = true;\n const selectedUserIds = Array.from(this.selectedUserIds);\n\n for (const userId of selectedUserIds) {\n // Check if user already has this role\n const existingRoles = this.userRoleMap.get(userId) || [];\n if (!existingRoles.includes(this.bulkRoleId)) {\n const userRole = await this.metadata.GetEntityObject<MJUserRoleEntity>('MJ: User Roles');\n userRole.NewRecord();\n userRole.UserID = userId;\n userRole.RoleID = this.bulkRoleId;\n\n const result = await userRole.Save();\n if (!result) {\n console.warn(`Failed to assign role to user ${userId}:`, userRole.LatestResult?.Message);\n }\n }\n }\n\n this.clearSelection();\n this.showBulkRoleAssign = false;\n this.bulkRoleId = '';\n await this.loadInitialData();\n } catch (error: unknown) {\n console.error('Bulk role assignment failed:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Bulk role assignment failed';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n public getBulkActionMessage(): string {\n const count = this.selectedCount;\n switch (this.bulkActionType) {\n case 'enable':\n return `Are you sure you want to enable ${count} user${count > 1 ? 's' : ''}?`;\n case 'disable':\n return `Are you sure you want to disable ${count} user${count > 1 ? 's' : ''}?`;\n case 'delete':\n return `Are you sure you want to delete ${count} user${count > 1 ? 's' : ''}? This action cannot be undone.`;\n default:\n return '';\n }\n }\n\n public getBulkActionTitle(): string {\n switch (this.bulkActionType) {\n case 'enable':\n return 'Enable Users';\n case 'disable':\n return 'Disable Users';\n case 'delete':\n return 'Delete Users';\n default:\n return 'Confirm Action';\n }\n }\n\n public getBulkActionButtonText(): string {\n const count = this.selectedCount;\n switch (this.bulkActionType) {\n case 'enable':\n return `Enable ${count} User${count > 1 ? 's' : ''}`;\n case 'disable':\n return `Disable ${count} User${count > 1 ? 's' : ''}`;\n case 'delete':\n return `Delete ${count} User${count > 1 ? 's' : ''}`;\n default:\n return 'Confirm';\n }\n }\n\n // Expansion methods\n public toggleUserExpansion(userId: string): void {\n if (this.expandedUserIds.has(userId)) {\n this.expandedUserIds.delete(userId);\n } else {\n this.expandedUserIds.add(userId);\n }\n }\n\n public isUserExpanded(userId: string): boolean {\n return this.expandedUserIds.has(userId);\n }\n\n // Get roles for a specific user\n public getUserRoles(userId: string): MJRoleEntity[] {\n const roleIds = this.userRoleMap.get(userId) || [];\n return this.roles.filter(role => roleIds.includes(role.ID));\n }\n}","<div class=\"user-management-container\">\n <!-- Sticky Header Section -->\n <div class=\"sticky-header\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\" role=\"toolbar\" aria-label=\"User management actions\">\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-icon-mobile\"\n (click)=\"refreshData()\"\n [disabled]=\"isLoading\"\n aria-label=\"Refresh user list\"\n >\n <i class=\"fa-solid fa-refresh\" [class.fa-spin]=\"isLoading\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Refresh</span>\n </button>\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-icon-mobile\"\n (click)=\"exportUsers()\"\n aria-label=\"Export users to file\"\n >\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Export</span>\n </button>\n <button\n class=\"mj-btn mj-btn-primary mj-btn-icon-mobile\"\n (click)=\"createNewUser()\"\n aria-label=\"Add new user\"\n >\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Add User</span>\n </button>\n </div>\n\n <!-- Bulk Action Toolbar -->\n @if (hasSelection) {\n <div class=\"bulk-action-toolbar\" role=\"toolbar\" aria-label=\"Bulk actions\">\n <div class=\"bulk-selection-info\">\n <i class=\"fa-solid fa-check-square\" aria-hidden=\"true\"></i>\n <span>{{ selectedCount }} user{{ selectedCount > 1 ? 's' : '' }} selected</span>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"clearSelection()\"\n aria-label=\"Clear selection\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n Clear\n </button>\n </div>\n <div class=\"bulk-action-buttons\">\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-sm\"\n (click)=\"confirmBulkAction('enable')\"\n aria-label=\"Enable selected users\"\n >\n <i class=\"fa-solid fa-toggle-on\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Enable</span>\n </button>\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-sm\"\n (click)=\"confirmBulkAction('disable')\"\n aria-label=\"Disable selected users\"\n >\n <i class=\"fa-solid fa-toggle-off\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Disable</span>\n </button>\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-sm\"\n (click)=\"openBulkRoleAssign()\"\n aria-label=\"Assign role to selected users\"\n >\n <i class=\"fa-solid fa-user-tag\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Assign Role</span>\n </button>\n <button\n class=\"mj-btn mj-btn-danger mj-btn-sm\"\n (click)=\"confirmBulkAction('delete')\"\n aria-label=\"Delete selected users\"\n >\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Delete</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Stats Cards -->\n <div class=\"mj-grid-4\" role=\"region\" aria-label=\"User statistics\">\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-total\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total users count\">{{ stats.totalUsers }}</div>\n <div class=\"stat-label\">Total Users</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-active\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-user-check\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Active users count\">{{ stats.activeUsers }}</div>\n <div class=\"stat-label\">Active Users</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-inactive\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-user-xmark\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Inactive users count\">{{ stats.inactiveUsers }}</div>\n <div class=\"stat-label\">Inactive Users</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-admin\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Owner users count\">{{ stats.adminUsers }}</div>\n <div class=\"stat-label\">Owners</div>\n </div>\n </div>\n </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\" role=\"search\" aria-label=\"Filter users\">\n <div class=\"filters-row\">\n <!-- Search -->\n <div class=\"mj-search\">\n <i class=\"fa-solid fa-search mj-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"mj-search-input\"\n placeholder=\"Search users by name or email...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.search\"\n aria-label=\"Search users by name or email\"\n />\n </div>\n\n <!-- Mobile: Filter Toggle Button -->\n <button\n class=\"mobile-filter-toggle\"\n (click)=\"showMobileFilters = !showMobileFilters\"\n [class.active]=\"showMobileFilters\"\n [attr.aria-expanded]=\"showMobileFilters\"\n aria-label=\"Toggle filters\"\n >\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n @if (hasActiveFilters) {\n <span class=\"filter-badge\">{{ activeFilterCount }}</span>\n }\n </button>\n\n <!-- Desktop: Status Filter - Button group -->\n <div class=\"mj-filter-group desktop-filter-group\">\n <label class=\"mj-filter-label\" id=\"status-filter-label\">Status</label>\n <div class=\"mj-filter-buttons\" role=\"group\" aria-labelledby=\"status-filter-label\">\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'all'\"\n (click)=\"onStatusFilterChange('all')\"\n [attr.aria-pressed]=\"filters$.value.status === 'all'\"\n >\n All\n </button>\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'active'\"\n (click)=\"onStatusFilterChange('active')\"\n [attr.aria-pressed]=\"filters$.value.status === 'active'\"\n >\n Active\n </button>\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'inactive'\"\n (click)=\"onStatusFilterChange('inactive')\"\n [attr.aria-pressed]=\"filters$.value.status === 'inactive'\"\n >\n Inactive\n </button>\n </div>\n </div>\n\n <!-- Desktop: Role Filter -->\n <div class=\"mj-filter-group desktop-filter-group\">\n <label class=\"mj-filter-label\" for=\"role-filter\">Role</label>\n <select\n id=\"role-filter\"\n class=\"mj-filter-select\"\n (change)=\"onRoleFilterChange($any($event.target).value)\"\n aria-label=\"Filter by role\"\n >\n <option value=\"\">All Roles</option>\n @for (role of roles; track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Mobile: Filter Dropdown Panel -->\n @if (showMobileFilters) {\n <div class=\"mobile-filter-dropdown\">\n <div class=\"mobile-filter-content\">\n <!-- Status Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" id=\"status-filter-label-mobile\">Status</label>\n <select\n class=\"mj-filter-select\"\n [value]=\"filters$.value.status\"\n (change)=\"onStatusFilterChange($any($event.target).value)\"\n aria-labelledby=\"status-filter-label-mobile\"\n >\n <option value=\"all\">All Status</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Role Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" for=\"role-filter-mobile\">Role</label>\n <select\n id=\"role-filter-mobile\"\n class=\"mj-filter-select\"\n (change)=\"onRoleFilterChange($any($event.target).value)\"\n aria-label=\"Filter by role\"\n >\n <option value=\"\">All Roles</option>\n @for (role of roles; track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Clear Filters Button -->\n @if (hasActiveFilters) {\n <button class=\"mj-btn mj-btn-ghost mj-btn-sm clear-filters-btn\" (click)=\"clearFilters()\">\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n Clear Filters\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div><!-- End Sticky Header -->\n\n <!-- Scrollable Content Section -->\n <div class=\"scrollable-content\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <mj-loading text=\"Loading users...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\" role=\"alert\" aria-live=\"assertive\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\" aria-hidden=\"true\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"retry-button\" (click)=\"loadInitialData()\" aria-label=\"Retry loading users\">\n <i class=\"fa-solid fa-refresh\" aria-hidden=\"true\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Content Area -->\n @if (!isLoading && !error) {\n <div class=\"content-area\">\n <!-- Users List -->\n <div class=\"users-list\" role=\"list\" aria-label=\"Users list\">\n <!-- List Header with Select All -->\n <div class=\"list-header\">\n <label class=\"select-all-label\">\n <input\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"isAllSelected\"\n [indeterminate]=\"isIndeterminate\"\n (change)=\"toggleSelectAll()\"\n aria-label=\"Select all users\"\n />\n <span class=\"select-all-text\">Select All ({{ filteredUsers.length }})</span>\n </label>\n @if (hasSelection) {\n <span class=\"selection-count\">{{ selectedCount }} selected</span>\n }\n </div>\n\n @for (user of filteredUsers; track user.ID) {\n <div\n class=\"user-card\"\n [class.expanded]=\"isUserExpanded(user.ID)\"\n [class.selected]=\"isUserSelected(user.ID)\"\n role=\"listitem\"\n >\n <!-- User Card Header - Always Visible -->\n <div\n class=\"user-header\"\n (click)=\"toggleUserExpansion(user.ID)\"\n role=\"button\"\n [attr.aria-expanded]=\"isUserExpanded(user.ID)\"\n tabindex=\"0\"\n (keydown.enter)=\"toggleUserExpansion(user.ID)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"user-selection\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"isUserSelected(user.ID)\"\n (change)=\"toggleUserSelection(user.ID, $event)\"\n [attr.aria-label]=\"'Select ' + user.Name\"\n />\n </div>\n\n <!-- User Info -->\n <div class=\"user-info\">\n <div class=\"user-avatar\" aria-hidden=\"true\">\n {{ getUserInitials(user) }}\n </div>\n <div class=\"user-details\">\n <h3 class=\"user-name\">{{ user.Name }}</h3>\n <p class=\"user-email\">{{ user.Email }}</p>\n </div>\n </div>\n\n <!-- User Meta -->\n <div class=\"user-meta\">\n <span class=\"status-badge\" [class]=\"getStatusClass(user)\">\n <i [class]=\"'fa-solid ' + getStatusIcon(user)\" aria-hidden=\"true\"></i>\n {{ user.IsActive ? 'Active' : 'Inactive' }}\n </span>\n <div class=\"user-actions desktop-only\" (click)=\"$event.stopPropagation()\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"editUser(user)\"\n [attr.aria-label]=\"'Edit ' + user.Name\"\n title=\"Edit\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"toggleUserStatus(user)\"\n [attr.aria-label]=\"(user.IsActive ? 'Deactivate ' : 'Activate ') + user.Name\"\n [title]=\"user.IsActive ? 'Deactivate' : 'Activate'\"\n >\n <i [class]=\"user.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"confirmDeleteUser(user)\"\n [attr.aria-label]=\"'Delete ' + user.Name\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button class=\"expand-btn\" aria-label=\"Toggle user details\">\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- User Card Content - Expanded -->\n @if (isUserExpanded(user.ID)) {\n <div class=\"user-content\">\n <!-- Mobile Actions Bar -->\n <div class=\"mobile-actions-bar\" (click)=\"$event.stopPropagation()\">\n <span class=\"status-badge\" [class]=\"getStatusClass(user)\">\n <i [class]=\"'fa-solid ' + getStatusIcon(user)\" aria-hidden=\"true\"></i>\n {{ user.IsActive ? 'Active' : 'Inactive' }}\n </span>\n <div class=\"mobile-action-buttons\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"editUser(user)\"\n [attr.aria-label]=\"'Edit ' + user.Name\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">Edit</span>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"toggleUserStatus(user)\"\n [attr.aria-label]=\"(user.IsActive ? 'Deactivate ' : 'Activate ') + user.Name\"\n >\n <i [class]=\"user.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">{{ user.IsActive ? 'Disable' : 'Enable' }}</span>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"confirmDeleteUser(user)\"\n [attr.aria-label]=\"'Delete ' + user.Name\"\n >\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">Delete</span>\n </button>\n </div>\n </div>\n\n <!-- User Stats -->\n <div class=\"user-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-user-tag\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Type:</span>\n <span class=\"stat-value\">\n <i [class]=\"'fa-solid ' + getUserTypeIcon(user)\" aria-hidden=\"true\"></i>\n {{ user.Type }}\n </span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-id-card\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Full Name:</span>\n <span class=\"stat-value\">{{ user.FirstName }} {{ user.LastName }}</span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-calendar\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Created:</span>\n <span class=\"stat-value\">{{ user.__mj_CreatedAt | date:'short' }}</span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-clock\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Updated:</span>\n <span class=\"stat-value\">{{ user.__mj_UpdatedAt | date:'short' }}</span>\n </div>\n </div>\n\n <!-- User Roles Section -->\n <div class=\"roles-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-user-shield\" aria-hidden=\"true\"></i>\n Assigned Roles\n </h4>\n @if (getUserRoles(user.ID).length > 0) {\n <div class=\"roles-grid\">\n @for (role of getUserRoles(user.ID); track role.ID) {\n <div class=\"role-item\">\n <i class=\"fa-solid fa-shield\" aria-hidden=\"true\"></i>\n {{ role.Name }}\n </div>\n }\n </div>\n } @else {\n <p class=\"no-roles\">No roles assigned to this user</p>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (filteredUsers.length === 0) {\n <div class=\"empty-state\" role=\"status\">\n <i class=\"fa-solid fa-users-slash empty-icon\" aria-hidden=\"true\"></i>\n <p class=\"empty-text\">No users found</p>\n <p class=\"empty-subtext\">Try adjusting your filters or add a new user</p>\n </div>\n }\n </div>\n </div>\n }\n </div><!-- End Scrollable Content -->\n\n <!-- User Create/Edit Dialog -->\n <mj-user-dialog\n [data]=\"userDialogData\"\n [visible]=\"showUserDialog\"\n (result)=\"onUserDialogResult($event)\">\n </mj-user-dialog>\n\n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm && selectedUser) {\n <div\n class=\"modal-backdrop\"\n (click)=\"showDeleteConfirm = false\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-dialog-title\"\n aria-describedby=\"delete-dialog-desc\"\n >\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"delete-dialog-title\">\n <i class=\"fa-solid fa-exclamation-triangle text-danger\" aria-hidden=\"true\"></i>\n Confirm Delete\n </h3>\n <button\n class=\"modal-close\"\n (click)=\"showDeleteConfirm = false\"\n aria-label=\"Close dialog\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"modal-body\" id=\"delete-dialog-desc\">\n <p>Are you sure you want to delete user <strong>{{ selectedUser.Name }}</strong>?</p>\n <p class=\"text-muted\">This action cannot be undone.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"mj-btn mj-btn-danger\" (click)=\"deleteUser()\">\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n Delete User\n </button>\n <button class=\"mj-btn mj-btn-secondary\" (click)=\"showDeleteConfirm = false\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Bulk Action Confirmation Dialog -->\n @if (showBulkActionConfirm) {\n <div\n class=\"modal-backdrop\"\n (click)=\"cancelBulkAction()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"bulk-action-dialog-title\"\n aria-describedby=\"bulk-action-dialog-desc\"\n >\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"bulk-action-dialog-title\">\n @if (bulkActionType === 'delete') {\n <i class=\"fa-solid fa-exclamation-triangle text-danger\" aria-hidden=\"true\"></i>\n } @else if (bulkActionType === 'enable') {\n <i class=\"fa-solid fa-toggle-on text-success\" aria-hidden=\"true\"></i>\n } @else {\n <i class=\"fa-solid fa-toggle-off text-warning\" aria-hidden=\"true\"></i>\n }\n {{ getBulkActionTitle() }}\n </h3>\n <button\n class=\"modal-close\"\n (click)=\"cancelBulkAction()\"\n aria-label=\"Close dialog\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"modal-body\" id=\"bulk-action-dialog-desc\">\n <p>{{ getBulkActionMessage() }}</p>\n @if (bulkActionType === 'delete') {\n <p class=\"text-muted\">This action cannot be undone.</p>\n }\n </div>\n <div class=\"modal-footer\">\n <button\n [class]=\"bulkActionType === 'delete' ? 'mj-btn mj-btn-danger' : 'mj-btn mj-btn-primary'\"\n (click)=\"executeBulkAction()\"\n [disabled]=\"isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Processing...\n } @else {\n @if (bulkActionType === 'delete') {\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n } @else if (bulkActionType === 'enable') {\n <i class=\"fa-solid fa-toggle-on\" aria-hidden=\"true\"></i>\n } @else {\n <i class=\"fa-solid fa-toggle-off\" aria-hidden=\"true\"></i>\n }\n {{ getBulkActionButtonText() }}\n }\n </button>\n <button class=\"mj-btn mj-btn-secondary\" (click)=\"cancelBulkAction()\" [disabled]=\"isLoading\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Bulk Role Assignment Dialog -->\n @if (showBulkRoleAssign) {\n <div\n class=\"modal-backdrop\"\n (click)=\"cancelBulkRoleAssign()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"bulk-role-dialog-title\"\n aria-describedby=\"bulk-role-dialog-desc\"\n >\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"bulk-role-dialog-title\">\n <i class=\"fa-solid fa-user-tag\" aria-hidden=\"true\"></i>\n Assign Role to {{ selectedCount }} User{{ selectedCount > 1 ? 's' : '' }}\n </h3>\n <button\n class=\"modal-close\"\n (click)=\"cancelBulkRoleAssign()\"\n aria-label=\"Close dialog\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"modal-body\" id=\"bulk-role-dialog-desc\">\n <p>Select a role to assign to the selected users:</p>\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"bulk-role-select\">Role</label>\n <select\n id=\"bulk-role-select\"\n class=\"field-select\"\n [(ngModel)]=\"bulkRoleId\"\n aria-label=\"Select role to assign\"\n >\n <option value=\"\">Select a role...</option>\n @for (role of roles; track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"mj-btn mj-btn-primary\"\n (click)=\"executeBulkRoleAssign()\"\n [disabled]=\"!bulkRoleId || isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Assigning...\n } @else {\n <i class=\"fa-solid fa-user-tag\" aria-hidden=\"true\"></i>\n Assign Role\n }\n </button>\n <button class=\"mj-btn mj-btn-secondary\" (click)=\"cancelBulkRoleAssign()\" [disabled]=\"isLoading\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"user-management.component.js","sourceRoot":"","sources":["../../../src/lib/user-management/user-management.component.ts","../../../src/lib/user-management/user-management.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnDestroy, ChangeDetectorRef, NgZone } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJUserEntity, MJRoleEntity, MJUserRoleEntity, ResourceData } from '@memberjunction/core-entities';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { UserDialogData, UserDialogResult } from './user-dialog/user-dialog.component';\n\ninterface UserStats {\n totalUsers: number;\n activeUsers: number;\n inactiveUsers: number;\n adminUsers: number;\n}\n\ninterface FilterOptions {\n status: 'all' | 'active' | 'inactive';\n role: string;\n search: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-user-management',\n templateUrl: './user-management.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './user-management.component.css']\n})\n@RegisterClass(BaseDashboard, 'UserManagement')\nexport class UserManagementComponent extends BaseDashboard implements OnDestroy {\n \n // State management\n public users: MJUserEntity[] = [];\n public filteredUsers: MJUserEntity[] = [];\n public roles: MJRoleEntity[] = [];\n public selectedUser: MJUserEntity | null = null;\n public isLoading = false;\n public error: string | null = null;\n\n // Selection state for bulk actions\n public selectedUserIds = new Set<string>();\n\n // Dialog state\n public showUserDialog = false;\n public userDialogData: UserDialogData | null = null;\n\n // Bulk action dialog state\n public showBulkActionConfirm = false;\n public bulkActionType: 'enable' | 'disable' | 'delete' | null = null;\n public showBulkRoleAssign = false;\n public bulkRoleId: string = '';\n \n // Stats\n public stats: UserStats = {\n totalUsers: 0,\n activeUsers: 0,\n inactiveUsers: 0,\n adminUsers: 0 // This will be based on roles, not Type\n };\n \n // Filters\n public filters$ = new BehaviorSubject<FilterOptions>({\n status: 'all',\n role: '',\n search: ''\n });\n \n // UI State\n public showCreateDialog = false;\n public showEditDialog = false;\n public showDeleteConfirm = false;\n public showMobileFilters = false;\n\n // Mobile expansion state\n private expandedUserIds = new Set<string>();\n\n // User-Role mapping\n private userRoleMap = new Map<string, string[]>(); // userId -> roleIds[]\n \n // Grid configuration\n public gridConfig = {\n pageSize: 20,\n sortField: 'Name',\n sortDirection: 'asc'\n };\n \n private destroy$ = new Subject<void>();\n private metadata = new Metadata();\n\n constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return \"User Management\"\n }\n\n protected initDashboard(): void {\n this.setupFilterSubscription();\n }\n\n protected loadData(): void {\n this.loadInitialData();\n }\n\n override ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n super.ngOnDestroy();\n }\n \n public async loadInitialData(): Promise<void> {\n try {\n this.isLoading = true;\n this.error = null;\n \n // Load users, roles, and user-role relationships in parallel\n const [users, roles, userRoles] = await Promise.all([\n this.loadUsers(),\n this.loadRoles(),\n this.loadUserRoles()\n ]);\n \n this.users = users;\n this.roles = roles;\n \n // Build user-role mapping\n this.buildUserRoleMapping(userRoles);\n \n this.calculateStats();\n this.applyFilters();\n \n } catch (error) {\n console.error('Error loading user data:', error);\n this.error = 'Failed to load user data. Please try again.';\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async loadUsers(): Promise<MJUserEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ResultType: 'entity_object'\n });\n \n return result.Success ? result.Results : [];\n }\n \n private async loadRoles(): Promise<MJRoleEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJRoleEntity>({\n EntityName: 'MJ: Roles',\n ResultType: 'entity_object',\n OrderBy: 'Name ASC'\n });\n \n return result.Success ? result.Results : [];\n }\n\n private async loadUserRoles(): Promise<MJUserRoleEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJUserRoleEntity>({\n EntityName: 'MJ: User Roles',\n ResultType: 'entity_object'\n });\n \n return result.Success ? result.Results : [];\n }\n\n private buildUserRoleMapping(userRoles: MJUserRoleEntity[]): void {\n this.userRoleMap.clear();\n \n userRoles.forEach(userRole => {\n const userId = userRole.UserID;\n const roleId = userRole.RoleID;\n \n if (!this.userRoleMap.has(userId)) {\n this.userRoleMap.set(userId, []);\n }\n \n this.userRoleMap.get(userId)!.push(roleId);\n });\n }\n \n private setupFilterSubscription(): void {\n this.filters$\n .pipe(\n debounceTime(300),\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.applyFilters();\n });\n }\n \n private applyFilters(): void {\n const filters = this.filters$.value;\n let filtered = [...this.users];\n \n // Apply status filter\n if (filters.status !== 'all') {\n filtered = filtered.filter(user => \n filters.status === 'active' ? user.IsActive : !user.IsActive\n );\n }\n \n // Apply role filter\n if (filters.role) {\n filtered = filtered.filter(user => {\n const userRoles = this.userRoleMap.get(user.ID) || [];\n return userRoles.includes(filters.role);\n });\n }\n \n // Apply search filter\n if (filters.search) {\n const searchLower = filters.search.toLowerCase();\n filtered = filtered.filter(user =>\n user.Name?.toLowerCase().includes(searchLower) ||\n user.Email?.toLowerCase().includes(searchLower) ||\n user.FirstName?.toLowerCase().includes(searchLower) ||\n user.LastName?.toLowerCase().includes(searchLower)\n );\n }\n \n this.filteredUsers = filtered;\n }\n \n private calculateStats(): void {\n this.stats = {\n totalUsers: this.users.length,\n activeUsers: this.users.filter(u => u.IsActive).length,\n inactiveUsers: this.users.filter(u => !u.IsActive).length,\n adminUsers: this.users.filter(u => u.Type === 'Owner').length // Using Owner as admin type\n };\n }\n \n // Public methods for template\n public onSearchChange(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.updateFilter({ search: value });\n }\n \n public onStatusFilterChange(status: 'all' | 'active' | 'inactive'): void {\n this.updateFilter({ status });\n }\n \n public onRoleFilterChange(role: string): void {\n this.updateFilter({ role });\n }\n \n public updateFilter(partial: Partial<FilterOptions>): void {\n this.filters$.next({\n ...this.filters$.value,\n ...partial\n });\n }\n \n public selectUser(user: MJUserEntity): void {\n this.selectedUser = user;\n this.showEditDialog = true;\n }\n \n public createNewUser(): void {\n this.userDialogData = {\n mode: 'create',\n availableRoles: this.roles\n };\n this.showUserDialog = true;\n }\n \n public editUser(user: MJUserEntity): void {\n this.userDialogData = {\n user: user,\n mode: 'edit',\n availableRoles: this.roles\n };\n this.showUserDialog = true;\n }\n \n public confirmDeleteUser(user: MJUserEntity): void {\n this.selectedUser = user;\n this.showDeleteConfirm = true;\n }\n \n public async deleteUser(): Promise<void> {\n if (!this.selectedUser) return;\n \n try {\n // Load user entity to delete\n const user = await this.metadata.GetEntityObject<MJUserEntity>('MJ: Users');\n const loadResult = await user.Load(this.selectedUser.ID);\n \n if (loadResult) {\n const deleteResult = await user.Delete();\n if (deleteResult) {\n this.showDeleteConfirm = false;\n this.selectedUser = null;\n await this.loadInitialData();\n } else {\n throw new Error(user.LatestResult?.Message || 'Failed to delete user');\n }\n } else {\n throw new Error('User not found or permission denied');\n }\n } catch (error: unknown) {\n console.error('Error deleting user:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Failed to delete user';\n this.cdr.markForCheck();\n });\n }\n }\n \n public async toggleUserStatus(user: MJUserEntity): Promise<void> {\n try {\n user.IsActive = !user.IsActive;\n await user.Save();\n this.ngZone.run(() => {\n this.calculateStats();\n this.cdr.markForCheck();\n });\n } catch (error) {\n console.error('Error updating user status:', error);\n this.ngZone.run(() => {\n user.IsActive = !user.IsActive; // Revert on error\n this.cdr.markForCheck();\n });\n }\n }\n \n public exportUsers(): void {\n if (this.filteredUsers.length === 0) {\n this.error = 'No users to export';\n return;\n }\n\n try {\n // Create CSV content\n const headers = ['Name', 'First Name', 'Last Name', 'Email', 'Type', 'Status', 'Created', 'Updated'];\n const csvRows = [headers.join(',')];\n\n // Add user data\n this.filteredUsers.forEach(user => {\n const row = [\n this.escapeCSV(user.Name || ''),\n this.escapeCSV(user.FirstName || ''),\n this.escapeCSV(user.LastName || ''),\n this.escapeCSV(user.Email || ''),\n this.escapeCSV(user.Type || ''),\n user.IsActive ? 'Active' : 'Inactive',\n user.__mj_CreatedAt ? new Date(user.__mj_CreatedAt).toLocaleDateString() : '',\n user.__mj_UpdatedAt ? new Date(user.__mj_UpdatedAt).toLocaleDateString() : ''\n ];\n csvRows.push(row.join(','));\n });\n\n // Create and download file\n const csvContent = csvRows.join('\\n');\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n \n if (link.download !== undefined) {\n const url = URL.createObjectURL(blob);\n link.setAttribute('href', url);\n link.setAttribute('download', `users_export_${new Date().toISOString().split('T')[0]}.csv`);\n link.style.visibility = 'hidden';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n } catch (error) {\n console.error('Error exporting users:', error);\n this.error = 'Failed to export users';\n }\n }\n\n private escapeCSV(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n }\n \n public refreshData(): void {\n this.loadInitialData();\n }\n \n public getStatusIcon(user: MJUserEntity): string {\n return user.IsActive ? 'fa-check-circle' : 'fa-times-circle';\n }\n \n public getStatusClass(user: MJUserEntity): string {\n return user.IsActive ? 'status-active' : 'status-inactive';\n }\n \n public getUserTypeIcon(user: MJUserEntity): string {\n switch (user.Type) {\n case 'Owner':\n return 'fa-shield-halved';\n case 'User':\n return 'fa-user';\n default:\n return 'fa-user';\n }\n }\n \n public getUserInitials(user: MJUserEntity): string {\n const first = user.FirstName?.charAt(0) || '';\n const last = user.LastName?.charAt(0) || '';\n return (first + last).toUpperCase() || user.Name?.charAt(0).toUpperCase() || 'U';\n }\n\n public onUserDialogResult(result: UserDialogResult): void {\n this.showUserDialog = false;\n this.userDialogData = null;\n\n if (result.action === 'save') {\n // Refresh the user list to show changes\n this.loadInitialData();\n }\n }\n\n // Selection methods for bulk actions\n public get isAllSelected(): boolean {\n return this.filteredUsers.length > 0 &&\n this.filteredUsers.every(user => this.selectedUserIds.has(user.ID));\n }\n\n public get isIndeterminate(): boolean {\n const selectedCount = this.filteredUsers.filter(user => this.selectedUserIds.has(user.ID)).length;\n return selectedCount > 0 && selectedCount < this.filteredUsers.length;\n }\n\n public get hasSelection(): boolean {\n return this.selectedUserIds.size > 0;\n }\n\n public get selectedCount(): number {\n return this.selectedUserIds.size;\n }\n\n public get hasActiveFilters(): boolean {\n const filters = this.filters$.value;\n return filters.status !== 'all' || filters.role !== '';\n }\n\n public get activeFilterCount(): number {\n let count = 0;\n const filters = this.filters$.value;\n if (filters.status !== 'all') count++;\n if (filters.role !== '') count++;\n return count;\n }\n\n public clearFilters(): void {\n this.filters$.next({\n ...this.filters$.value,\n status: 'all',\n role: ''\n });\n this.showMobileFilters = false;\n }\n\n public toggleSelectAll(): void {\n if (this.isAllSelected) {\n // Deselect all filtered users\n this.filteredUsers.forEach(user => this.selectedUserIds.delete(user.ID));\n } else {\n // Select all filtered users\n this.filteredUsers.forEach(user => this.selectedUserIds.add(user.ID));\n }\n }\n\n public toggleUserSelection(userId: string, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.selectedUserIds.has(userId)) {\n this.selectedUserIds.delete(userId);\n } else {\n this.selectedUserIds.add(userId);\n }\n }\n\n public isUserSelected(userId: string): boolean {\n return this.selectedUserIds.has(userId);\n }\n\n public clearSelection(): void {\n this.selectedUserIds.clear();\n }\n\n // Bulk action methods\n public confirmBulkAction(action: 'enable' | 'disable' | 'delete'): void {\n if (!this.hasSelection) return;\n this.bulkActionType = action;\n this.showBulkActionConfirm = true;\n }\n\n public cancelBulkAction(): void {\n this.showBulkActionConfirm = false;\n this.bulkActionType = null;\n }\n\n public async executeBulkAction(): Promise<void> {\n if (!this.bulkActionType || !this.hasSelection) return;\n\n try {\n this.isLoading = true;\n const selectedUsers = this.users.filter(user => this.selectedUserIds.has(user.ID));\n\n switch (this.bulkActionType) {\n case 'enable':\n await this.bulkSetUserStatus(selectedUsers, true);\n break;\n case 'disable':\n await this.bulkSetUserStatus(selectedUsers, false);\n break;\n case 'delete':\n await this.bulkDeleteUsers(selectedUsers);\n break;\n }\n\n this.clearSelection();\n this.showBulkActionConfirm = false;\n this.bulkActionType = null;\n await this.loadInitialData();\n } catch (error: unknown) {\n console.error('Bulk action failed:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Bulk action failed';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async bulkSetUserStatus(users: MJUserEntity[], isActive: boolean): Promise<void> {\n for (const user of users) {\n user.IsActive = isActive;\n const result = await user.Save();\n if (!result) {\n throw new Error(`Failed to update user ${user.Name}: ${user.LatestResult?.Message}`);\n }\n }\n }\n\n private async bulkDeleteUsers(users: MJUserEntity[]): Promise<void> {\n for (const user of users) {\n const result = await user.Delete();\n if (!result) {\n throw new Error(`Failed to delete user ${user.Name}: ${user.LatestResult?.Message}`);\n }\n }\n }\n\n // Bulk role assignment\n public openBulkRoleAssign(): void {\n if (!this.hasSelection) return;\n this.bulkRoleId = '';\n this.showBulkRoleAssign = true;\n }\n\n public cancelBulkRoleAssign(): void {\n this.showBulkRoleAssign = false;\n this.bulkRoleId = '';\n }\n\n public async executeBulkRoleAssign(): Promise<void> {\n if (!this.bulkRoleId || !this.hasSelection) return;\n\n try {\n this.isLoading = true;\n const selectedUserIds = Array.from(this.selectedUserIds);\n\n for (const userId of selectedUserIds) {\n // Check if user already has this role\n const existingRoles = this.userRoleMap.get(userId) || [];\n if (!existingRoles.includes(this.bulkRoleId)) {\n const userRole = await this.metadata.GetEntityObject<MJUserRoleEntity>('MJ: User Roles');\n userRole.NewRecord();\n userRole.UserID = userId;\n userRole.RoleID = this.bulkRoleId;\n\n const result = await userRole.Save();\n if (!result) {\n console.warn(`Failed to assign role to user ${userId}:`, userRole.LatestResult?.Message);\n }\n }\n }\n\n this.clearSelection();\n this.showBulkRoleAssign = false;\n this.bulkRoleId = '';\n await this.loadInitialData();\n } catch (error: unknown) {\n console.error('Bulk role assignment failed:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Bulk role assignment failed';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n public getBulkActionMessage(): string {\n const count = this.selectedCount;\n switch (this.bulkActionType) {\n case 'enable':\n return `Are you sure you want to enable ${count} user${count > 1 ? 's' : ''}?`;\n case 'disable':\n return `Are you sure you want to disable ${count} user${count > 1 ? 's' : ''}?`;\n case 'delete':\n return `Are you sure you want to delete ${count} user${count > 1 ? 's' : ''}? This action cannot be undone.`;\n default:\n return '';\n }\n }\n\n public getBulkActionTitle(): string {\n switch (this.bulkActionType) {\n case 'enable':\n return 'Enable Users';\n case 'disable':\n return 'Disable Users';\n case 'delete':\n return 'Delete Users';\n default:\n return 'Confirm Action';\n }\n }\n\n public getBulkActionButtonText(): string {\n const count = this.selectedCount;\n switch (this.bulkActionType) {\n case 'enable':\n return `Enable ${count} User${count > 1 ? 's' : ''}`;\n case 'disable':\n return `Disable ${count} User${count > 1 ? 's' : ''}`;\n case 'delete':\n return `Delete ${count} User${count > 1 ? 's' : ''}`;\n default:\n return 'Confirm';\n }\n }\n\n // Expansion methods\n public toggleUserExpansion(userId: string): void {\n if (this.expandedUserIds.has(userId)) {\n this.expandedUserIds.delete(userId);\n } else {\n this.expandedUserIds.add(userId);\n }\n }\n\n public isUserExpanded(userId: string): boolean {\n return this.expandedUserIds.has(userId);\n }\n\n // Get roles for a specific user\n public getUserRoles(userId: string): MJRoleEntity[] {\n const roleIds = this.userRoleMap.get(userId) || [];\n return this.roles.filter(role => roleIds.some(id => UUIDsEqual(id, role.ID)));\n }\n}","<div class=\"user-management-container\">\n <!-- Sticky Header Section -->\n <div class=\"sticky-header\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\" role=\"toolbar\" aria-label=\"User management actions\">\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-icon-mobile\"\n (click)=\"refreshData()\"\n [disabled]=\"isLoading\"\n aria-label=\"Refresh user list\"\n >\n <i class=\"fa-solid fa-refresh\" [class.fa-spin]=\"isLoading\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Refresh</span>\n </button>\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-icon-mobile\"\n (click)=\"exportUsers()\"\n aria-label=\"Export users to file\"\n >\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Export</span>\n </button>\n <button\n class=\"mj-btn mj-btn-primary mj-btn-icon-mobile\"\n (click)=\"createNewUser()\"\n aria-label=\"Add new user\"\n >\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Add User</span>\n </button>\n </div>\n\n <!-- Bulk Action Toolbar -->\n @if (hasSelection) {\n <div class=\"bulk-action-toolbar\" role=\"toolbar\" aria-label=\"Bulk actions\">\n <div class=\"bulk-selection-info\">\n <i class=\"fa-solid fa-check-square\" aria-hidden=\"true\"></i>\n <span>{{ selectedCount }} user{{ selectedCount > 1 ? 's' : '' }} selected</span>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"clearSelection()\"\n aria-label=\"Clear selection\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n Clear\n </button>\n </div>\n <div class=\"bulk-action-buttons\">\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-sm\"\n (click)=\"confirmBulkAction('enable')\"\n aria-label=\"Enable selected users\"\n >\n <i class=\"fa-solid fa-toggle-on\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Enable</span>\n </button>\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-sm\"\n (click)=\"confirmBulkAction('disable')\"\n aria-label=\"Disable selected users\"\n >\n <i class=\"fa-solid fa-toggle-off\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Disable</span>\n </button>\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-sm\"\n (click)=\"openBulkRoleAssign()\"\n aria-label=\"Assign role to selected users\"\n >\n <i class=\"fa-solid fa-user-tag\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Assign Role</span>\n </button>\n <button\n class=\"mj-btn mj-btn-danger mj-btn-sm\"\n (click)=\"confirmBulkAction('delete')\"\n aria-label=\"Delete selected users\"\n >\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Delete</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Stats Cards -->\n <div class=\"mj-grid-4\" role=\"region\" aria-label=\"User statistics\">\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-total\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total users count\">{{ stats.totalUsers }}</div>\n <div class=\"stat-label\">Total Users</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-active\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-user-check\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Active users count\">{{ stats.activeUsers }}</div>\n <div class=\"stat-label\">Active Users</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-inactive\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-user-xmark\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Inactive users count\">{{ stats.inactiveUsers }}</div>\n <div class=\"stat-label\">Inactive Users</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-admin\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Owner users count\">{{ stats.adminUsers }}</div>\n <div class=\"stat-label\">Owners</div>\n </div>\n </div>\n </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\" role=\"search\" aria-label=\"Filter users\">\n <div class=\"filters-row\">\n <!-- Search -->\n <div class=\"mj-search\">\n <i class=\"fa-solid fa-search mj-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"mj-search-input\"\n placeholder=\"Search users by name or email...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.search\"\n aria-label=\"Search users by name or email\"\n />\n </div>\n\n <!-- Mobile: Filter Toggle Button -->\n <button\n class=\"mobile-filter-toggle\"\n (click)=\"showMobileFilters = !showMobileFilters\"\n [class.active]=\"showMobileFilters\"\n [attr.aria-expanded]=\"showMobileFilters\"\n aria-label=\"Toggle filters\"\n >\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n @if (hasActiveFilters) {\n <span class=\"filter-badge\">{{ activeFilterCount }}</span>\n }\n </button>\n\n <!-- Desktop: Status Filter - Button group -->\n <div class=\"mj-filter-group desktop-filter-group\">\n <label class=\"mj-filter-label\" id=\"status-filter-label\">Status</label>\n <div class=\"mj-filter-buttons\" role=\"group\" aria-labelledby=\"status-filter-label\">\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'all'\"\n (click)=\"onStatusFilterChange('all')\"\n [attr.aria-pressed]=\"filters$.value.status === 'all'\"\n >\n All\n </button>\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'active'\"\n (click)=\"onStatusFilterChange('active')\"\n [attr.aria-pressed]=\"filters$.value.status === 'active'\"\n >\n Active\n </button>\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'inactive'\"\n (click)=\"onStatusFilterChange('inactive')\"\n [attr.aria-pressed]=\"filters$.value.status === 'inactive'\"\n >\n Inactive\n </button>\n </div>\n </div>\n\n <!-- Desktop: Role Filter -->\n <div class=\"mj-filter-group desktop-filter-group\">\n <label class=\"mj-filter-label\" for=\"role-filter\">Role</label>\n <select\n id=\"role-filter\"\n class=\"mj-filter-select\"\n (change)=\"onRoleFilterChange($any($event.target).value)\"\n aria-label=\"Filter by role\"\n >\n <option value=\"\">All Roles</option>\n @for (role of roles; track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n </div>\n </div>\n\n <!-- Mobile: Filter Dropdown Panel -->\n @if (showMobileFilters) {\n <div class=\"mobile-filter-dropdown\">\n <div class=\"mobile-filter-content\">\n <!-- Status Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" id=\"status-filter-label-mobile\">Status</label>\n <select\n class=\"mj-filter-select\"\n [value]=\"filters$.value.status\"\n (change)=\"onStatusFilterChange($any($event.target).value)\"\n aria-labelledby=\"status-filter-label-mobile\"\n >\n <option value=\"all\">All Status</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Role Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" for=\"role-filter-mobile\">Role</label>\n <select\n id=\"role-filter-mobile\"\n class=\"mj-filter-select\"\n (change)=\"onRoleFilterChange($any($event.target).value)\"\n aria-label=\"Filter by role\"\n >\n <option value=\"\">All Roles</option>\n @for (role of roles; track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Clear Filters Button -->\n @if (hasActiveFilters) {\n <button class=\"mj-btn mj-btn-ghost mj-btn-sm clear-filters-btn\" (click)=\"clearFilters()\">\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n Clear Filters\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div><!-- End Sticky Header -->\n\n <!-- Scrollable Content Section -->\n <div class=\"scrollable-content\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <mj-loading text=\"Loading users...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\" role=\"alert\" aria-live=\"assertive\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\" aria-hidden=\"true\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"retry-button\" (click)=\"loadInitialData()\" aria-label=\"Retry loading users\">\n <i class=\"fa-solid fa-refresh\" aria-hidden=\"true\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Content Area -->\n @if (!isLoading && !error) {\n <div class=\"content-area\">\n <!-- Users List -->\n <div class=\"users-list\" role=\"list\" aria-label=\"Users list\">\n <!-- List Header with Select All -->\n <div class=\"list-header\">\n <label class=\"select-all-label\">\n <input\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"isAllSelected\"\n [indeterminate]=\"isIndeterminate\"\n (change)=\"toggleSelectAll()\"\n aria-label=\"Select all users\"\n />\n <span class=\"select-all-text\">Select All ({{ filteredUsers.length }})</span>\n </label>\n @if (hasSelection) {\n <span class=\"selection-count\">{{ selectedCount }} selected</span>\n }\n </div>\n\n @for (user of filteredUsers; track user.ID) {\n <div\n class=\"user-card\"\n [class.expanded]=\"isUserExpanded(user.ID)\"\n [class.selected]=\"isUserSelected(user.ID)\"\n role=\"listitem\"\n >\n <!-- User Card Header - Always Visible -->\n <div\n class=\"user-header\"\n (click)=\"toggleUserExpansion(user.ID)\"\n role=\"button\"\n [attr.aria-expanded]=\"isUserExpanded(user.ID)\"\n tabindex=\"0\"\n (keydown.enter)=\"toggleUserExpansion(user.ID)\"\n >\n <!-- Selection Checkbox -->\n <div class=\"user-selection\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"isUserSelected(user.ID)\"\n (change)=\"toggleUserSelection(user.ID, $event)\"\n [attr.aria-label]=\"'Select ' + user.Name\"\n />\n </div>\n\n <!-- User Info -->\n <div class=\"user-info\">\n <div class=\"user-avatar\" aria-hidden=\"true\">\n {{ getUserInitials(user) }}\n </div>\n <div class=\"user-details\">\n <h3 class=\"user-name\">{{ user.Name }}</h3>\n <p class=\"user-email\">{{ user.Email }}</p>\n </div>\n </div>\n\n <!-- User Meta -->\n <div class=\"user-meta\">\n <span class=\"status-badge\" [class]=\"getStatusClass(user)\">\n <i [class]=\"'fa-solid ' + getStatusIcon(user)\" aria-hidden=\"true\"></i>\n {{ user.IsActive ? 'Active' : 'Inactive' }}\n </span>\n <div class=\"user-actions desktop-only\" (click)=\"$event.stopPropagation()\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"editUser(user)\"\n [attr.aria-label]=\"'Edit ' + user.Name\"\n title=\"Edit\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"toggleUserStatus(user)\"\n [attr.aria-label]=\"(user.IsActive ? 'Deactivate ' : 'Activate ') + user.Name\"\n [title]=\"user.IsActive ? 'Deactivate' : 'Activate'\"\n >\n <i [class]=\"user.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"confirmDeleteUser(user)\"\n [attr.aria-label]=\"'Delete ' + user.Name\"\n title=\"Delete\"\n >\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button class=\"expand-btn\" aria-label=\"Toggle user details\">\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- User Card Content - Expanded -->\n @if (isUserExpanded(user.ID)) {\n <div class=\"user-content\">\n <!-- Mobile Actions Bar -->\n <div class=\"mobile-actions-bar\" (click)=\"$event.stopPropagation()\">\n <span class=\"status-badge\" [class]=\"getStatusClass(user)\">\n <i [class]=\"'fa-solid ' + getStatusIcon(user)\" aria-hidden=\"true\"></i>\n {{ user.IsActive ? 'Active' : 'Inactive' }}\n </span>\n <div class=\"mobile-action-buttons\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"editUser(user)\"\n [attr.aria-label]=\"'Edit ' + user.Name\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">Edit</span>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"toggleUserStatus(user)\"\n [attr.aria-label]=\"(user.IsActive ? 'Deactivate ' : 'Activate ') + user.Name\"\n >\n <i [class]=\"user.IsActive ? 'fa-solid fa-toggle-on' : 'fa-solid fa-toggle-off'\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">{{ user.IsActive ? 'Disable' : 'Enable' }}</span>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"confirmDeleteUser(user)\"\n [attr.aria-label]=\"'Delete ' + user.Name\"\n >\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">Delete</span>\n </button>\n </div>\n </div>\n\n <!-- User Stats -->\n <div class=\"user-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-user-tag\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Type:</span>\n <span class=\"stat-value\">\n <i [class]=\"'fa-solid ' + getUserTypeIcon(user)\" aria-hidden=\"true\"></i>\n {{ user.Type }}\n </span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-id-card\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Full Name:</span>\n <span class=\"stat-value\">{{ user.FirstName }} {{ user.LastName }}</span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-calendar\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Created:</span>\n <span class=\"stat-value\">{{ user.__mj_CreatedAt | date:'short' }}</span>\n </div>\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-clock\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Updated:</span>\n <span class=\"stat-value\">{{ user.__mj_UpdatedAt | date:'short' }}</span>\n </div>\n </div>\n\n <!-- User Roles Section -->\n <div class=\"roles-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-user-shield\" aria-hidden=\"true\"></i>\n Assigned Roles\n </h4>\n @if (getUserRoles(user.ID).length > 0) {\n <div class=\"roles-grid\">\n @for (role of getUserRoles(user.ID); track role.ID) {\n <div class=\"role-item\">\n <i class=\"fa-solid fa-shield\" aria-hidden=\"true\"></i>\n {{ role.Name }}\n </div>\n }\n </div>\n } @else {\n <p class=\"no-roles\">No roles assigned to this user</p>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (filteredUsers.length === 0) {\n <div class=\"empty-state\" role=\"status\">\n <i class=\"fa-solid fa-users-slash empty-icon\" aria-hidden=\"true\"></i>\n <p class=\"empty-text\">No users found</p>\n <p class=\"empty-subtext\">Try adjusting your filters or add a new user</p>\n </div>\n }\n </div>\n </div>\n }\n </div><!-- End Scrollable Content -->\n\n <!-- User Create/Edit Dialog -->\n <mj-user-dialog\n [data]=\"userDialogData\"\n [visible]=\"showUserDialog\"\n (result)=\"onUserDialogResult($event)\">\n </mj-user-dialog>\n\n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm && selectedUser) {\n <div\n class=\"modal-backdrop\"\n (click)=\"showDeleteConfirm = false\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-dialog-title\"\n aria-describedby=\"delete-dialog-desc\"\n >\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"delete-dialog-title\">\n <i class=\"fa-solid fa-exclamation-triangle text-danger\" aria-hidden=\"true\"></i>\n Confirm Delete\n </h3>\n <button\n class=\"modal-close\"\n (click)=\"showDeleteConfirm = false\"\n aria-label=\"Close dialog\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"modal-body\" id=\"delete-dialog-desc\">\n <p>Are you sure you want to delete user <strong>{{ selectedUser.Name }}</strong>?</p>\n <p class=\"text-muted\">This action cannot be undone.</p>\n </div>\n <div class=\"modal-footer\">\n <button class=\"mj-btn mj-btn-danger\" (click)=\"deleteUser()\">\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n Delete User\n </button>\n <button class=\"mj-btn mj-btn-secondary\" (click)=\"showDeleteConfirm = false\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Bulk Action Confirmation Dialog -->\n @if (showBulkActionConfirm) {\n <div\n class=\"modal-backdrop\"\n (click)=\"cancelBulkAction()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"bulk-action-dialog-title\"\n aria-describedby=\"bulk-action-dialog-desc\"\n >\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"bulk-action-dialog-title\">\n @if (bulkActionType === 'delete') {\n <i class=\"fa-solid fa-exclamation-triangle text-danger\" aria-hidden=\"true\"></i>\n } @else if (bulkActionType === 'enable') {\n <i class=\"fa-solid fa-toggle-on text-success\" aria-hidden=\"true\"></i>\n } @else {\n <i class=\"fa-solid fa-toggle-off text-warning\" aria-hidden=\"true\"></i>\n }\n {{ getBulkActionTitle() }}\n </h3>\n <button\n class=\"modal-close\"\n (click)=\"cancelBulkAction()\"\n aria-label=\"Close dialog\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"modal-body\" id=\"bulk-action-dialog-desc\">\n <p>{{ getBulkActionMessage() }}</p>\n @if (bulkActionType === 'delete') {\n <p class=\"text-muted\">This action cannot be undone.</p>\n }\n </div>\n <div class=\"modal-footer\">\n <button\n [class]=\"bulkActionType === 'delete' ? 'mj-btn mj-btn-danger' : 'mj-btn mj-btn-primary'\"\n (click)=\"executeBulkAction()\"\n [disabled]=\"isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Processing...\n } @else {\n @if (bulkActionType === 'delete') {\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n } @else if (bulkActionType === 'enable') {\n <i class=\"fa-solid fa-toggle-on\" aria-hidden=\"true\"></i>\n } @else {\n <i class=\"fa-solid fa-toggle-off\" aria-hidden=\"true\"></i>\n }\n {{ getBulkActionButtonText() }}\n }\n </button>\n <button class=\"mj-btn mj-btn-secondary\" (click)=\"cancelBulkAction()\" [disabled]=\"isLoading\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Bulk Role Assignment Dialog -->\n @if (showBulkRoleAssign) {\n <div\n class=\"modal-backdrop\"\n (click)=\"cancelBulkRoleAssign()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"bulk-role-dialog-title\"\n aria-describedby=\"bulk-role-dialog-desc\"\n >\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3 class=\"modal-title\" id=\"bulk-role-dialog-title\">\n <i class=\"fa-solid fa-user-tag\" aria-hidden=\"true\"></i>\n Assign Role to {{ selectedCount }} User{{ selectedCount > 1 ? 's' : '' }}\n </h3>\n <button\n class=\"modal-close\"\n (click)=\"cancelBulkRoleAssign()\"\n aria-label=\"Close dialog\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div class=\"modal-body\" id=\"bulk-role-dialog-desc\">\n <p>Select a role to assign to the selected users:</p>\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"bulk-role-select\">Role</label>\n <select\n id=\"bulk-role-select\"\n class=\"field-select\"\n [(ngModel)]=\"bulkRoleId\"\n aria-label=\"Select role to assign\"\n >\n <option value=\"\">Select a role...</option>\n @for (role of roles; track role.ID) {\n <option [value]=\"role.ID\">{{ role.Name }}</option>\n }\n </select>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"mj-btn mj-btn-primary\"\n (click)=\"executeBulkRoleAssign()\"\n [disabled]=\"!bulkRoleId || isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Assigning...\n } @else {\n <i class=\"fa-solid fa-user-tag\" aria-hidden=\"true\"></i>\n Assign Role\n }\n </button>\n <button class=\"mj-btn mj-btn-secondary\" (click)=\"cancelBulkRoleAssign()\" [disabled]=\"isLoading\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-explorer-settings",
3
- "version": "5.4.0",
3
+ "version": "5.5.0",
4
4
  "description": "MemberJunction: Reusable Angular components for the settings section of the MJ Explorer App",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -25,22 +25,22 @@
25
25
  "@angular/router": "21.1.3"
26
26
  },
27
27
  "dependencies": {
28
- "@memberjunction/core": "5.4.0",
29
- "@memberjunction/core-entities": "5.4.0",
30
- "@memberjunction/global": "5.4.0",
31
- "@memberjunction/graphql-dataprovider": "5.4.0",
32
- "@memberjunction/ng-base-application": "5.4.0",
33
- "@memberjunction/ng-base-forms": "5.4.0",
34
- "@memberjunction/ng-code-editor": "5.4.0",
35
- "@memberjunction/ng-entity-form-dialog": "5.4.0",
36
- "@memberjunction/ng-entity-permissions": "5.4.0",
37
- "@memberjunction/ng-join-grid": "5.4.0",
38
- "@memberjunction/ng-notifications": "5.4.0",
39
- "@memberjunction/ng-shared": "5.4.0",
40
- "@memberjunction/ng-shared-generic": "5.4.0",
41
- "@memberjunction/ng-simple-record-list": "5.4.0",
42
- "@memberjunction/ng-tabstrip": "5.4.0",
43
- "@memberjunction/ng-user-avatar": "5.4.0",
28
+ "@memberjunction/core": "5.5.0",
29
+ "@memberjunction/core-entities": "5.5.0",
30
+ "@memberjunction/global": "5.5.0",
31
+ "@memberjunction/graphql-dataprovider": "5.5.0",
32
+ "@memberjunction/ng-base-application": "5.5.0",
33
+ "@memberjunction/ng-base-forms": "5.5.0",
34
+ "@memberjunction/ng-code-editor": "5.5.0",
35
+ "@memberjunction/ng-entity-form-dialog": "5.5.0",
36
+ "@memberjunction/ng-entity-permissions": "5.5.0",
37
+ "@memberjunction/ng-join-grid": "5.5.0",
38
+ "@memberjunction/ng-notifications": "5.5.0",
39
+ "@memberjunction/ng-shared": "5.5.0",
40
+ "@memberjunction/ng-shared-generic": "5.5.0",
41
+ "@memberjunction/ng-simple-record-list": "5.5.0",
42
+ "@memberjunction/ng-tabstrip": "5.5.0",
43
+ "@memberjunction/ng-user-avatar": "5.5.0",
44
44
  "@progress/kendo-angular-buttons": "22.0.1",
45
45
  "@progress/kendo-angular-dialog": "22.0.1",
46
46
  "@progress/kendo-angular-dropdowns": "22.0.1",