@memberjunction/ng-explorer-settings 5.24.0 → 5.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/application-management/application-management.component.d.ts +2 -2
- package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-management.component.js.map +1 -1
- package/dist/lib/application-settings/application-settings.component.js +1 -1
- package/dist/lib/application-settings/application-settings.component.js.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts +2 -2
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
- package/dist/lib/role-management/role-management.component.d.ts +2 -2
- package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
- package/dist/lib/role-management/role-management.component.js.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.d.ts +2 -1
- package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
- package/dist/lib/user-app-config/user-app-config.component.js +1 -1
- package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
- package/dist/lib/user-management/user-management.component.d.ts +2 -2
- package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
- package/dist/lib/user-management/user-management.component.js.map +1 -1
- package/package.json +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-permissions.component.js","sourceRoot":"","sources":["../../../src/lib/entity-permissions/entity-permissions.component.ts","../../../src/lib/entity-permissions/entity-permissions.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 {\n MJEntityPermissionEntity,\n MJEntityEntity,\n MJRoleEntity,\n ResourceData\n} from '@memberjunction/core-entities';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { PermissionDialogData, PermissionDialogResult } from './permission-dialog/permission-dialog.component';\n\ninterface PermissionsStats {\n totalEntities: number;\n publicEntities: number;\n restrictedEntities: number;\n totalPermissions: number;\n}\n\ninterface FilterOptions {\n entitySearch: string;\n accessLevel: 'all' | 'public' | 'restricted' | 'custom';\n roleId: string | null;\n}\n\ninterface EntityAccess {\n entity: MJEntityEntity;\n isPublic: boolean;\n permissions: MJEntityPermissionEntity[];\n rolePermissions: Map<string, PermissionLevel>;\n}\n\ninterface PermissionLevel {\n canCreate: boolean;\n canRead: boolean;\n canUpdate: boolean;\n canDelete: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-entity-permissions',\n templateUrl: './entity-permissions.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './entity-permissions.component.css']\n})\n@RegisterClass(BaseDashboard, 'EntityPermissions')\nexport class EntityPermissionsComponent extends BaseDashboard implements OnDestroy {\n // State management\n public entityAccess: EntityAccess[] = [];\n public filteredEntityAccess: EntityAccess[] = [];\n public roles: MJRoleEntity[] = [];\n public isLoading = false;\n public error: string | null = null;\n \n // Permission dialog state\n public showPermissionDialog = false;\n public permissionDialogData: PermissionDialogData | null = null;\n \n // Stats\n public stats: PermissionsStats = {\n totalEntities: 0,\n publicEntities: 0,\n restrictedEntities: 0,\n totalPermissions: 0\n };\n \n // Filters\n public filters$ = new BehaviorSubject<FilterOptions>({\n entitySearch: '',\n accessLevel: 'all',\n roleId: null\n });\n \n // UI State\n public expandedEntityId: string | null = null;\n public viewMode: 'grid' | 'list' = 'list';\n public showMobileFilters = false;\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 \"Permissions\"\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 all required data in parallel\n const [entities, permissions, roles] = await Promise.all([\n this.loadEntities(),\n this.loadEntityPermissions(),\n this.loadRoles()\n ]);\n \n // Process the data\n this.roles = roles;\n this.processEntityAccess(entities, permissions);\n this.calculateStats();\n this.applyFilters();\n \n } catch (error) {\n console.error('Error loading permissions data:', error);\n this.error = 'Failed to load permissions 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 loadEntities(): Promise<MJEntityEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJEntityEntity>({\n EntityName: 'MJ: Entities',\n ResultType: 'entity_object',\n OrderBy: 'Name ASC'\n });\n \n return result.Success ? result.Results : [];\n }\n \n private async loadEntityPermissions(): Promise<MJEntityPermissionEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJEntityPermissionEntity>({\n EntityName: 'MJ: Entity Permissions',\n ResultType: 'entity_object',\n OrderBy: 'EntityID, RoleID'\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 processEntityAccess(entities: MJEntityEntity[], permissions: MJEntityPermissionEntity[]): void {\n // Group permissions by entity\n const permissionsByEntity = new Map<string, MJEntityPermissionEntity[]>();\n \n for (const permission of permissions) {\n const entityId = permission.EntityID;\n if (!permissionsByEntity.has(entityId)) {\n permissionsByEntity.set(entityId, []);\n }\n permissionsByEntity.get(entityId)!.push(permission);\n }\n \n // Create EntityAccess objects\n this.entityAccess = entities.map(entity => {\n const entityPermissions = permissionsByEntity.get(entity.ID) || [];\n const rolePermissions = new Map<string, PermissionLevel>();\n \n // Process permissions by role\n for (const permission of entityPermissions) {\n if (permission.RoleID) {\n rolePermissions.set(permission.RoleID, {\n canCreate: permission.CanCreate || false,\n canRead: permission.CanRead || false,\n canUpdate: permission.CanUpdate || false,\n canDelete: permission.CanDelete || false\n });\n }\n }\n \n return {\n entity,\n isPublic: entity.AllowAllRowsAPI || false,\n permissions: entityPermissions,\n rolePermissions\n };\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.entityAccess];\n \n // Apply entity search\n if (filters.entitySearch) {\n const searchLower = filters.entitySearch.toLowerCase();\n filtered = filtered.filter(ea =>\n ea.entity.Name?.toLowerCase().includes(searchLower) ||\n ea.entity.Description?.toLowerCase().includes(searchLower)\n );\n }\n \n // Apply access level filter\n switch (filters.accessLevel) {\n case 'public':\n filtered = filtered.filter(ea => ea.isPublic);\n break;\n case 'restricted':\n filtered = filtered.filter(ea => !ea.isPublic && ea.permissions.length === 0);\n break;\n case 'custom':\n filtered = filtered.filter(ea => !ea.isPublic && ea.permissions.length > 0);\n break;\n }\n \n // Apply role filter\n if (filters.roleId) {\n filtered = filtered.filter(ea => \n ea.rolePermissions.has(filters.roleId!)\n );\n }\n \n this.filteredEntityAccess = filtered;\n }\n \n private calculateStats(): void {\n const publicEntities = this.entityAccess.filter(ea => ea.isPublic).length;\n const customPermissions = this.entityAccess.filter(ea => !ea.isPublic && ea.permissions.length > 0).length;\n const totalPermissions = this.entityAccess.reduce((sum, ea) => sum + ea.permissions.length, 0);\n \n this.stats = {\n totalEntities: this.entityAccess.length,\n publicEntities,\n restrictedEntities: this.entityAccess.length - publicEntities - customPermissions,\n totalPermissions\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({ entitySearch: value });\n }\n \n public onAccessLevelChange(level: 'all' | 'public' | 'restricted' | 'custom'): void {\n this.updateFilter({ accessLevel: level });\n }\n \n public onRoleFilterChange(event: Event): void {\n const value = (event.target as HTMLSelectElement).value;\n this.updateFilter({ roleId: value || null });\n }\n \n public updateFilter(partial: Partial<FilterOptions>): void {\n this.filters$.next({\n ...this.filters$.value,\n ...partial\n });\n }\n \n public toggleEntityExpansion(entityId: string): void {\n this.expandedEntityId = this.expandedEntityId === entityId ? null : entityId;\n }\n \n public isEntityExpanded(entityId: string): boolean {\n return this.expandedEntityId === entityId;\n }\n \n public editEntityPermissions(entityAccess: EntityAccess): void {\n console.log('Opening permission dialog for entity:', entityAccess.entity.Name);\n console.log('Entity permissions:', entityAccess.permissions);\n console.log('Available roles:', this.roles);\n \n this.permissionDialogData = {\n entity: entityAccess.entity,\n roles: this.roles,\n existingPermissions: entityAccess.permissions\n };\n this.showPermissionDialog = true;\n \n console.log('Dialog data set:', this.permissionDialogData);\n console.log('Dialog visible:', this.showPermissionDialog);\n }\n \n public onPermissionDialogResult(result: PermissionDialogResult): void {\n this.showPermissionDialog = false;\n this.permissionDialogData = null;\n\n if (result.action === 'save') {\n // Refresh the data after save\n this.loadInitialData();\n }\n }\n \n public async savePermissions(): Promise<void> {\n // This method is now handled by the dialog component\n // Keeping for backwards compatibility but not used\n console.warn('savePermissions method is deprecated - use PermissionDialogComponent instead');\n }\n \n public getAccessLevelClass(entityAccess: EntityAccess): string {\n if (entityAccess.isPublic) {\n return 'access-public';\n } else if (entityAccess.permissions.length === 0) {\n return 'access-restricted';\n } else {\n return 'access-custom';\n }\n }\n \n public getAccessLevelLabel(entityAccess: EntityAccess): string {\n if (entityAccess.isPublic) {\n return 'Public';\n } else if (entityAccess.permissions.length === 0) {\n return 'Restricted';\n } else {\n return 'Custom';\n }\n }\n \n public getRoleName(roleId: string): string {\n const role = this.roles.find(r => UUIDsEqual(r.ID, roleId));\n return role?.Name || 'Unknown Role';\n }\n \n public hasPermission(entityAccess: EntityAccess, roleId: string, permission: keyof PermissionLevel): boolean {\n const rolePermission = entityAccess.rolePermissions.get(roleId);\n return rolePermission ? rolePermission[permission] : false;\n }\n \n public refreshData(): void {\n this.loadInitialData();\n }\n \n public setViewMode(mode: 'grid' | 'list'): void {\n this.viewMode = mode;\n }\n}","<div class=\"entity-permissions-container\">\n <!-- Sticky Header Section - Contains controls that should always be visible -->\n <div class=\"sticky-header\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\" role=\"toolbar\" aria-label=\"Entity permissions actions\">\n <div class=\"mj-view-toggle\">\n <button mjButton\n [variant]=\"viewMode === 'list' ? 'primary' : 'flat'\"\n (click)=\"setViewMode('list')\"\n (keydown.enter)=\"setViewMode('list')\"\n (keydown.space)=\"setViewMode('list'); $event.preventDefault()\"\n [attr.aria-label]=\"'List view' + (viewMode === 'list' ? ' (active)' : '')\"\n [attr.aria-pressed]=\"viewMode === 'list'\"\n role=\"button\"\n tabindex=\"0\"\n title=\"List View\"\n >\n <i class=\"fa-solid fa-list\" aria-hidden=\"true\"></i>\n </button>\n <button mjButton\n [variant]=\"viewMode === 'grid' ? 'primary' : 'flat'\"\n (click)=\"setViewMode('grid')\"\n (keydown.enter)=\"setViewMode('grid')\"\n (keydown.space)=\"setViewMode('grid'); $event.preventDefault()\"\n [attr.aria-label]=\"'Grid view' + (viewMode === 'grid' ? ' (active)' : '')\"\n [attr.aria-pressed]=\"viewMode === 'grid'\"\n role=\"button\"\n tabindex=\"0\"\n title=\"Grid View\"\n >\n <i class=\"fa-solid fa-th\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button\n mjButton variant=\"secondary\" class=\"mj-btn-icon-mobile\"\n (click)=\"refreshData()\"\n [disabled]=\"isLoading\"\n aria-label=\"Refresh entity permissions data\"\n title=\"Refresh\"\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 </div>\n\n <!-- Stats Cards -->\n <div class=\"mj-grid-4\" role=\"region\" aria-label=\"Permission statistics\">\n <div class=\"mj-card\" role=\"article\" aria-label=\"Total entities statistic\">\n <div class=\"stat-icon stat-icon-total\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total entities count\">{{ stats.totalEntities }}</div>\n <div class=\"stat-label\">Total Entities</div>\n </div>\n </div>\n\n <div class=\"mj-card\" role=\"article\" aria-label=\"Public entities statistic\">\n <div class=\"stat-icon stat-icon-public\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-globe\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Public entities count\">{{ stats.publicEntities }}</div>\n <div class=\"stat-label\">Public Entities</div>\n </div>\n </div>\n\n <div class=\"mj-card\" role=\"article\" aria-label=\"Restricted entities statistic\">\n <div class=\"stat-icon stat-icon-restricted\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-lock\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Restricted entities count\">{{ stats.restrictedEntities }}</div>\n <div class=\"stat-label\">Restricted Entities</div>\n </div>\n </div>\n\n <div class=\"mj-card\" role=\"article\" aria-label=\"Total permissions statistic\">\n <div class=\"stat-icon stat-icon-permissions\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total permissions count\">{{ stats.totalPermissions }}</div>\n <div class=\"stat-label\">Total Permissions</div>\n </div>\n </div>\n </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\" role=\"search\" aria-label=\"Entity filters\">\n <div class=\"filters-row\">\n <!-- Mobile: Search + Filter Button Container -->\n <div class=\"mobile-search-container\">\n <!-- Entity 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 entities by name or description...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.entitySearch\"\n aria-label=\"Search entities\"\n />\n </div>\n\n <!-- Filter Button (Mobile Only) -->\n <button\n class=\"filter-button\"\n (click)=\"showMobileFilters = true\"\n aria-label=\"Open filters\"\n >\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n <span>Filters</span>\n </button>\n </div>\n\n <!-- Access Level Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" id=\"access-level-label\">Access Level</label>\n <div class=\"mj-filter-buttons\" role=\"group\" aria-labelledby=\"access-level-label\">\n <button mjButton\n [variant]=\"filters$.value.accessLevel === 'all' ? 'primary' : 'flat'\"\n (click)=\"onAccessLevelChange('all')\"\n [attr.aria-pressed]=\"filters$.value.accessLevel === 'all'\"\n aria-label=\"Show all access levels\"\n >\n All\n </button>\n <button mjButton\n [variant]=\"filters$.value.accessLevel === 'public' ? 'primary' : 'flat'\"\n (click)=\"onAccessLevelChange('public')\"\n [attr.aria-pressed]=\"filters$.value.accessLevel === 'public'\"\n aria-label=\"Show only public entities\"\n >\n Public\n </button>\n <button mjButton\n [variant]=\"filters$.value.accessLevel === 'restricted' ? 'primary' : 'flat'\"\n (click)=\"onAccessLevelChange('restricted')\"\n [attr.aria-pressed]=\"filters$.value.accessLevel === 'restricted'\"\n aria-label=\"Show only restricted entities\"\n >\n Restricted\n </button>\n <button mjButton\n [variant]=\"filters$.value.accessLevel === 'custom' ? 'primary' : 'flat'\"\n (click)=\"onAccessLevelChange('custom')\"\n [attr.aria-pressed]=\"filters$.value.accessLevel === 'custom'\"\n aria-label=\"Show only custom access entities\"\n >\n Custom\n </button>\n </div>\n </div>\n\n <!-- Role Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" for=\"role-filter\">Filter by Role</label>\n <select\n id=\"role-filter\"\n class=\"mj-filter-select\"\n (change)=\"onRoleFilterChange($event)\"\n aria-label=\"Filter entities 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 </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 entity permissions...\" 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\n mjButton variant=\"primary\"\n (click)=\"loadInitialData()\"\n aria-label=\"Retry loading entity permissions\"\n >\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 @if (viewMode === 'list') {\n <!-- List View -->\n <div class=\"entities-list\" role=\"list\" aria-label=\"Entity permissions list\">\n @for (ea of filteredEntityAccess; track ea.entity.ID) {\n <div\n class=\"entity-card\"\n [class.expanded]=\"isEntityExpanded(ea.entity.ID)\"\n role=\"listitem\"\n [attr.aria-expanded]=\"isEntityExpanded(ea.entity.ID)\"\n >\n <div\n class=\"entity-header\"\n (click)=\"toggleEntityExpansion(ea.entity.ID)\"\n (keydown.enter)=\"toggleEntityExpansion(ea.entity.ID)\"\n (keydown.space)=\"toggleEntityExpansion(ea.entity.ID); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Expand permissions for ' + ea.entity.Name\"\n >\n <div class=\"entity-info\">\n <div class=\"entity-icon-wrapper\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"entity-details\">\n <h3 class=\"entity-name\">{{ ea.entity.Name }}</h3>\n <p class=\"entity-description\">{{ ea.entity.Description || 'No description available' }}</p>\n </div>\n </div>\n\n <div class=\"entity-meta\">\n <span\n class=\"access-badge\"\n [class]=\"getAccessLevelClass(ea)\"\n [attr.aria-label]=\"'Access level: ' + getAccessLevelLabel(ea)\"\n >\n <i\n [class]=\"getAccessLevelClass(ea) === 'access-public' ? 'fa-solid fa-globe' :\n getAccessLevelClass(ea) === 'access-restricted' ? 'fa-solid fa-lock' :\n 'fa-solid fa-key'\"\n aria-hidden=\"true\"\n ></i>\n {{ getAccessLevelLabel(ea) }}\n </span>\n <div class=\"entity-actions\" (click)=\"$event.stopPropagation()\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editEntityPermissions(ea)\"\n title=\"Edit Permissions\"\n [attr.aria-label]=\"'Edit permissions for ' + ea.entity.Name\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button\n class=\"expand-btn\"\n [attr.aria-label]=\"(isEntityExpanded(ea.entity.ID) ? 'Collapse' : 'Expand') + ' permissions for ' + ea.entity.Name\"\n >\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (isEntityExpanded(ea.entity.ID)) {\n <div class=\"entity-content\" role=\"region\" [attr.aria-label]=\"'Permissions for ' + ea.entity.Name\">\n <!-- Mobile-only actions bar -->\n <div class=\"mobile-actions-bar\" (click)=\"$event.stopPropagation()\">\n <span class=\"access-badge\" [class]=\"getAccessLevelClass(ea)\">\n <i\n [class]=\"getAccessLevelClass(ea) === 'access-public' ? 'fa-solid fa-globe' :\n getAccessLevelClass(ea) === 'access-restricted' ? 'fa-solid fa-lock' :\n 'fa-solid fa-key'\"\n aria-hidden=\"true\"\n ></i>\n {{ getAccessLevelLabel(ea) }}\n </span>\n <div class=\"mobile-action-buttons\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editEntityPermissions(ea)\"\n title=\"Edit Permissions\"\n [attr.aria-label]=\"'Edit permissions for ' + ea.entity.Name\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">Edit</span>\n </button>\n </div>\n </div>\n\n @if (ea.permissions.length > 0) {\n <table class=\"permissions-grid\" role=\"table\" aria-label=\"Role permissions\">\n <thead class=\"permissions-header\" role=\"rowgroup\">\n <tr role=\"row\">\n <th class=\"role-header\" scope=\"col\" role=\"columnheader\">Role</th>\n <th class=\"permission-header\" scope=\"col\" role=\"columnheader\">Create</th>\n <th class=\"permission-header\" scope=\"col\" role=\"columnheader\">Read</th>\n <th class=\"permission-header\" scope=\"col\" role=\"columnheader\">Update</th>\n <th class=\"permission-header\" scope=\"col\" role=\"columnheader\">Delete</th>\n </tr>\n </thead>\n <tbody role=\"rowgroup\">\n @for (roleId of ea.rolePermissions.keys(); track roleId) {\n <tr class=\"permission-row\" role=\"row\">\n <td class=\"role-name\" role=\"cell\">{{ getRoleName(roleId) }}</td>\n <td class=\"permission-cell\" role=\"cell\" [attr.aria-label]=\"'Create: ' + (hasPermission(ea, roleId, 'canCreate') ? 'allowed' : 'denied')\">\n <i\n [class]=\"hasPermission(ea, roleId, 'canCreate') ?\n 'fa-solid fa-check text-success' :\n 'fa-solid fa-times text-muted'\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </td>\n <td class=\"permission-cell\" role=\"cell\" [attr.aria-label]=\"'Read: ' + (hasPermission(ea, roleId, 'canRead') ? 'allowed' : 'denied')\">\n <i\n [class]=\"hasPermission(ea, roleId, 'canRead') ?\n 'fa-solid fa-check text-success' :\n 'fa-solid fa-times text-muted'\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </td>\n <td class=\"permission-cell\" role=\"cell\" [attr.aria-label]=\"'Update: ' + (hasPermission(ea, roleId, 'canUpdate') ? 'allowed' : 'denied')\">\n <i\n [class]=\"hasPermission(ea, roleId, 'canUpdate') ?\n 'fa-solid fa-check text-success' :\n 'fa-solid fa-times text-muted'\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </td>\n <td class=\"permission-cell\" role=\"cell\" [attr.aria-label]=\"'Delete: ' + (hasPermission(ea, roleId, 'canDelete') ? 'allowed' : 'denied')\">\n <i\n [class]=\"hasPermission(ea, roleId, 'canDelete') ?\n 'fa-solid fa-check text-success' :\n 'fa-solid fa-times text-muted'\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <p class=\"no-permissions\">\n @if (ea.isPublic) {\n This entity is publicly accessible by all users.\n } @else {\n No specific role permissions configured. Access is restricted to system administrators.\n }\n </p>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- Grid View -->\n <div class=\"entities-grid\" role=\"list\" aria-label=\"Entity permissions grid\">\n @for (ea of filteredEntityAccess; track ea.entity.ID) {\n <article\n class=\"entity-grid-card\"\n [class]=\"getAccessLevelClass(ea)\"\n [attr.aria-label]=\"'Entity: ' + ea.entity.Name\"\n >\n <div class=\"grid-card-header\">\n <i class=\"fa-solid fa-table\" aria-hidden=\"true\"></i>\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editEntityPermissions(ea)\"\n [attr.aria-label]=\"'Edit permissions for ' + ea.entity.Name\"\n title=\"Edit Permissions\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <h4 class=\"grid-card-title\">{{ ea.entity.Name }}</h4>\n <p class=\"grid-card-description\">{{ ea.entity.Description || 'No description' }}</p>\n <div class=\"grid-card-footer\">\n <span\n class=\"access-label\"\n [attr.aria-label]=\"'Access level: ' + getAccessLevelLabel(ea)\"\n >\n <i\n [class]=\"getAccessLevelClass(ea) === 'access-public' ? 'fa-solid fa-globe' :\n getAccessLevelClass(ea) === 'access-restricted' ? 'fa-solid fa-lock' :\n 'fa-solid fa-key'\"\n aria-hidden=\"true\"\n ></i>\n {{ getAccessLevelLabel(ea) }}\n </span>\n @if (ea.permissions.length > 0) {\n <span\n class=\"permission-count\"\n [attr.aria-label]=\"ea.permissions.length + ' permission' + (ea.permissions.length === 1 ? '' : 's')\"\n >\n {{ ea.permissions.length }} permission{{ ea.permissions.length === 1 ? '' : 's' }}\n </span>\n }\n </div>\n </article>\n }\n </div>\n }\n\n @if (filteredEntityAccess.length === 0) {\n <div class=\"empty-state\" role=\"status\">\n <i class=\"fa-solid fa-shield-alt empty-state-icon\" aria-hidden=\"true\"></i>\n <h3 class=\"empty-text\">No Permissions Found</h3>\n <p class=\"empty-subtext\">Try adjusting your filters or refresh the data.</p>\n <button\n mjButton variant=\"primary\"\n (click)=\"refreshData()\"\n aria-label=\"Refresh permissions data\"\n >\n <i class=\"fa-solid fa-refresh\" aria-hidden=\"true\"></i>\n Refresh\n </button>\n </div>\n }\n </div>\n }\n </div><!-- End Scrollable Content -->\n\n <!-- Permission Edit Dialog -->\n <mj-permission-dialog\n [visible]=\"showPermissionDialog\"\n [data]=\"permissionDialogData\"\n (result)=\"onPermissionDialogResult($event)\"\n ></mj-permission-dialog>\n\n <!-- Mobile Filter Modal -->\n @if (showMobileFilters) {\n <div\n class=\"filter-modal-backdrop\"\n (click)=\"showMobileFilters = false\"\n role=\"presentation\"\n >\n <div\n class=\"filter-modal\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"filter-modal-title\"\n >\n <div class=\"filter-modal-header\">\n <h3 class=\"filter-modal-title\" id=\"filter-modal-title\">\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n Filters\n </h3>\n <button\n class=\"filter-modal-close\"\n (click)=\"showMobileFilters = false\"\n aria-label=\"Close filters\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"filter-modal-body\">\n <div class=\"filter-options-container\">\n <!-- Access Level Filter -->\n <div class=\"filter-group\">\n <h4 class=\"filter-group-label\">Access Level</h4>\n <div class=\"filter-group-options\">\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.accessLevel === 'all'\"\n >\n <input\n type=\"radio\"\n name=\"accessLevel\"\n value=\"all\"\n [checked]=\"filters$.value.accessLevel === 'all'\"\n (change)=\"onAccessLevelChange('all')\"\n />\n <span class=\"filter-option-label\">All Levels</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.accessLevel === 'public'\"\n >\n <input\n type=\"radio\"\n name=\"accessLevel\"\n value=\"public\"\n [checked]=\"filters$.value.accessLevel === 'public'\"\n (change)=\"onAccessLevelChange('public')\"\n />\n <span class=\"filter-option-label\">Public Entities</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.accessLevel === 'restricted'\"\n >\n <input\n type=\"radio\"\n name=\"accessLevel\"\n value=\"restricted\"\n [checked]=\"filters$.value.accessLevel === 'restricted'\"\n (change)=\"onAccessLevelChange('restricted')\"\n />\n <span class=\"filter-option-label\">Restricted Entities</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.accessLevel === 'custom'\"\n >\n <input\n type=\"radio\"\n name=\"accessLevel\"\n value=\"custom\"\n [checked]=\"filters$.value.accessLevel === 'custom'\"\n (change)=\"onAccessLevelChange('custom')\"\n />\n <span class=\"filter-option-label\">Custom Access Entities</span>\n </label>\n </div>\n </div>\n\n <!-- Role Filter -->\n <div class=\"filter-group\">\n <h4 class=\"filter-group-label\">Filter by Role</h4>\n <div class=\"filter-group-options\">\n <label class=\"filter-option\" [class.selected]=\"!filters$.value.roleId\">\n <input\n type=\"radio\"\n name=\"role\"\n value=\"\"\n [checked]=\"!filters$.value.roleId\"\n (change)=\"onRoleFilterChange($event)\"\n />\n <span class=\"filter-option-label\">All Roles</span>\n </label>\n @for (role of roles; track role.ID) {\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.roleId === role.ID\"\n >\n <input\n type=\"radio\"\n name=\"role\"\n [value]=\"role.ID\"\n [checked]=\"filters$.value.roleId === role.ID\"\n (change)=\"onRoleFilterChange($event)\"\n />\n <span class=\"filter-option-label\">{{ role.Name }}</span>\n </label>\n }\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"filter-modal-footer\">\n <button\n mjButton variant=\"primary\"\n (click)=\"showMobileFilters = false\"\n >\n Apply Filters\n </button>\n <button\n mjButton\n (click)=\"showMobileFilters = false\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"entity-permissions.component.js","sourceRoot":"","sources":["../../../src/lib/entity-permissions/entity-permissions.component.ts","../../../src/lib/entity-permissions/entity-permissions.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 {\n MJEntityPermissionEntity,\n MJEntityEntity,\n MJRoleEntity,\n ResourceData\n} from '@memberjunction/core-entities';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { PermissionDialogData, PermissionDialogResult } from './permission-dialog/permission-dialog.component';\n\ninterface PermissionsStats {\n totalEntities: number;\n publicEntities: number;\n restrictedEntities: number;\n totalPermissions: number;\n}\n\ninterface FilterOptions {\n entitySearch: string;\n accessLevel: 'all' | 'public' | 'restricted' | 'custom';\n roleId: string | null;\n}\n\ninterface EntityAccess {\n entity: MJEntityEntity;\n isPublic: boolean;\n permissions: MJEntityPermissionEntity[];\n rolePermissions: Map<string, PermissionLevel>;\n}\n\ninterface PermissionLevel {\n canCreate: boolean;\n canRead: boolean;\n canUpdate: boolean;\n canDelete: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-entity-permissions',\n templateUrl: './entity-permissions.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './entity-permissions.component.css']\n})\n@RegisterClass(BaseDashboard, 'EntityPermissions')\nexport class EntityPermissionsComponent extends BaseDashboard implements OnDestroy {\n // State management\n public entityAccess: EntityAccess[] = [];\n public filteredEntityAccess: EntityAccess[] = [];\n public roles: MJRoleEntity[] = [];\n public isLoading = false;\n public error: string | null = null;\n \n // Permission dialog state\n public showPermissionDialog = false;\n public permissionDialogData: PermissionDialogData | null = null;\n \n // Stats\n public stats: PermissionsStats = {\n totalEntities: 0,\n publicEntities: 0,\n restrictedEntities: 0,\n totalPermissions: 0\n };\n \n // Filters\n public filters$ = new BehaviorSubject<FilterOptions>({\n entitySearch: '',\n accessLevel: 'all',\n roleId: null\n });\n \n // UI State\n public expandedEntityId: string | null = null;\n public viewMode: 'grid' | 'list' = 'list';\n public showMobileFilters = false;\n\n protected override 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 \"Permissions\"\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 all required data in parallel\n const [entities, permissions, roles] = await Promise.all([\n this.loadEntities(),\n this.loadEntityPermissions(),\n this.loadRoles()\n ]);\n \n // Process the data\n this.roles = roles;\n this.processEntityAccess(entities, permissions);\n this.calculateStats();\n this.applyFilters();\n \n } catch (error) {\n console.error('Error loading permissions data:', error);\n this.error = 'Failed to load permissions 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 loadEntities(): Promise<MJEntityEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJEntityEntity>({\n EntityName: 'MJ: Entities',\n ResultType: 'entity_object',\n OrderBy: 'Name ASC'\n });\n \n return result.Success ? result.Results : [];\n }\n \n private async loadEntityPermissions(): Promise<MJEntityPermissionEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJEntityPermissionEntity>({\n EntityName: 'MJ: Entity Permissions',\n ResultType: 'entity_object',\n OrderBy: 'EntityID, RoleID'\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 processEntityAccess(entities: MJEntityEntity[], permissions: MJEntityPermissionEntity[]): void {\n // Group permissions by entity\n const permissionsByEntity = new Map<string, MJEntityPermissionEntity[]>();\n \n for (const permission of permissions) {\n const entityId = permission.EntityID;\n if (!permissionsByEntity.has(entityId)) {\n permissionsByEntity.set(entityId, []);\n }\n permissionsByEntity.get(entityId)!.push(permission);\n }\n \n // Create EntityAccess objects\n this.entityAccess = entities.map(entity => {\n const entityPermissions = permissionsByEntity.get(entity.ID) || [];\n const rolePermissions = new Map<string, PermissionLevel>();\n \n // Process permissions by role\n for (const permission of entityPermissions) {\n if (permission.RoleID) {\n rolePermissions.set(permission.RoleID, {\n canCreate: permission.CanCreate || false,\n canRead: permission.CanRead || false,\n canUpdate: permission.CanUpdate || false,\n canDelete: permission.CanDelete || false\n });\n }\n }\n \n return {\n entity,\n isPublic: entity.AllowAllRowsAPI || false,\n permissions: entityPermissions,\n rolePermissions\n };\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.entityAccess];\n \n // Apply entity search\n if (filters.entitySearch) {\n const searchLower = filters.entitySearch.toLowerCase();\n filtered = filtered.filter(ea =>\n ea.entity.Name?.toLowerCase().includes(searchLower) ||\n ea.entity.Description?.toLowerCase().includes(searchLower)\n );\n }\n \n // Apply access level filter\n switch (filters.accessLevel) {\n case 'public':\n filtered = filtered.filter(ea => ea.isPublic);\n break;\n case 'restricted':\n filtered = filtered.filter(ea => !ea.isPublic && ea.permissions.length === 0);\n break;\n case 'custom':\n filtered = filtered.filter(ea => !ea.isPublic && ea.permissions.length > 0);\n break;\n }\n \n // Apply role filter\n if (filters.roleId) {\n filtered = filtered.filter(ea => \n ea.rolePermissions.has(filters.roleId!)\n );\n }\n \n this.filteredEntityAccess = filtered;\n }\n \n private calculateStats(): void {\n const publicEntities = this.entityAccess.filter(ea => ea.isPublic).length;\n const customPermissions = this.entityAccess.filter(ea => !ea.isPublic && ea.permissions.length > 0).length;\n const totalPermissions = this.entityAccess.reduce((sum, ea) => sum + ea.permissions.length, 0);\n \n this.stats = {\n totalEntities: this.entityAccess.length,\n publicEntities,\n restrictedEntities: this.entityAccess.length - publicEntities - customPermissions,\n totalPermissions\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({ entitySearch: value });\n }\n \n public onAccessLevelChange(level: 'all' | 'public' | 'restricted' | 'custom'): void {\n this.updateFilter({ accessLevel: level });\n }\n \n public onRoleFilterChange(event: Event): void {\n const value = (event.target as HTMLSelectElement).value;\n this.updateFilter({ roleId: value || null });\n }\n \n public updateFilter(partial: Partial<FilterOptions>): void {\n this.filters$.next({\n ...this.filters$.value,\n ...partial\n });\n }\n \n public toggleEntityExpansion(entityId: string): void {\n this.expandedEntityId = this.expandedEntityId === entityId ? null : entityId;\n }\n \n public isEntityExpanded(entityId: string): boolean {\n return this.expandedEntityId === entityId;\n }\n \n public editEntityPermissions(entityAccess: EntityAccess): void {\n console.log('Opening permission dialog for entity:', entityAccess.entity.Name);\n console.log('Entity permissions:', entityAccess.permissions);\n console.log('Available roles:', this.roles);\n \n this.permissionDialogData = {\n entity: entityAccess.entity,\n roles: this.roles,\n existingPermissions: entityAccess.permissions\n };\n this.showPermissionDialog = true;\n \n console.log('Dialog data set:', this.permissionDialogData);\n console.log('Dialog visible:', this.showPermissionDialog);\n }\n \n public onPermissionDialogResult(result: PermissionDialogResult): void {\n this.showPermissionDialog = false;\n this.permissionDialogData = null;\n\n if (result.action === 'save') {\n // Refresh the data after save\n this.loadInitialData();\n }\n }\n \n public async savePermissions(): Promise<void> {\n // This method is now handled by the dialog component\n // Keeping for backwards compatibility but not used\n console.warn('savePermissions method is deprecated - use PermissionDialogComponent instead');\n }\n \n public getAccessLevelClass(entityAccess: EntityAccess): string {\n if (entityAccess.isPublic) {\n return 'access-public';\n } else if (entityAccess.permissions.length === 0) {\n return 'access-restricted';\n } else {\n return 'access-custom';\n }\n }\n \n public getAccessLevelLabel(entityAccess: EntityAccess): string {\n if (entityAccess.isPublic) {\n return 'Public';\n } else if (entityAccess.permissions.length === 0) {\n return 'Restricted';\n } else {\n return 'Custom';\n }\n }\n \n public getRoleName(roleId: string): string {\n const role = this.roles.find(r => UUIDsEqual(r.ID, roleId));\n return role?.Name || 'Unknown Role';\n }\n \n public hasPermission(entityAccess: EntityAccess, roleId: string, permission: keyof PermissionLevel): boolean {\n const rolePermission = entityAccess.rolePermissions.get(roleId);\n return rolePermission ? rolePermission[permission] : false;\n }\n \n public refreshData(): void {\n this.loadInitialData();\n }\n \n public setViewMode(mode: 'grid' | 'list'): void {\n this.viewMode = mode;\n }\n}","<div class=\"entity-permissions-container\">\n <!-- Sticky Header Section - Contains controls that should always be visible -->\n <div class=\"sticky-header\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\" role=\"toolbar\" aria-label=\"Entity permissions actions\">\n <div class=\"mj-view-toggle\">\n <button mjButton\n [variant]=\"viewMode === 'list' ? 'primary' : 'flat'\"\n (click)=\"setViewMode('list')\"\n (keydown.enter)=\"setViewMode('list')\"\n (keydown.space)=\"setViewMode('list'); $event.preventDefault()\"\n [attr.aria-label]=\"'List view' + (viewMode === 'list' ? ' (active)' : '')\"\n [attr.aria-pressed]=\"viewMode === 'list'\"\n role=\"button\"\n tabindex=\"0\"\n title=\"List View\"\n >\n <i class=\"fa-solid fa-list\" aria-hidden=\"true\"></i>\n </button>\n <button mjButton\n [variant]=\"viewMode === 'grid' ? 'primary' : 'flat'\"\n (click)=\"setViewMode('grid')\"\n (keydown.enter)=\"setViewMode('grid')\"\n (keydown.space)=\"setViewMode('grid'); $event.preventDefault()\"\n [attr.aria-label]=\"'Grid view' + (viewMode === 'grid' ? ' (active)' : '')\"\n [attr.aria-pressed]=\"viewMode === 'grid'\"\n role=\"button\"\n tabindex=\"0\"\n title=\"Grid View\"\n >\n <i class=\"fa-solid fa-th\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button\n mjButton variant=\"secondary\" class=\"mj-btn-icon-mobile\"\n (click)=\"refreshData()\"\n [disabled]=\"isLoading\"\n aria-label=\"Refresh entity permissions data\"\n title=\"Refresh\"\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 </div>\n\n <!-- Stats Cards -->\n <div class=\"mj-grid-4\" role=\"region\" aria-label=\"Permission statistics\">\n <div class=\"mj-card\" role=\"article\" aria-label=\"Total entities statistic\">\n <div class=\"stat-icon stat-icon-total\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total entities count\">{{ stats.totalEntities }}</div>\n <div class=\"stat-label\">Total Entities</div>\n </div>\n </div>\n\n <div class=\"mj-card\" role=\"article\" aria-label=\"Public entities statistic\">\n <div class=\"stat-icon stat-icon-public\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-globe\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Public entities count\">{{ stats.publicEntities }}</div>\n <div class=\"stat-label\">Public Entities</div>\n </div>\n </div>\n\n <div class=\"mj-card\" role=\"article\" aria-label=\"Restricted entities statistic\">\n <div class=\"stat-icon stat-icon-restricted\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-lock\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Restricted entities count\">{{ stats.restrictedEntities }}</div>\n <div class=\"stat-label\">Restricted Entities</div>\n </div>\n </div>\n\n <div class=\"mj-card\" role=\"article\" aria-label=\"Total permissions statistic\">\n <div class=\"stat-icon stat-icon-permissions\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-key\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total permissions count\">{{ stats.totalPermissions }}</div>\n <div class=\"stat-label\">Total Permissions</div>\n </div>\n </div>\n </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\" role=\"search\" aria-label=\"Entity filters\">\n <div class=\"filters-row\">\n <!-- Mobile: Search + Filter Button Container -->\n <div class=\"mobile-search-container\">\n <!-- Entity 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 entities by name or description...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.entitySearch\"\n aria-label=\"Search entities\"\n />\n </div>\n\n <!-- Filter Button (Mobile Only) -->\n <button\n class=\"filter-button\"\n (click)=\"showMobileFilters = true\"\n aria-label=\"Open filters\"\n >\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n <span>Filters</span>\n </button>\n </div>\n\n <!-- Access Level Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" id=\"access-level-label\">Access Level</label>\n <div class=\"mj-filter-buttons\" role=\"group\" aria-labelledby=\"access-level-label\">\n <button mjButton\n [variant]=\"filters$.value.accessLevel === 'all' ? 'primary' : 'flat'\"\n (click)=\"onAccessLevelChange('all')\"\n [attr.aria-pressed]=\"filters$.value.accessLevel === 'all'\"\n aria-label=\"Show all access levels\"\n >\n All\n </button>\n <button mjButton\n [variant]=\"filters$.value.accessLevel === 'public' ? 'primary' : 'flat'\"\n (click)=\"onAccessLevelChange('public')\"\n [attr.aria-pressed]=\"filters$.value.accessLevel === 'public'\"\n aria-label=\"Show only public entities\"\n >\n Public\n </button>\n <button mjButton\n [variant]=\"filters$.value.accessLevel === 'restricted' ? 'primary' : 'flat'\"\n (click)=\"onAccessLevelChange('restricted')\"\n [attr.aria-pressed]=\"filters$.value.accessLevel === 'restricted'\"\n aria-label=\"Show only restricted entities\"\n >\n Restricted\n </button>\n <button mjButton\n [variant]=\"filters$.value.accessLevel === 'custom' ? 'primary' : 'flat'\"\n (click)=\"onAccessLevelChange('custom')\"\n [attr.aria-pressed]=\"filters$.value.accessLevel === 'custom'\"\n aria-label=\"Show only custom access entities\"\n >\n Custom\n </button>\n </div>\n </div>\n\n <!-- Role Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" for=\"role-filter\">Filter by Role</label>\n <select\n id=\"role-filter\"\n class=\"mj-filter-select\"\n (change)=\"onRoleFilterChange($event)\"\n aria-label=\"Filter entities 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 </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 entity permissions...\" 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\n mjButton variant=\"primary\"\n (click)=\"loadInitialData()\"\n aria-label=\"Retry loading entity permissions\"\n >\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 @if (viewMode === 'list') {\n <!-- List View -->\n <div class=\"entities-list\" role=\"list\" aria-label=\"Entity permissions list\">\n @for (ea of filteredEntityAccess; track ea.entity.ID) {\n <div\n class=\"entity-card\"\n [class.expanded]=\"isEntityExpanded(ea.entity.ID)\"\n role=\"listitem\"\n [attr.aria-expanded]=\"isEntityExpanded(ea.entity.ID)\"\n >\n <div\n class=\"entity-header\"\n (click)=\"toggleEntityExpansion(ea.entity.ID)\"\n (keydown.enter)=\"toggleEntityExpansion(ea.entity.ID)\"\n (keydown.space)=\"toggleEntityExpansion(ea.entity.ID); $event.preventDefault()\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'Expand permissions for ' + ea.entity.Name\"\n >\n <div class=\"entity-info\">\n <div class=\"entity-icon-wrapper\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"entity-details\">\n <h3 class=\"entity-name\">{{ ea.entity.Name }}</h3>\n <p class=\"entity-description\">{{ ea.entity.Description || 'No description available' }}</p>\n </div>\n </div>\n\n <div class=\"entity-meta\">\n <span\n class=\"access-badge\"\n [class]=\"getAccessLevelClass(ea)\"\n [attr.aria-label]=\"'Access level: ' + getAccessLevelLabel(ea)\"\n >\n <i\n [class]=\"getAccessLevelClass(ea) === 'access-public' ? 'fa-solid fa-globe' :\n getAccessLevelClass(ea) === 'access-restricted' ? 'fa-solid fa-lock' :\n 'fa-solid fa-key'\"\n aria-hidden=\"true\"\n ></i>\n {{ getAccessLevelLabel(ea) }}\n </span>\n <div class=\"entity-actions\" (click)=\"$event.stopPropagation()\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editEntityPermissions(ea)\"\n title=\"Edit Permissions\"\n [attr.aria-label]=\"'Edit permissions for ' + ea.entity.Name\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button\n class=\"expand-btn\"\n [attr.aria-label]=\"(isEntityExpanded(ea.entity.ID) ? 'Collapse' : 'Expand') + ' permissions for ' + ea.entity.Name\"\n >\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (isEntityExpanded(ea.entity.ID)) {\n <div class=\"entity-content\" role=\"region\" [attr.aria-label]=\"'Permissions for ' + ea.entity.Name\">\n <!-- Mobile-only actions bar -->\n <div class=\"mobile-actions-bar\" (click)=\"$event.stopPropagation()\">\n <span class=\"access-badge\" [class]=\"getAccessLevelClass(ea)\">\n <i\n [class]=\"getAccessLevelClass(ea) === 'access-public' ? 'fa-solid fa-globe' :\n getAccessLevelClass(ea) === 'access-restricted' ? 'fa-solid fa-lock' :\n 'fa-solid fa-key'\"\n aria-hidden=\"true\"\n ></i>\n {{ getAccessLevelLabel(ea) }}\n </span>\n <div class=\"mobile-action-buttons\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editEntityPermissions(ea)\"\n title=\"Edit Permissions\"\n [attr.aria-label]=\"'Edit permissions for ' + ea.entity.Name\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">Edit</span>\n </button>\n </div>\n </div>\n\n @if (ea.permissions.length > 0) {\n <table class=\"permissions-grid\" role=\"table\" aria-label=\"Role permissions\">\n <thead class=\"permissions-header\" role=\"rowgroup\">\n <tr role=\"row\">\n <th class=\"role-header\" scope=\"col\" role=\"columnheader\">Role</th>\n <th class=\"permission-header\" scope=\"col\" role=\"columnheader\">Create</th>\n <th class=\"permission-header\" scope=\"col\" role=\"columnheader\">Read</th>\n <th class=\"permission-header\" scope=\"col\" role=\"columnheader\">Update</th>\n <th class=\"permission-header\" scope=\"col\" role=\"columnheader\">Delete</th>\n </tr>\n </thead>\n <tbody role=\"rowgroup\">\n @for (roleId of ea.rolePermissions.keys(); track roleId) {\n <tr class=\"permission-row\" role=\"row\">\n <td class=\"role-name\" role=\"cell\">{{ getRoleName(roleId) }}</td>\n <td class=\"permission-cell\" role=\"cell\" [attr.aria-label]=\"'Create: ' + (hasPermission(ea, roleId, 'canCreate') ? 'allowed' : 'denied')\">\n <i\n [class]=\"hasPermission(ea, roleId, 'canCreate') ?\n 'fa-solid fa-check text-success' :\n 'fa-solid fa-times text-muted'\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </td>\n <td class=\"permission-cell\" role=\"cell\" [attr.aria-label]=\"'Read: ' + (hasPermission(ea, roleId, 'canRead') ? 'allowed' : 'denied')\">\n <i\n [class]=\"hasPermission(ea, roleId, 'canRead') ?\n 'fa-solid fa-check text-success' :\n 'fa-solid fa-times text-muted'\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </td>\n <td class=\"permission-cell\" role=\"cell\" [attr.aria-label]=\"'Update: ' + (hasPermission(ea, roleId, 'canUpdate') ? 'allowed' : 'denied')\">\n <i\n [class]=\"hasPermission(ea, roleId, 'canUpdate') ?\n 'fa-solid fa-check text-success' :\n 'fa-solid fa-times text-muted'\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </td>\n <td class=\"permission-cell\" role=\"cell\" [attr.aria-label]=\"'Delete: ' + (hasPermission(ea, roleId, 'canDelete') ? 'allowed' : 'denied')\">\n <i\n [class]=\"hasPermission(ea, roleId, 'canDelete') ?\n 'fa-solid fa-check text-success' :\n 'fa-solid fa-times text-muted'\"\n [attr.aria-hidden]=\"true\"\n ></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <p class=\"no-permissions\">\n @if (ea.isPublic) {\n This entity is publicly accessible by all users.\n } @else {\n No specific role permissions configured. Access is restricted to system administrators.\n }\n </p>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- Grid View -->\n <div class=\"entities-grid\" role=\"list\" aria-label=\"Entity permissions grid\">\n @for (ea of filteredEntityAccess; track ea.entity.ID) {\n <article\n class=\"entity-grid-card\"\n [class]=\"getAccessLevelClass(ea)\"\n [attr.aria-label]=\"'Entity: ' + ea.entity.Name\"\n >\n <div class=\"grid-card-header\">\n <i class=\"fa-solid fa-table\" aria-hidden=\"true\"></i>\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editEntityPermissions(ea)\"\n [attr.aria-label]=\"'Edit permissions for ' + ea.entity.Name\"\n title=\"Edit Permissions\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <h4 class=\"grid-card-title\">{{ ea.entity.Name }}</h4>\n <p class=\"grid-card-description\">{{ ea.entity.Description || 'No description' }}</p>\n <div class=\"grid-card-footer\">\n <span\n class=\"access-label\"\n [attr.aria-label]=\"'Access level: ' + getAccessLevelLabel(ea)\"\n >\n <i\n [class]=\"getAccessLevelClass(ea) === 'access-public' ? 'fa-solid fa-globe' :\n getAccessLevelClass(ea) === 'access-restricted' ? 'fa-solid fa-lock' :\n 'fa-solid fa-key'\"\n aria-hidden=\"true\"\n ></i>\n {{ getAccessLevelLabel(ea) }}\n </span>\n @if (ea.permissions.length > 0) {\n <span\n class=\"permission-count\"\n [attr.aria-label]=\"ea.permissions.length + ' permission' + (ea.permissions.length === 1 ? '' : 's')\"\n >\n {{ ea.permissions.length }} permission{{ ea.permissions.length === 1 ? '' : 's' }}\n </span>\n }\n </div>\n </article>\n }\n </div>\n }\n\n @if (filteredEntityAccess.length === 0) {\n <div class=\"empty-state\" role=\"status\">\n <i class=\"fa-solid fa-shield-alt empty-state-icon\" aria-hidden=\"true\"></i>\n <h3 class=\"empty-text\">No Permissions Found</h3>\n <p class=\"empty-subtext\">Try adjusting your filters or refresh the data.</p>\n <button\n mjButton variant=\"primary\"\n (click)=\"refreshData()\"\n aria-label=\"Refresh permissions data\"\n >\n <i class=\"fa-solid fa-refresh\" aria-hidden=\"true\"></i>\n Refresh\n </button>\n </div>\n }\n </div>\n }\n </div><!-- End Scrollable Content -->\n\n <!-- Permission Edit Dialog -->\n <mj-permission-dialog\n [visible]=\"showPermissionDialog\"\n [data]=\"permissionDialogData\"\n (result)=\"onPermissionDialogResult($event)\"\n ></mj-permission-dialog>\n\n <!-- Mobile Filter Modal -->\n @if (showMobileFilters) {\n <div\n class=\"filter-modal-backdrop\"\n (click)=\"showMobileFilters = false\"\n role=\"presentation\"\n >\n <div\n class=\"filter-modal\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"filter-modal-title\"\n >\n <div class=\"filter-modal-header\">\n <h3 class=\"filter-modal-title\" id=\"filter-modal-title\">\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n Filters\n </h3>\n <button\n class=\"filter-modal-close\"\n (click)=\"showMobileFilters = false\"\n aria-label=\"Close filters\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"filter-modal-body\">\n <div class=\"filter-options-container\">\n <!-- Access Level Filter -->\n <div class=\"filter-group\">\n <h4 class=\"filter-group-label\">Access Level</h4>\n <div class=\"filter-group-options\">\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.accessLevel === 'all'\"\n >\n <input\n type=\"radio\"\n name=\"accessLevel\"\n value=\"all\"\n [checked]=\"filters$.value.accessLevel === 'all'\"\n (change)=\"onAccessLevelChange('all')\"\n />\n <span class=\"filter-option-label\">All Levels</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.accessLevel === 'public'\"\n >\n <input\n type=\"radio\"\n name=\"accessLevel\"\n value=\"public\"\n [checked]=\"filters$.value.accessLevel === 'public'\"\n (change)=\"onAccessLevelChange('public')\"\n />\n <span class=\"filter-option-label\">Public Entities</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.accessLevel === 'restricted'\"\n >\n <input\n type=\"radio\"\n name=\"accessLevel\"\n value=\"restricted\"\n [checked]=\"filters$.value.accessLevel === 'restricted'\"\n (change)=\"onAccessLevelChange('restricted')\"\n />\n <span class=\"filter-option-label\">Restricted Entities</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.accessLevel === 'custom'\"\n >\n <input\n type=\"radio\"\n name=\"accessLevel\"\n value=\"custom\"\n [checked]=\"filters$.value.accessLevel === 'custom'\"\n (change)=\"onAccessLevelChange('custom')\"\n />\n <span class=\"filter-option-label\">Custom Access Entities</span>\n </label>\n </div>\n </div>\n\n <!-- Role Filter -->\n <div class=\"filter-group\">\n <h4 class=\"filter-group-label\">Filter by Role</h4>\n <div class=\"filter-group-options\">\n <label class=\"filter-option\" [class.selected]=\"!filters$.value.roleId\">\n <input\n type=\"radio\"\n name=\"role\"\n value=\"\"\n [checked]=\"!filters$.value.roleId\"\n (change)=\"onRoleFilterChange($event)\"\n />\n <span class=\"filter-option-label\">All Roles</span>\n </label>\n @for (role of roles; track role.ID) {\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.roleId === role.ID\"\n >\n <input\n type=\"radio\"\n name=\"role\"\n [value]=\"role.ID\"\n [checked]=\"filters$.value.roleId === role.ID\"\n (change)=\"onRoleFilterChange($event)\"\n />\n <span class=\"filter-option-label\">{{ role.Name }}</span>\n </label>\n }\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"filter-modal-footer\">\n <button\n mjButton variant=\"primary\"\n (click)=\"showMobileFilters = false\"\n >\n Apply Filters\n </button>\n <button\n mjButton\n (click)=\"showMobileFilters = false\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OnDestroy, ChangeDetectorRef, NgZone } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
2
|
+
import { Subject, BehaviorSubject } from 'rxjs';
|
|
3
3
|
import { ResourceData, MJRoleEntity } from '@memberjunction/core-entities';
|
|
4
4
|
import { BaseDashboard } from '@memberjunction/ng-shared';
|
|
5
5
|
import { RoleDialogData, RoleDialogResult } from './role-dialog/role-dialog.component';
|
|
@@ -32,7 +32,7 @@ export declare class RoleManagementComponent extends BaseDashboard implements On
|
|
|
32
32
|
showMobileFilters: boolean;
|
|
33
33
|
expandedRoleId: string | null;
|
|
34
34
|
rolePermissions: Map<string, string[]>;
|
|
35
|
-
|
|
35
|
+
protected destroy$: Subject<void>;
|
|
36
36
|
private metadata;
|
|
37
37
|
constructor(cdr: ChangeDetectorRef, ngZone: NgZone);
|
|
38
38
|
GetResourceDisplayName(data: ResourceData): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role-management.component.d.ts","sourceRoot":"","sources":["../../../src/lib/role-management/role-management.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,
|
|
1
|
+
{"version":3,"file":"role-management.component.d.ts","sourceRoot":"","sources":["../../../src/lib/role-management/role-management.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;;AAEvF,UAAU,SAAS;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAOa,uBAAwB,SAAQ,aAAc,YAAW,SAAS;IAuCjE,OAAO,CAAC,GAAG;IAAqB,OAAO,CAAC,MAAM;IArCnD,KAAK,EAAE,YAAY,EAAE,CAAM;IAC3B,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IACzC,SAAS,UAAS;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,cAAc,UAAS;IACvB,cAAc,EAAE,cAAc,GAAG,IAAI,CAAQ;IAG7C,KAAK,EAAE,SAAS,CAKrB;IAGK,QAAQ,iCAGZ;IAGI,gBAAgB,UAAS;IACzB,cAAc,UAAS;IACvB,iBAAiB,UAAS;IAC1B,iBAAiB,UAAS;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGrC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAa;IAE1D,UAAmB,QAAQ,gBAAuB;IAClD,OAAO,CAAC,QAAQ,CAAkB;gBAEd,GAAG,EAAE,iBAAiB,EAAU,MAAM,EAAE,MAAM;IAI5D,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjE,SAAS,CAAC,aAAa,IAAI,IAAI;IAI/B,SAAS,CAAC,QAAQ,IAAI,IAAI;IAIjB,WAAW,IAAI,IAAI;IAMf,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;YAsB/B,SAAS;IAWvB,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,cAAc;IAWf,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAOzC,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKlC,kBAAkB,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI;IAI3D,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAOnD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIvC,aAAa,IAAI,IAAI;IAOrB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQlC,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKrC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BjC,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAOvC,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAI5C,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAI5C,WAAW,IAAI,IAAI;IAInB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;yCAhP9C,uBAAuB;2CAAvB,uBAAuB;CAyPnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"role-management.component.js","sourceRoot":"","sources":["../../../src/lib/role-management/role-management.component.ts","../../../src/lib/role-management/role-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 { ResourceData, MJRoleEntity } from '@memberjunction/core-entities';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { RoleDialogData, RoleDialogResult } from './role-dialog/role-dialog.component';\n\ninterface RoleStats {\n totalRoles: number;\n systemRoles: number;\n customRoles: number;\n activeRoles: number;\n}\n\ninterface FilterOptions {\n type: 'all' | 'system' | 'custom';\n search: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-role-management',\n templateUrl: './role-management.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './role-management.component.css']\n})\n@RegisterClass(BaseDashboard, 'RoleManagement')\nexport class RoleManagementComponent extends BaseDashboard implements OnDestroy {\n // State management\n public roles: MJRoleEntity[] = [];\n public filteredRoles: MJRoleEntity[] = [];\n public selectedRole: MJRoleEntity | null = null;\n public isLoading = false;\n public error: string | null = null;\n\n // Dialog state\n public showRoleDialog = false;\n public roleDialogData: RoleDialogData | null = null;\n\n // Stats\n public stats: RoleStats = {\n totalRoles: 0,\n systemRoles: 0,\n customRoles: 0,\n activeRoles: 0\n };\n\n // Filters\n public filters$ = new BehaviorSubject<FilterOptions>({\n type: 'all',\n search: ''\n });\n\n // UI State\n public showCreateDialog = false;\n public showEditDialog = false;\n public showDeleteConfirm = false;\n public showMobileFilters = false;\n public expandedRoleId: string | null = null;\n\n // Role permissions (simplified view)\n public rolePermissions: Map<string, string[]> = new Map();\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 \"Role 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 roles\n const roles = await this.loadRoles();\n this.roles = roles;\n this.calculateStats();\n this.applyFilters();\n \n } catch (error) {\n console.error('Error loading role data:', error);\n this.error = 'Failed to load role 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 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 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.roles];\n \n // Apply type filter\n if (filters.type !== 'all') {\n filtered = filtered.filter(role => {\n const isSystem = this.isSystemRole(role);\n return filters.type === 'system' ? isSystem : !isSystem;\n });\n }\n \n // Apply search filter\n if (filters.search) {\n const searchLower = filters.search.toLowerCase();\n filtered = filtered.filter(role =>\n role.Name?.toLowerCase().includes(searchLower) ||\n role.Description?.toLowerCase().includes(searchLower)\n );\n }\n \n this.filteredRoles = filtered;\n }\n \n private calculateStats(): void {\n const systemRoles = this.roles.filter(r => this.isSystemRole(r));\n \n this.stats = {\n totalRoles: this.roles.length,\n systemRoles: systemRoles.length,\n customRoles: this.roles.length - systemRoles.length,\n activeRoles: this.roles.length // All roles are considered active for now\n };\n }\n \n public isSystemRole(role: MJRoleEntity): boolean {\n // System roles typically have certain naming patterns or flags\n const systemRoleNames = ['Administrator', 'User', 'Guest', 'Developer'];\n return systemRoleNames.includes(role.Name || '');\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 onTypeFilterChange(type: 'all' | 'system' | 'custom'): void {\n this.updateFilter({ type });\n }\n \n public updateFilter(partial: Partial<FilterOptions>): void {\n this.filters$.next({\n ...this.filters$.value,\n ...partial\n });\n }\n \n public toggleRoleExpansion(roleId: string): void {\n this.expandedRoleId = this.expandedRoleId === roleId ? null : roleId;\n }\n \n public isRoleExpanded(roleId: string): boolean {\n return this.expandedRoleId === roleId;\n }\n \n public createNewRole(): void {\n this.roleDialogData = {\n mode: 'create'\n };\n this.showRoleDialog = true;\n }\n \n public editRole(role: MJRoleEntity): void {\n this.roleDialogData = {\n role: role,\n mode: 'edit'\n };\n this.showRoleDialog = true;\n }\n \n public confirmDeleteRole(role: MJRoleEntity): void {\n this.selectedRole = role;\n this.showDeleteConfirm = true;\n }\n \n public async deleteRole(): Promise<void> {\n if (!this.selectedRole) return;\n \n try {\n // Load role entity to delete\n const role = await this.metadata.GetEntityObject<MJRoleEntity>('MJ: Roles');\n const loadResult = await role.Load(this.selectedRole.ID);\n \n if (loadResult) {\n const deleteResult = await role.Delete();\n if (deleteResult) {\n this.showDeleteConfirm = false;\n this.selectedRole = null;\n await this.loadInitialData();\n } else {\n throw new Error(role.LatestResult?.Message || 'Failed to delete role');\n }\n } else {\n throw new Error('Role not found or permission denied');\n }\n } catch (error: unknown) {\n console.error('Error deleting role:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Failed to delete role';\n this.cdr.markForCheck();\n });\n }\n }\n \n public getRoleIcon(role: MJRoleEntity): string {\n if (this.isSystemRole(role)) {\n return 'fa-shield-halved';\n }\n return 'fa-user-tag';\n }\n \n public getRoleTypeLabel(role: MJRoleEntity): string {\n return this.isSystemRole(role) ? 'System' : 'Custom';\n }\n \n public getRoleTypeClass(role: MJRoleEntity): string {\n return this.isSystemRole(role) ? 'badge-system' : 'badge-custom';\n }\n \n public refreshData(): void {\n this.loadInitialData();\n }\n\n public onRoleDialogResult(result: RoleDialogResult): void {\n this.showRoleDialog = false;\n this.roleDialogData = null;\n \n if (result.action === 'save') {\n // Refresh the role list to show changes\n this.loadInitialData();\n }\n }\n}","<div class=\"role-management-container\">\n <!-- Sticky Header Section -->\n <div class=\"sticky-header\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\" role=\"toolbar\" aria-label=\"Role management actions\">\n <button\n mjButton variant=\"secondary\" class=\"mj-btn-icon-mobile\"\n (click)=\"refreshData()\"\n [disabled]=\"isLoading\"\n aria-label=\"Refresh role 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 mjButton variant=\"primary\" class=\"mj-btn-icon-mobile\"\n (click)=\"createNewRole()\"\n aria-label=\"Add new role\"\n >\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Add Role</span>\n </button>\n </div>\n\n <!-- Stats Cards -->\n <div class=\"mj-grid-4\" role=\"region\" aria-label=\"Role statistics\">\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-total\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-user-tag\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total roles count\">{{ stats.totalRoles }}</div>\n <div class=\"stat-label\">Total Roles</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-system\" 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=\"System roles count\">{{ stats.systemRoles }}</div>\n <div class=\"stat-label\">System Roles</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-custom\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-user-tag\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Custom roles count\">{{ stats.customRoles }}</div>\n <div class=\"stat-label\">Custom Roles</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-check-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Active roles count\">{{ stats.activeRoles }}</div>\n <div class=\"stat-label\">Active Roles</div>\n </div>\n </div>\n </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\" role=\"search\" aria-label=\"Filter roles\">\n <div class=\"filters-row\">\n <!-- Mobile: Search + Filter Button Container -->\n <div class=\"mobile-search-container\">\n <!-- Search - Enhanced prominent search box -->\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 roles by name or description...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.search\"\n aria-label=\"Search roles by name or description\"\n />\n </div>\n\n <!-- Filter Button (Mobile Only) -->\n <button\n class=\"filter-button\"\n (click)=\"showMobileFilters = true\"\n aria-label=\"Open filters\"\n >\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n <span>Filters</span>\n </button>\n </div>\n\n <!-- Type Filter (Desktop) -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" id=\"type-filter-label\">Type</label>\n <div class=\"mj-filter-buttons\" role=\"group\" aria-labelledby=\"type-filter-label\">\n <button mjButton\n [variant]=\"filters$.value.type === 'all' ? 'primary' : 'flat'\"\n (click)=\"onTypeFilterChange('all')\"\n [attr.aria-pressed]=\"filters$.value.type === 'all'\"\n >\n All\n </button>\n <button mjButton\n [variant]=\"filters$.value.type === 'system' ? 'primary' : 'flat'\"\n (click)=\"onTypeFilterChange('system')\"\n [attr.aria-pressed]=\"filters$.value.type === 'system'\"\n >\n System\n </button>\n <button mjButton\n [variant]=\"filters$.value.type === 'custom' ? 'primary' : 'flat'\"\n (click)=\"onTypeFilterChange('custom')\"\n [attr.aria-pressed]=\"filters$.value.type === 'custom'\"\n >\n Custom\n </button>\n </div>\n </div>\n </div>\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 roles...\" 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 mjButton variant=\"primary\" (click)=\"loadInitialData()\" aria-label=\"Retry loading roles\">\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 <div class=\"roles-list\" role=\"list\" aria-label=\"Roles list\">\n @for (role of filteredRoles; track role.ID) {\n <div\n class=\"role-card\"\n [class.expanded]=\"isRoleExpanded(role.ID)\"\n role=\"listitem\"\n [attr.aria-expanded]=\"isRoleExpanded(role.ID)\"\n >\n <div\n class=\"role-header\"\n (click)=\"toggleRoleExpansion(role.ID)\"\n tabindex=\"0\"\n (keydown.enter)=\"toggleRoleExpansion(role.ID)\"\n (keydown.space)=\"toggleRoleExpansion(role.ID); $event.preventDefault()\"\n role=\"button\"\n [attr.aria-label]=\"'Toggle details for ' + role.Name\"\n >\n <div class=\"role-info\">\n <div class=\"role-icon-wrapper\" aria-hidden=\"true\">\n <i [class]=\"'fa-solid ' + getRoleIcon(role)\"></i>\n </div>\n <div class=\"role-details\">\n <h3 class=\"role-name\">{{ role.Name }}</h3>\n <p class=\"role-description\">{{ role.Description || 'No description available' }}</p>\n </div>\n </div>\n\n <div class=\"role-meta\">\n <span class=\"role-type-badge\" [class]=\"getRoleTypeClass(role)\">\n {{ getRoleTypeLabel(role) }}\n </span>\n <div class=\"role-actions\" (click)=\"$event.stopPropagation()\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editRole(role)\"\n title=\"Edit\"\n [attr.aria-label]=\"'Edit ' + role.Name\"\n [disabled]=\"isSystemRole(role)\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n </button>\n <button\n mjButton variant=\"danger\" size=\"sm\"\n (click)=\"confirmDeleteRole(role)\"\n title=\"Delete\"\n [attr.aria-label]=\"'Delete ' + role.Name\"\n [disabled]=\"isSystemRole(role)\"\n >\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button class=\"expand-btn\" aria-label=\"Toggle details\">\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (isRoleExpanded(role.ID)) {\n <div class=\"role-content\">\n <!-- Mobile-only actions bar -->\n <div class=\"mobile-actions-bar\" (click)=\"$event.stopPropagation()\">\n <span class=\"role-type-badge\" [class]=\"getRoleTypeClass(role)\">\n {{ getRoleTypeLabel(role) }}\n </span>\n <div class=\"mobile-action-buttons\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editRole(role)\"\n title=\"Edit\"\n [attr.aria-label]=\"'Edit ' + role.Name\"\n [disabled]=\"isSystemRole(role)\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">Edit</span>\n </button>\n <button\n mjButton variant=\"danger\" size=\"sm\"\n (click)=\"confirmDeleteRole(role)\"\n title=\"Delete\"\n [attr.aria-label]=\"'Delete ' + role.Name\"\n [disabled]=\"isSystemRole(role)\"\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 <div class=\"role-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-users\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Users:</span>\n <span class=\"stat-value\">0</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\">{{ role.__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\">{{ role.__mj_UpdatedAt | date:'short' }}</span>\n </div>\n </div>\n\n <div class=\"permissions-preview\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-key\" aria-hidden=\"true\"></i>\n Permissions Preview\n </h4>\n <p class=\"permissions-note\">Full permission management available in the Permissions tab</p>\n </div>\n </div>\n }\n </div>\n }\n\n @if (filteredRoles.length === 0) {\n <div class=\"empty-state\" role=\"status\">\n <i class=\"fa-solid fa-user-tag empty-icon\" aria-hidden=\"true\"></i>\n <p class=\"empty-text\">No roles found</p>\n <p class=\"empty-subtext\">Try adjusting your filters or create a new role</p>\n </div>\n }\n </div>\n </div>\n }\n </div><!-- End Scrollable Content -->\n\n <!-- Role Create/Edit Dialog -->\n <mj-role-dialog\n [data]=\"roleDialogData\"\n [visible]=\"showRoleDialog\"\n (result)=\"onRoleDialogResult($event)\">\n </mj-role-dialog>\n\n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm && selectedRole) {\n <div\n class=\"modal-backdrop\"\n (click)=\"showDeleteConfirm = false\"\n role=\"presentation\"\n >\n <div\n class=\"modal-dialog\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-dialog-title\"\n aria-describedby=\"delete-dialog-desc\"\n >\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 the role <strong>{{ selectedRole.Name }}</strong>?</p>\n <p class=\"text-warning\">\n <i class=\"fa-solid fa-warning\" aria-hidden=\"true\"></i>\n This will affect all users assigned to this role.\n </p>\n </div>\n <div class=\"modal-footer\">\n <!-- Primary action (Delete) on LEFT per MD3 design guide -->\n <button mjButton variant=\"danger\" (click)=\"deleteRole()\" [disabled]=\"isLoading\">\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Deleting...\n } @else {\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n Delete Role\n }\n </button>\n <button mjButton (click)=\"showDeleteConfirm = false\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Mobile Filter Modal -->\n @if (showMobileFilters) {\n <div\n class=\"filter-modal-backdrop\"\n (click)=\"showMobileFilters = false\"\n role=\"presentation\"\n >\n <div\n class=\"filter-modal\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"filter-modal-title\"\n >\n <div class=\"filter-modal-header\">\n <h3 class=\"filter-modal-title\" id=\"filter-modal-title\">\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n Filters\n </h3>\n <button\n class=\"filter-modal-close\"\n (click)=\"showMobileFilters = false\"\n aria-label=\"Close filters\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"filter-modal-body\">\n <div class=\"filter-options-container\">\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <h4 class=\"filter-group-label\">Type</h4>\n <div class=\"filter-group-options\">\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.type === 'all'\"\n >\n <input\n type=\"radio\"\n name=\"type\"\n value=\"all\"\n [checked]=\"filters$.value.type === 'all'\"\n (change)=\"onTypeFilterChange('all')\"\n />\n <span class=\"filter-option-label\">All Roles</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.type === 'system'\"\n >\n <input\n type=\"radio\"\n name=\"type\"\n value=\"system\"\n [checked]=\"filters$.value.type === 'system'\"\n (change)=\"onTypeFilterChange('system')\"\n />\n <span class=\"filter-option-label\">System Roles</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.type === 'custom'\"\n >\n <input\n type=\"radio\"\n name=\"type\"\n value=\"custom\"\n [checked]=\"filters$.value.type === 'custom'\"\n (change)=\"onTypeFilterChange('custom')\"\n />\n <span class=\"filter-option-label\">Custom Roles</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"filter-modal-footer\">\n <button\n mjButton variant=\"primary\"\n (click)=\"showMobileFilters = false\"\n >\n Apply Filters\n </button>\n <button\n mjButton\n (click)=\"showMobileFilters = false\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"role-management.component.js","sourceRoot":"","sources":["../../../src/lib/role-management/role-management.component.ts","../../../src/lib/role-management/role-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 { ResourceData, MJRoleEntity } from '@memberjunction/core-entities';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { RoleDialogData, RoleDialogResult } from './role-dialog/role-dialog.component';\n\ninterface RoleStats {\n totalRoles: number;\n systemRoles: number;\n customRoles: number;\n activeRoles: number;\n}\n\ninterface FilterOptions {\n type: 'all' | 'system' | 'custom';\n search: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-role-management',\n templateUrl: './role-management.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './role-management.component.css']\n})\n@RegisterClass(BaseDashboard, 'RoleManagement')\nexport class RoleManagementComponent extends BaseDashboard implements OnDestroy {\n // State management\n public roles: MJRoleEntity[] = [];\n public filteredRoles: MJRoleEntity[] = [];\n public selectedRole: MJRoleEntity | null = null;\n public isLoading = false;\n public error: string | null = null;\n\n // Dialog state\n public showRoleDialog = false;\n public roleDialogData: RoleDialogData | null = null;\n\n // Stats\n public stats: RoleStats = {\n totalRoles: 0,\n systemRoles: 0,\n customRoles: 0,\n activeRoles: 0\n };\n\n // Filters\n public filters$ = new BehaviorSubject<FilterOptions>({\n type: 'all',\n search: ''\n });\n\n // UI State\n public showCreateDialog = false;\n public showEditDialog = false;\n public showDeleteConfirm = false;\n public showMobileFilters = false;\n public expandedRoleId: string | null = null;\n\n // Role permissions (simplified view)\n public rolePermissions: Map<string, string[]> = new Map();\n\n protected override 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 \"Role 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 roles\n const roles = await this.loadRoles();\n this.roles = roles;\n this.calculateStats();\n this.applyFilters();\n \n } catch (error) {\n console.error('Error loading role data:', error);\n this.error = 'Failed to load role 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 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 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.roles];\n \n // Apply type filter\n if (filters.type !== 'all') {\n filtered = filtered.filter(role => {\n const isSystem = this.isSystemRole(role);\n return filters.type === 'system' ? isSystem : !isSystem;\n });\n }\n \n // Apply search filter\n if (filters.search) {\n const searchLower = filters.search.toLowerCase();\n filtered = filtered.filter(role =>\n role.Name?.toLowerCase().includes(searchLower) ||\n role.Description?.toLowerCase().includes(searchLower)\n );\n }\n \n this.filteredRoles = filtered;\n }\n \n private calculateStats(): void {\n const systemRoles = this.roles.filter(r => this.isSystemRole(r));\n \n this.stats = {\n totalRoles: this.roles.length,\n systemRoles: systemRoles.length,\n customRoles: this.roles.length - systemRoles.length,\n activeRoles: this.roles.length // All roles are considered active for now\n };\n }\n \n public isSystemRole(role: MJRoleEntity): boolean {\n // System roles typically have certain naming patterns or flags\n const systemRoleNames = ['Administrator', 'User', 'Guest', 'Developer'];\n return systemRoleNames.includes(role.Name || '');\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 onTypeFilterChange(type: 'all' | 'system' | 'custom'): void {\n this.updateFilter({ type });\n }\n \n public updateFilter(partial: Partial<FilterOptions>): void {\n this.filters$.next({\n ...this.filters$.value,\n ...partial\n });\n }\n \n public toggleRoleExpansion(roleId: string): void {\n this.expandedRoleId = this.expandedRoleId === roleId ? null : roleId;\n }\n \n public isRoleExpanded(roleId: string): boolean {\n return this.expandedRoleId === roleId;\n }\n \n public createNewRole(): void {\n this.roleDialogData = {\n mode: 'create'\n };\n this.showRoleDialog = true;\n }\n \n public editRole(role: MJRoleEntity): void {\n this.roleDialogData = {\n role: role,\n mode: 'edit'\n };\n this.showRoleDialog = true;\n }\n \n public confirmDeleteRole(role: MJRoleEntity): void {\n this.selectedRole = role;\n this.showDeleteConfirm = true;\n }\n \n public async deleteRole(): Promise<void> {\n if (!this.selectedRole) return;\n \n try {\n // Load role entity to delete\n const role = await this.metadata.GetEntityObject<MJRoleEntity>('MJ: Roles');\n const loadResult = await role.Load(this.selectedRole.ID);\n \n if (loadResult) {\n const deleteResult = await role.Delete();\n if (deleteResult) {\n this.showDeleteConfirm = false;\n this.selectedRole = null;\n await this.loadInitialData();\n } else {\n throw new Error(role.LatestResult?.Message || 'Failed to delete role');\n }\n } else {\n throw new Error('Role not found or permission denied');\n }\n } catch (error: unknown) {\n console.error('Error deleting role:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Failed to delete role';\n this.cdr.markForCheck();\n });\n }\n }\n \n public getRoleIcon(role: MJRoleEntity): string {\n if (this.isSystemRole(role)) {\n return 'fa-shield-halved';\n }\n return 'fa-user-tag';\n }\n \n public getRoleTypeLabel(role: MJRoleEntity): string {\n return this.isSystemRole(role) ? 'System' : 'Custom';\n }\n \n public getRoleTypeClass(role: MJRoleEntity): string {\n return this.isSystemRole(role) ? 'badge-system' : 'badge-custom';\n }\n \n public refreshData(): void {\n this.loadInitialData();\n }\n\n public onRoleDialogResult(result: RoleDialogResult): void {\n this.showRoleDialog = false;\n this.roleDialogData = null;\n \n if (result.action === 'save') {\n // Refresh the role list to show changes\n this.loadInitialData();\n }\n }\n}","<div class=\"role-management-container\">\n <!-- Sticky Header Section -->\n <div class=\"sticky-header\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\" role=\"toolbar\" aria-label=\"Role management actions\">\n <button\n mjButton variant=\"secondary\" class=\"mj-btn-icon-mobile\"\n (click)=\"refreshData()\"\n [disabled]=\"isLoading\"\n aria-label=\"Refresh role 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 mjButton variant=\"primary\" class=\"mj-btn-icon-mobile\"\n (click)=\"createNewRole()\"\n aria-label=\"Add new role\"\n >\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Add Role</span>\n </button>\n </div>\n\n <!-- Stats Cards -->\n <div class=\"mj-grid-4\" role=\"region\" aria-label=\"Role statistics\">\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-total\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-user-tag\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total roles count\">{{ stats.totalRoles }}</div>\n <div class=\"stat-label\">Total Roles</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-system\" 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=\"System roles count\">{{ stats.systemRoles }}</div>\n <div class=\"stat-label\">System Roles</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-custom\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-user-tag\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Custom roles count\">{{ stats.customRoles }}</div>\n <div class=\"stat-label\">Custom Roles</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-check-circle\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Active roles count\">{{ stats.activeRoles }}</div>\n <div class=\"stat-label\">Active Roles</div>\n </div>\n </div>\n </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\" role=\"search\" aria-label=\"Filter roles\">\n <div class=\"filters-row\">\n <!-- Mobile: Search + Filter Button Container -->\n <div class=\"mobile-search-container\">\n <!-- Search - Enhanced prominent search box -->\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 roles by name or description...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.search\"\n aria-label=\"Search roles by name or description\"\n />\n </div>\n\n <!-- Filter Button (Mobile Only) -->\n <button\n class=\"filter-button\"\n (click)=\"showMobileFilters = true\"\n aria-label=\"Open filters\"\n >\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n <span>Filters</span>\n </button>\n </div>\n\n <!-- Type Filter (Desktop) -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" id=\"type-filter-label\">Type</label>\n <div class=\"mj-filter-buttons\" role=\"group\" aria-labelledby=\"type-filter-label\">\n <button mjButton\n [variant]=\"filters$.value.type === 'all' ? 'primary' : 'flat'\"\n (click)=\"onTypeFilterChange('all')\"\n [attr.aria-pressed]=\"filters$.value.type === 'all'\"\n >\n All\n </button>\n <button mjButton\n [variant]=\"filters$.value.type === 'system' ? 'primary' : 'flat'\"\n (click)=\"onTypeFilterChange('system')\"\n [attr.aria-pressed]=\"filters$.value.type === 'system'\"\n >\n System\n </button>\n <button mjButton\n [variant]=\"filters$.value.type === 'custom' ? 'primary' : 'flat'\"\n (click)=\"onTypeFilterChange('custom')\"\n [attr.aria-pressed]=\"filters$.value.type === 'custom'\"\n >\n Custom\n </button>\n </div>\n </div>\n </div>\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 roles...\" 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 mjButton variant=\"primary\" (click)=\"loadInitialData()\" aria-label=\"Retry loading roles\">\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 <div class=\"roles-list\" role=\"list\" aria-label=\"Roles list\">\n @for (role of filteredRoles; track role.ID) {\n <div\n class=\"role-card\"\n [class.expanded]=\"isRoleExpanded(role.ID)\"\n role=\"listitem\"\n [attr.aria-expanded]=\"isRoleExpanded(role.ID)\"\n >\n <div\n class=\"role-header\"\n (click)=\"toggleRoleExpansion(role.ID)\"\n tabindex=\"0\"\n (keydown.enter)=\"toggleRoleExpansion(role.ID)\"\n (keydown.space)=\"toggleRoleExpansion(role.ID); $event.preventDefault()\"\n role=\"button\"\n [attr.aria-label]=\"'Toggle details for ' + role.Name\"\n >\n <div class=\"role-info\">\n <div class=\"role-icon-wrapper\" aria-hidden=\"true\">\n <i [class]=\"'fa-solid ' + getRoleIcon(role)\"></i>\n </div>\n <div class=\"role-details\">\n <h3 class=\"role-name\">{{ role.Name }}</h3>\n <p class=\"role-description\">{{ role.Description || 'No description available' }}</p>\n </div>\n </div>\n\n <div class=\"role-meta\">\n <span class=\"role-type-badge\" [class]=\"getRoleTypeClass(role)\">\n {{ getRoleTypeLabel(role) }}\n </span>\n <div class=\"role-actions\" (click)=\"$event.stopPropagation()\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editRole(role)\"\n title=\"Edit\"\n [attr.aria-label]=\"'Edit ' + role.Name\"\n [disabled]=\"isSystemRole(role)\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n </button>\n <button\n mjButton variant=\"danger\" size=\"sm\"\n (click)=\"confirmDeleteRole(role)\"\n title=\"Delete\"\n [attr.aria-label]=\"'Delete ' + role.Name\"\n [disabled]=\"isSystemRole(role)\"\n >\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <button class=\"expand-btn\" aria-label=\"Toggle details\">\n <i class=\"fa-solid fa-chevron-down\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n @if (isRoleExpanded(role.ID)) {\n <div class=\"role-content\">\n <!-- Mobile-only actions bar -->\n <div class=\"mobile-actions-bar\" (click)=\"$event.stopPropagation()\">\n <span class=\"role-type-badge\" [class]=\"getRoleTypeClass(role)\">\n {{ getRoleTypeLabel(role) }}\n </span>\n <div class=\"mobile-action-buttons\">\n <button\n mjButton variant=\"flat\" size=\"sm\"\n (click)=\"editRole(role)\"\n title=\"Edit\"\n [attr.aria-label]=\"'Edit ' + role.Name\"\n [disabled]=\"isSystemRole(role)\"\n >\n <i class=\"fa-solid fa-edit\" aria-hidden=\"true\"></i>\n <span class=\"btn-label\">Edit</span>\n </button>\n <button\n mjButton variant=\"danger\" size=\"sm\"\n (click)=\"confirmDeleteRole(role)\"\n title=\"Delete\"\n [attr.aria-label]=\"'Delete ' + role.Name\"\n [disabled]=\"isSystemRole(role)\"\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 <div class=\"role-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-users\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Users:</span>\n <span class=\"stat-value\">0</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\">{{ role.__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\">{{ role.__mj_UpdatedAt | date:'short' }}</span>\n </div>\n </div>\n\n <div class=\"permissions-preview\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-key\" aria-hidden=\"true\"></i>\n Permissions Preview\n </h4>\n <p class=\"permissions-note\">Full permission management available in the Permissions tab</p>\n </div>\n </div>\n }\n </div>\n }\n\n @if (filteredRoles.length === 0) {\n <div class=\"empty-state\" role=\"status\">\n <i class=\"fa-solid fa-user-tag empty-icon\" aria-hidden=\"true\"></i>\n <p class=\"empty-text\">No roles found</p>\n <p class=\"empty-subtext\">Try adjusting your filters or create a new role</p>\n </div>\n }\n </div>\n </div>\n }\n </div><!-- End Scrollable Content -->\n\n <!-- Role Create/Edit Dialog -->\n <mj-role-dialog\n [data]=\"roleDialogData\"\n [visible]=\"showRoleDialog\"\n (result)=\"onRoleDialogResult($event)\">\n </mj-role-dialog>\n\n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm && selectedRole) {\n <div\n class=\"modal-backdrop\"\n (click)=\"showDeleteConfirm = false\"\n role=\"presentation\"\n >\n <div\n class=\"modal-dialog\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-dialog-title\"\n aria-describedby=\"delete-dialog-desc\"\n >\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 the role <strong>{{ selectedRole.Name }}</strong>?</p>\n <p class=\"text-warning\">\n <i class=\"fa-solid fa-warning\" aria-hidden=\"true\"></i>\n This will affect all users assigned to this role.\n </p>\n </div>\n <div class=\"modal-footer\">\n <!-- Primary action (Delete) on LEFT per MD3 design guide -->\n <button mjButton variant=\"danger\" (click)=\"deleteRole()\" [disabled]=\"isLoading\">\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Deleting...\n } @else {\n <i class=\"fa-solid fa-trash\" aria-hidden=\"true\"></i>\n Delete Role\n }\n </button>\n <button mjButton (click)=\"showDeleteConfirm = false\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Mobile Filter Modal -->\n @if (showMobileFilters) {\n <div\n class=\"filter-modal-backdrop\"\n (click)=\"showMobileFilters = false\"\n role=\"presentation\"\n >\n <div\n class=\"filter-modal\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"filter-modal-title\"\n >\n <div class=\"filter-modal-header\">\n <h3 class=\"filter-modal-title\" id=\"filter-modal-title\">\n <i class=\"fa-solid fa-filter\" aria-hidden=\"true\"></i>\n Filters\n </h3>\n <button\n class=\"filter-modal-close\"\n (click)=\"showMobileFilters = false\"\n aria-label=\"Close filters\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"filter-modal-body\">\n <div class=\"filter-options-container\">\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <h4 class=\"filter-group-label\">Type</h4>\n <div class=\"filter-group-options\">\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.type === 'all'\"\n >\n <input\n type=\"radio\"\n name=\"type\"\n value=\"all\"\n [checked]=\"filters$.value.type === 'all'\"\n (change)=\"onTypeFilterChange('all')\"\n />\n <span class=\"filter-option-label\">All Roles</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.type === 'system'\"\n >\n <input\n type=\"radio\"\n name=\"type\"\n value=\"system\"\n [checked]=\"filters$.value.type === 'system'\"\n (change)=\"onTypeFilterChange('system')\"\n />\n <span class=\"filter-option-label\">System Roles</span>\n </label>\n <label\n class=\"filter-option\"\n [class.selected]=\"filters$.value.type === 'custom'\"\n >\n <input\n type=\"radio\"\n name=\"type\"\n value=\"custom\"\n [checked]=\"filters$.value.type === 'custom'\"\n (change)=\"onTypeFilterChange('custom')\"\n />\n <span class=\"filter-option-label\">Custom Roles</span>\n </label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"filter-modal-footer\">\n <button\n mjButton variant=\"primary\"\n (click)=\"showMobileFilters = false\"\n >\n Apply Filters\n </button>\n <button\n mjButton\n (click)=\"showMobileFilters = false\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
2
3
|
import { SharedService, BaseDashboard } from '@memberjunction/ng-shared';
|
|
3
4
|
import { ResourceData } from '@memberjunction/core-entities';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
@@ -50,7 +51,7 @@ interface SqlLoggingConfig {
|
|
|
50
51
|
export declare class SqlLoggingComponent extends BaseDashboard implements OnDestroy {
|
|
51
52
|
private sharedService;
|
|
52
53
|
private cdr;
|
|
53
|
-
|
|
54
|
+
protected destroy$: Subject<void>;
|
|
54
55
|
/** Whether the component is currently performing an async operation */
|
|
55
56
|
loading: boolean;
|
|
56
57
|
/** Current error message to display to the user, if any */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-logging.component.d.ts","sourceRoot":"","sources":["../../../src/lib/sql-logging/sql-logging.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAgB,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-logging.component.d.ts","sourceRoot":"","sources":["../../../src/lib/sql-logging/sql-logging.component.ts"],"names":[],"mappings":"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"}
|