@memberjunction/ng-explorer-settings 5.22.0 → 5.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/lib/application-management/application-dialog/application-dialog.component.js +5 -4
  2. package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
  3. package/dist/lib/application-management/application-management.component.js +9 -8
  4. package/dist/lib/application-management/application-management.component.js.map +1 -1
  5. package/dist/lib/application-settings/application-settings.component.js +4 -3
  6. package/dist/lib/application-settings/application-settings.component.js.map +1 -1
  7. package/dist/lib/entity-permissions/entity-permissions.component.js +11 -10
  8. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
  9. package/dist/lib/module.d.ts +2 -2
  10. package/dist/lib/module.js +4 -5
  11. package/dist/lib/module.js.map +1 -1
  12. package/dist/lib/role-management/role-management.component.js +9 -8
  13. package/dist/lib/role-management/role-management.component.js.map +1 -1
  14. package/dist/lib/sql-logging/sql-logging.component.js +4 -3
  15. package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
  16. package/dist/lib/user-app-config/user-app-config.component.js +4 -3
  17. package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
  18. package/dist/lib/user-management/user-management.component.js +11 -11
  19. package/dist/lib/user-management/user-management.component.js.map +1 -1
  20. package/dist/lib/user-profile-settings/user-profile-settings.component.js +4 -3
  21. package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
  22. package/package.json +18 -25
@@ -1 +1 @@
1
- {"version":3,"file":"application-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/application-management/application-dialog/application-dialog.component.ts","../../../../src/lib/application-management/application-dialog/application-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges, inject, HostListener, ChangeDetectorRef, NgZone } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJApplicationEntity, MJApplicationEntityEntity, MJEntityEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nexport interface ApplicationDialogData {\n application?: MJApplicationEntity;\n mode: 'create' | 'edit';\n}\n\ninterface ApplicationEntityConfig {\n entity: MJEntityEntity;\n applicationEntity?: MJApplicationEntityEntity;\n sequence: number;\n defaultForNewUser: boolean;\n isNew: boolean;\n hasChanges: boolean;\n}\n\nexport interface ApplicationDialogResult {\n action: 'save' | 'cancel';\n application?: MJApplicationEntity;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-application-dialog',\n templateUrl: './application-dialog.component.html',\n styleUrls: ['./application-dialog.component.css']\n})\nexport class ApplicationDialogComponent implements OnInit, OnDestroy, OnChanges {\n @Input() data: ApplicationDialogData | null = null;\n @Input() visible = false;\n @Output() result = new EventEmitter<ApplicationDialogResult>();\n\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private metadata = new Metadata();\n\n public applicationForm: FormGroup;\n public isLoading = false;\n public error: string | null = null;\n\n // Entity management\n public applicationEntities: ApplicationEntityConfig[] = [];\n public availableEntities: MJEntityEntity[] = [];\n public allEntities: MJEntityEntity[] = [];\n\n // Search filter for available entities\n public entitySearchTerm = '';\n\n // Section expansion state\n public sectionExpanded = {\n basicInfo: true,\n entities: true,\n systemInfo: false\n };\n\n // Fullscreen state\n public isFullscreen = false;\n\n constructor() {\n this.applicationForm = this.fb.group({\n name: ['', [Validators.required, Validators.maxLength(100)]],\n description: ['']\n });\n }\n\n ngOnInit(): void {\n // Initial setup\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['visible'] && this.visible) {\n this.initializeDialog();\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n private async initializeDialog(): Promise<void> {\n if (!this.visible) return;\n \n try {\n this.isLoading = true;\n this.error = null;\n \n // Load all entities first\n await this.loadAllEntities();\n \n if (this.data?.application && this.isEditMode) {\n await this.loadApplicationData();\n } else {\n this.resetForm();\n }\n } catch (error: unknown) {\n console.error('Error initializing dialog:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Failed to load dialog data';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async loadAllEntities(): Promise<void> {\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 this.allEntities = result.Success ? result.Results : [];\n }\n\n private resetForm(): void {\n this.applicationForm.reset({\n name: '',\n description: ''\n });\n this.applicationEntities = [];\n this.availableEntities = [...this.allEntities];\n this.entitySearchTerm = '';\n this.error = null;\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey(): void {\n if (this.visible) {\n this.onCancel();\n }\n }\n\n public get windowTitle(): string {\n return this.isEditMode ? 'Edit Application' : 'Create New Application';\n }\n\n public get isEditMode(): boolean {\n return this.data?.mode === 'edit';\n }\n\n private async loadApplicationData(): Promise<void> {\n if (!this.data?.application) return;\n\n const app = this.data.application;\n this.applicationForm.patchValue({\n name: app.Name,\n description: app.Description\n });\n\n // Load existing MJApplicationEntity records\n await this.loadApplicationEntities(app.ID);\n }\n\n private async loadApplicationEntities(applicationId: string): Promise<void> {\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJApplicationEntityEntity>({\n EntityName: 'MJ: Application Entities',\n ExtraFilter: `ApplicationID='${applicationId}'`,\n ResultType: 'entity_object',\n OrderBy: 'Sequence ASC'\n });\n\n if (result.Success && result.Results) {\n this.applicationEntities = [];\n const usedEntityIds = new Set<string>();\n\n for (const appEntity of result.Results) {\n const entity = this.allEntities.find(e => UUIDsEqual(e.ID, appEntity.EntityID));\n if (entity) {\n this.applicationEntities.push({\n entity,\n applicationEntity: appEntity,\n sequence: appEntity.Sequence || 0,\n defaultForNewUser: appEntity.DefaultForNewUser || false,\n isNew: false,\n hasChanges: false\n });\n usedEntityIds.add(entity.ID);\n }\n }\n\n // Set available entities (excluding already assigned ones)\n this.availableEntities = this.allEntities.filter(e => !usedEntityIds.has(e.ID));\n }\n } catch (error) {\n console.warn('Failed to load application entities:', error);\n this.availableEntities = [...this.allEntities];\n }\n }\n\n public addEntity(entity: MJEntityEntity): void {\n // Add entity to application\n this.applicationEntities.push({\n entity,\n sequence: this.applicationEntities.length + 1,\n defaultForNewUser: false,\n isNew: true,\n hasChanges: false\n });\n\n // Update all sequences to be consecutive\n this.updateSequences();\n\n // Remove from available entities\n this.availableEntities = this.availableEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));\n }\n\n public removeEntity(config: ApplicationEntityConfig): void {\n // Remove from application entities\n this.applicationEntities = this.applicationEntities.filter(ae => !UUIDsEqual(ae.entity.ID, config.entity.ID));\n \n // Update all sequences to be consecutive\n this.updateSequences();\n \n // Add back to available entities if not already there\n if (!this.availableEntities.find(e => UUIDsEqual(e.ID, config.entity.ID))) {\n this.availableEntities.push(config.entity);\n this.availableEntities.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));\n }\n }\n\n public moveEntityUp(index: number): void {\n if (index > 0) {\n const temp = this.applicationEntities[index];\n this.applicationEntities[index] = this.applicationEntities[index - 1];\n this.applicationEntities[index - 1] = temp;\n this.updateSequences();\n }\n }\n\n public moveEntityDown(index: number): void {\n if (index < this.applicationEntities.length - 1) {\n const temp = this.applicationEntities[index];\n this.applicationEntities[index] = this.applicationEntities[index + 1];\n this.applicationEntities[index + 1] = temp;\n this.updateSequences();\n }\n }\n\n private updateSequences(): void {\n this.applicationEntities.forEach((config, index) => {\n config.sequence = index + 1;\n if (!config.isNew) {\n config.hasChanges = true;\n }\n });\n }\n\n public onDefaultForNewUserChange(config: ApplicationEntityConfig): void {\n if (!config.isNew) {\n config.hasChanges = true;\n }\n }\n\n public get hasEntityChanges(): boolean {\n return this.applicationEntities.some(ae => ae.isNew || ae.hasChanges);\n }\n\n // Filtered available entities based on search term\n public get filteredAvailableEntities(): MJEntityEntity[] {\n if (!this.entitySearchTerm || !this.entitySearchTerm.trim()) {\n return this.availableEntities;\n }\n const searchLower = this.entitySearchTerm.toLowerCase().trim();\n return this.availableEntities.filter(entity =>\n (entity.Name || '').toLowerCase().includes(searchLower) ||\n (entity.Description || '').toLowerCase().includes(searchLower)\n );\n }\n\n public onEntitySearchChange(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.entitySearchTerm = value;\n }\n\n public clearEntitySearch(): void {\n this.entitySearchTerm = '';\n }\n\n public toggleSection(section: 'basicInfo' | 'entities' | 'systemInfo'): void {\n this.sectionExpanded[section] = !this.sectionExpanded[section];\n }\n\n public toggleFullscreen(): void {\n this.isFullscreen = !this.isFullscreen;\n }\n\n public onEntityDrop(event: CdkDragDrop<ApplicationEntityConfig[]>): void {\n if (event.previousIndex !== event.currentIndex) {\n moveItemInArray(this.applicationEntities, event.previousIndex, event.currentIndex);\n this.updateSequences();\n }\n }\n\n public async onSubmit(): Promise<void> {\n if (this.applicationForm.invalid) {\n this.markFormGroupTouched(this.applicationForm);\n return;\n }\n\n this.isLoading = true;\n this.error = null;\n\n try {\n let application: MJApplicationEntity;\n\n if (this.isEditMode && this.data?.application) {\n // Edit existing application\n application = this.data.application;\n } else {\n // Create new application\n application = await this.metadata.GetEntityObject<MJApplicationEntity>('MJ: Applications');\n application.NewRecord();\n }\n\n // Update application properties\n const formValue = this.applicationForm.value;\n application.Name = formValue.name;\n application.Description = formValue.description || null;\n\n // Save application\n const saveResult = await application.Save();\n if (!saveResult) {\n throw new Error(application.LatestResult?.Message || 'Failed to save application');\n }\n\n // Save application entities if there are changes\n if (this.hasEntityChanges) {\n await this.saveApplicationEntities(application.ID);\n }\n\n this.result.emit({ action: 'save', application });\n\n } catch (error: unknown) {\n console.error('Error saving application:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'An unexpected error occurred';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async saveApplicationEntities(applicationId: string): Promise<void> {\n // Save or update each MJApplicationEntity record\n for (const config of this.applicationEntities) {\n if (config.isNew || config.hasChanges) {\n let appEntity: MJApplicationEntityEntity;\n\n if (config.isNew) {\n // Create new MJApplicationEntity\n appEntity = await this.metadata.GetEntityObject<MJApplicationEntityEntity>('MJ: Application Entities');\n appEntity.NewRecord();\n appEntity.ApplicationID = applicationId;\n appEntity.EntityID = config.entity.ID;\n } else if (config.applicationEntity) {\n // Update existing MJApplicationEntity\n appEntity = config.applicationEntity;\n } else {\n continue;\n }\n\n appEntity.Sequence = config.sequence;\n appEntity.DefaultForNewUser = config.defaultForNewUser;\n\n const saveResult = await appEntity.Save();\n if (!saveResult) {\n console.warn(`Failed to save MJApplicationEntity for ${config.entity.Name}:`, appEntity.LatestResult?.Message);\n }\n }\n }\n }\n\n public onCancel(): void {\n this.result.emit({ action: 'cancel' });\n }\n\n private markFormGroupTouched(formGroup: FormGroup): void {\n Object.keys(formGroup.controls).forEach(key => {\n const control = formGroup.get(key);\n control?.markAsTouched();\n });\n }\n}","@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\" role=\"presentation\">\n <div\n class=\"modal-dialog\"\n [class.fullscreen]=\"isFullscreen\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"application-dialog-title\"\n aria-describedby=\"application-dialog-description\"\n >\n <!-- Modal Header -->\n <div class=\"modal-header\" [class.create-mode]=\"!isEditMode\" [class.edit-mode]=\"isEditMode\">\n <div class=\"modal-header-content\">\n <h2 class=\"modal-title\" id=\"application-dialog-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"!isEditMode\" [class.fa-layer-group]=\"isEditMode\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Edit Application' : 'Create New Application' }}\n </h2>\n <p class=\"modal-subtitle\" id=\"application-dialog-description\">\n {{ isEditMode ? 'Update application information and settings' : 'Add a new application to the system' }}\n </p>\n </div>\n <div class=\"modal-header-actions\">\n <button\n class=\"modal-action-btn\"\n (click)=\"toggleFullscreen()\"\n [attr.aria-label]=\"isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'\"\n type=\"button\"\n >\n <i class=\"fa-solid\" [class.fa-compress]=\"isFullscreen\" [class.fa-expand]=\"!isFullscreen\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"modal-close\"\n (click)=\"onCancel()\"\n aria-label=\"Close dialog\"\n type=\"button\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"applicationForm\" (ngSubmit)=\"onSubmit()\">\n <!-- Error Alert -->\n @if (error) {\n <div class=\"form-section\">\n <div class=\"alert alert-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n <div>{{ error }}</div>\n </div>\n </div>\n }\n\n <!-- Basic Information Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('basicInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n Application Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.basicInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.basicInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Define the application's basic properties</span>\n </legend>\n\n @if (sectionExpanded.basicInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"form-field\">\n <label class=\"field-label required\" for=\"app-name\">Application Name</label>\n <input\n id=\"app-name\"\n type=\"text\"\n class=\"field-input\"\n formControlName=\"name\"\n placeholder=\"My Application\"\n [class.error]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n [attr.aria-invalid]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n aria-describedby=\"app-name-error\"\n />\n @if (applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched) {\n <div class=\"field-error\" id=\"app-name-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"></i>\n @if (applicationForm.get('name')?.errors?.['required']) {\n Application name is required\n }\n @if (applicationForm.get('name')?.errors?.['maxlength']) {\n Application name cannot exceed 100 characters\n }\n </div>\n }\n </div>\n\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"app-description\">Description</label>\n <textarea\n id=\"app-description\"\n class=\"field-textarea\"\n formControlName=\"description\"\n placeholder=\"Describe the application's purpose and functionality...\"\n rows=\"4\"\n ></textarea>\n <div class=\"field-hint\">\n Provide a clear description of what this application does and its main features.\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n\n <!-- Entity Management Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('entities')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n Application Entities\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.entities\"\n [class.fa-chevron-down]=\"!sectionExpanded.entities\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Manage which entities are included in this application</span>\n </legend>\n\n @if (sectionExpanded.entities) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <!-- Assigned Entities -->\n @if (applicationEntities.length > 0) {\n <div class=\"assigned-entities\">\n <h4 class=\"subsection-title\">Assigned Entities ({{ applicationEntities.length }})</h4>\n <div class=\"entities-list\"\n role=\"list\"\n cdkDropList\n (cdkDropListDropped)=\"onEntityDrop($event)\">\n @for (config of applicationEntities; track config.entity.ID; let i = $index) {\n <div\n class=\"entity-item\"\n [class.is-new]=\"config.isNew\"\n [class.has-changes]=\"config.hasChanges\"\n role=\"listitem\"\n cdkDrag\n >\n <i class=\"fa-solid fa-grip-vertical drag-handle\" aria-hidden=\"true\"></i>\n <div class=\"entity-info\">\n <div class=\"entity-icon\">\n <i class=\"fa-solid fa-table\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"entity-details\">\n <div class=\"entity-name\">\n {{ config.entity.Name }}\n @if (config.entity.Description) {\n <i\n class=\"fa-solid fa-info-circle entity-info-icon\"\n [title]=\"config.entity.Description\"\n [attr.aria-label]=\"'Entity description: ' + config.entity.Description\"\n ></i>\n }\n </div>\n </div>\n </div>\n\n <div class=\"entity-config\">\n <div class=\"config-item\">\n <label class=\"config-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config.defaultForNewUser\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"onDefaultForNewUserChange(config)\"\n class=\"config-checkbox\"\n />\n <span class=\"checkbox-text\">Default for new users</span>\n </label>\n </div>\n <div class=\"sequence-badge\" [attr.aria-label]=\"'Sequence ' + config.sequence\">{{ config.sequence }}</div>\n </div>\n\n <div class=\"entity-actions\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeEntity(config)\"\n title=\"Remove entity\"\n [attr.aria-label]=\"'Remove ' + config.entity.Name\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"no-entities\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n <p>No entities assigned to this application</p>\n <p class=\"empty-subtext\">Add entities from the available list below</p>\n </div>\n }\n\n <!-- Available Entities -->\n @if (availableEntities.length > 0) {\n <div class=\"available-entities\">\n <div class=\"available-entities-header\">\n <h4 class=\"subsection-title\">Available Entities ({{ filteredAvailableEntities.length }} of {{ availableEntities.length }})</h4>\n <div class=\"entity-search\">\n <i class=\"fa-solid fa-search entity-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"entity-search-input\"\n placeholder=\"Search entities...\"\n [value]=\"entitySearchTerm\"\n (input)=\"onEntitySearchChange($event)\"\n aria-label=\"Search available entities\"\n />\n @if (entitySearchTerm) {\n <button\n type=\"button\"\n class=\"entity-search-clear\"\n (click)=\"clearEntitySearch()\"\n aria-label=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n @if (filteredAvailableEntities.length > 0) {\n <div class=\"entities-grid\" role=\"list\">\n @for (entity of filteredAvailableEntities; track entity.ID) {\n <button\n type=\"button\"\n class=\"entity-chip\"\n (click)=\"addEntity(entity)\"\n role=\"listitem\"\n [attr.aria-label]=\"'Add ' + entity.Name\"\n >\n <div class=\"chip-content\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"chip-name\">{{ entity.Name }}</span>\n </div>\n </button>\n }\n </div>\n } @else {\n <div class=\"no-search-results\">\n <i class=\"fa-solid fa-search\" aria-hidden=\"true\"></i>\n <p>No entities match \"{{ entitySearchTerm }}\"</p>\n </div>\n }\n </div>\n } @else {\n <div class=\"all-assigned\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <p>All entities have been assigned to this application</p>\n </div>\n }\n </div>\n </div>\n }\n </fieldset>\n\n <!-- System Information Section (Edit Mode Only) -->\n @if (isEditMode) {\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('systemInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n System Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.systemInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.systemInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Application metadata and audit information</span>\n </legend>\n\n @if (sectionExpanded.systemInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{ data?.application?.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Updated</span>\n <span class=\"info-value\">{{ data?.application?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Application ID</span>\n <span class=\"info-value\">{{ data?.application?.ID }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Total Entities</span>\n <span class=\"info-value\">{{ applicationEntities.length }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n }\n </form>\n </div>\n\n <!-- Modal Footer - Primary and Cancel buttons on RIGHT -->\n <div class=\"modal-footer\">\n <button\n type=\"submit\"\n class=\"mj-btn mj-btn-primary\"\n [disabled]=\"applicationForm.invalid || isLoading\"\n (click)=\"onSubmit()\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Update Application' : 'Create Application' }}\n }\n </button>\n <button type=\"button\" class=\"mj-btn mj-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n"]}
1
+ {"version":3,"file":"application-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/application-management/application-dialog/application-dialog.component.ts","../../../../src/lib/application-management/application-dialog/application-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges, inject, HostListener, ChangeDetectorRef, NgZone } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJApplicationEntity, MJApplicationEntityEntity, MJEntityEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nexport interface ApplicationDialogData {\n application?: MJApplicationEntity;\n mode: 'create' | 'edit';\n}\n\ninterface ApplicationEntityConfig {\n entity: MJEntityEntity;\n applicationEntity?: MJApplicationEntityEntity;\n sequence: number;\n defaultForNewUser: boolean;\n isNew: boolean;\n hasChanges: boolean;\n}\n\nexport interface ApplicationDialogResult {\n action: 'save' | 'cancel';\n application?: MJApplicationEntity;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-application-dialog',\n templateUrl: './application-dialog.component.html',\n styleUrls: ['./application-dialog.component.css']\n})\nexport class ApplicationDialogComponent implements OnInit, OnDestroy, OnChanges {\n @Input() data: ApplicationDialogData | null = null;\n @Input() visible = false;\n @Output() result = new EventEmitter<ApplicationDialogResult>();\n\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private metadata = new Metadata();\n\n public applicationForm: FormGroup;\n public isLoading = false;\n public error: string | null = null;\n\n // Entity management\n public applicationEntities: ApplicationEntityConfig[] = [];\n public availableEntities: MJEntityEntity[] = [];\n public allEntities: MJEntityEntity[] = [];\n\n // Search filter for available entities\n public entitySearchTerm = '';\n\n // Section expansion state\n public sectionExpanded = {\n basicInfo: true,\n entities: true,\n systemInfo: false\n };\n\n // Fullscreen state\n public isFullscreen = false;\n\n constructor() {\n this.applicationForm = this.fb.group({\n name: ['', [Validators.required, Validators.maxLength(100)]],\n description: ['']\n });\n }\n\n ngOnInit(): void {\n // Initial setup\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['visible'] && this.visible) {\n this.initializeDialog();\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n private async initializeDialog(): Promise<void> {\n if (!this.visible) return;\n \n try {\n this.isLoading = true;\n this.error = null;\n \n // Load all entities first\n await this.loadAllEntities();\n \n if (this.data?.application && this.isEditMode) {\n await this.loadApplicationData();\n } else {\n this.resetForm();\n }\n } catch (error: unknown) {\n console.error('Error initializing dialog:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Failed to load dialog data';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async loadAllEntities(): Promise<void> {\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 this.allEntities = result.Success ? result.Results : [];\n }\n\n private resetForm(): void {\n this.applicationForm.reset({\n name: '',\n description: ''\n });\n this.applicationEntities = [];\n this.availableEntities = [...this.allEntities];\n this.entitySearchTerm = '';\n this.error = null;\n }\n\n @HostListener('document:keydown.escape')\n onEscapeKey(): void {\n if (this.visible) {\n this.onCancel();\n }\n }\n\n public get windowTitle(): string {\n return this.isEditMode ? 'Edit Application' : 'Create New Application';\n }\n\n public get isEditMode(): boolean {\n return this.data?.mode === 'edit';\n }\n\n private async loadApplicationData(): Promise<void> {\n if (!this.data?.application) return;\n\n const app = this.data.application;\n this.applicationForm.patchValue({\n name: app.Name,\n description: app.Description\n });\n\n // Load existing MJApplicationEntity records\n await this.loadApplicationEntities(app.ID);\n }\n\n private async loadApplicationEntities(applicationId: string): Promise<void> {\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJApplicationEntityEntity>({\n EntityName: 'MJ: Application Entities',\n ExtraFilter: `ApplicationID='${applicationId}'`,\n ResultType: 'entity_object',\n OrderBy: 'Sequence ASC'\n });\n\n if (result.Success && result.Results) {\n this.applicationEntities = [];\n const usedEntityIds = new Set<string>();\n\n for (const appEntity of result.Results) {\n const entity = this.allEntities.find(e => UUIDsEqual(e.ID, appEntity.EntityID));\n if (entity) {\n this.applicationEntities.push({\n entity,\n applicationEntity: appEntity,\n sequence: appEntity.Sequence || 0,\n defaultForNewUser: appEntity.DefaultForNewUser || false,\n isNew: false,\n hasChanges: false\n });\n usedEntityIds.add(entity.ID);\n }\n }\n\n // Set available entities (excluding already assigned ones)\n this.availableEntities = this.allEntities.filter(e => !usedEntityIds.has(e.ID));\n }\n } catch (error) {\n console.warn('Failed to load application entities:', error);\n this.availableEntities = [...this.allEntities];\n }\n }\n\n public addEntity(entity: MJEntityEntity): void {\n // Add entity to application\n this.applicationEntities.push({\n entity,\n sequence: this.applicationEntities.length + 1,\n defaultForNewUser: false,\n isNew: true,\n hasChanges: false\n });\n\n // Update all sequences to be consecutive\n this.updateSequences();\n\n // Remove from available entities\n this.availableEntities = this.availableEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));\n }\n\n public removeEntity(config: ApplicationEntityConfig): void {\n // Remove from application entities\n this.applicationEntities = this.applicationEntities.filter(ae => !UUIDsEqual(ae.entity.ID, config.entity.ID));\n \n // Update all sequences to be consecutive\n this.updateSequences();\n \n // Add back to available entities if not already there\n if (!this.availableEntities.find(e => UUIDsEqual(e.ID, config.entity.ID))) {\n this.availableEntities.push(config.entity);\n this.availableEntities.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));\n }\n }\n\n public moveEntityUp(index: number): void {\n if (index > 0) {\n const temp = this.applicationEntities[index];\n this.applicationEntities[index] = this.applicationEntities[index - 1];\n this.applicationEntities[index - 1] = temp;\n this.updateSequences();\n }\n }\n\n public moveEntityDown(index: number): void {\n if (index < this.applicationEntities.length - 1) {\n const temp = this.applicationEntities[index];\n this.applicationEntities[index] = this.applicationEntities[index + 1];\n this.applicationEntities[index + 1] = temp;\n this.updateSequences();\n }\n }\n\n private updateSequences(): void {\n this.applicationEntities.forEach((config, index) => {\n config.sequence = index + 1;\n if (!config.isNew) {\n config.hasChanges = true;\n }\n });\n }\n\n public onDefaultForNewUserChange(config: ApplicationEntityConfig): void {\n if (!config.isNew) {\n config.hasChanges = true;\n }\n }\n\n public get hasEntityChanges(): boolean {\n return this.applicationEntities.some(ae => ae.isNew || ae.hasChanges);\n }\n\n // Filtered available entities based on search term\n public get filteredAvailableEntities(): MJEntityEntity[] {\n if (!this.entitySearchTerm || !this.entitySearchTerm.trim()) {\n return this.availableEntities;\n }\n const searchLower = this.entitySearchTerm.toLowerCase().trim();\n return this.availableEntities.filter(entity =>\n (entity.Name || '').toLowerCase().includes(searchLower) ||\n (entity.Description || '').toLowerCase().includes(searchLower)\n );\n }\n\n public onEntitySearchChange(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.entitySearchTerm = value;\n }\n\n public clearEntitySearch(): void {\n this.entitySearchTerm = '';\n }\n\n public toggleSection(section: 'basicInfo' | 'entities' | 'systemInfo'): void {\n this.sectionExpanded[section] = !this.sectionExpanded[section];\n }\n\n public toggleFullscreen(): void {\n this.isFullscreen = !this.isFullscreen;\n }\n\n public onEntityDrop(event: CdkDragDrop<ApplicationEntityConfig[]>): void {\n if (event.previousIndex !== event.currentIndex) {\n moveItemInArray(this.applicationEntities, event.previousIndex, event.currentIndex);\n this.updateSequences();\n }\n }\n\n public async onSubmit(): Promise<void> {\n if (this.applicationForm.invalid) {\n this.markFormGroupTouched(this.applicationForm);\n return;\n }\n\n this.isLoading = true;\n this.error = null;\n\n try {\n let application: MJApplicationEntity;\n\n if (this.isEditMode && this.data?.application) {\n // Edit existing application\n application = this.data.application;\n } else {\n // Create new application\n application = await this.metadata.GetEntityObject<MJApplicationEntity>('MJ: Applications');\n application.NewRecord();\n }\n\n // Update application properties\n const formValue = this.applicationForm.value;\n application.Name = formValue.name;\n application.Description = formValue.description || null;\n\n // Save application\n const saveResult = await application.Save();\n if (!saveResult) {\n throw new Error(application.LatestResult?.Message || 'Failed to save application');\n }\n\n // Save application entities if there are changes\n if (this.hasEntityChanges) {\n await this.saveApplicationEntities(application.ID);\n }\n\n this.result.emit({ action: 'save', application });\n\n } catch (error: unknown) {\n console.error('Error saving application:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'An unexpected error occurred';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async saveApplicationEntities(applicationId: string): Promise<void> {\n // Save or update each MJApplicationEntity record\n for (const config of this.applicationEntities) {\n if (config.isNew || config.hasChanges) {\n let appEntity: MJApplicationEntityEntity;\n\n if (config.isNew) {\n // Create new MJApplicationEntity\n appEntity = await this.metadata.GetEntityObject<MJApplicationEntityEntity>('MJ: Application Entities');\n appEntity.NewRecord();\n appEntity.ApplicationID = applicationId;\n appEntity.EntityID = config.entity.ID;\n } else if (config.applicationEntity) {\n // Update existing MJApplicationEntity\n appEntity = config.applicationEntity;\n } else {\n continue;\n }\n\n appEntity.Sequence = config.sequence;\n appEntity.DefaultForNewUser = config.defaultForNewUser;\n\n const saveResult = await appEntity.Save();\n if (!saveResult) {\n console.warn(`Failed to save MJApplicationEntity for ${config.entity.Name}:`, appEntity.LatestResult?.Message);\n }\n }\n }\n }\n\n public onCancel(): void {\n this.result.emit({ action: 'cancel' });\n }\n\n private markFormGroupTouched(formGroup: FormGroup): void {\n Object.keys(formGroup.controls).forEach(key => {\n const control = formGroup.get(key);\n control?.markAsTouched();\n });\n }\n}","@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\" role=\"presentation\">\n <div\n class=\"modal-dialog\"\n [class.fullscreen]=\"isFullscreen\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"application-dialog-title\"\n aria-describedby=\"application-dialog-description\"\n >\n <!-- Modal Header -->\n <div class=\"modal-header\" [class.create-mode]=\"!isEditMode\" [class.edit-mode]=\"isEditMode\">\n <div class=\"modal-header-content\">\n <h2 class=\"modal-title\" id=\"application-dialog-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"!isEditMode\" [class.fa-layer-group]=\"isEditMode\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Edit Application' : 'Create New Application' }}\n </h2>\n <p class=\"modal-subtitle\" id=\"application-dialog-description\">\n {{ isEditMode ? 'Update application information and settings' : 'Add a new application to the system' }}\n </p>\n </div>\n <div class=\"modal-header-actions\">\n <button\n class=\"modal-action-btn\"\n (click)=\"toggleFullscreen()\"\n [attr.aria-label]=\"isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'\"\n type=\"button\"\n >\n <i class=\"fa-solid\" [class.fa-compress]=\"isFullscreen\" [class.fa-expand]=\"!isFullscreen\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"modal-close\"\n (click)=\"onCancel()\"\n aria-label=\"Close dialog\"\n type=\"button\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"applicationForm\" (ngSubmit)=\"onSubmit()\">\n <!-- Error Alert -->\n @if (error) {\n <div class=\"form-section\">\n <div class=\"alert alert-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n <div>{{ error }}</div>\n </div>\n </div>\n }\n\n <!-- Basic Information Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('basicInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n Application Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.basicInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.basicInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Define the application's basic properties</span>\n </legend>\n\n @if (sectionExpanded.basicInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"form-field\">\n <label class=\"field-label required\" for=\"app-name\">Application Name</label>\n <input\n id=\"app-name\"\n type=\"text\"\n class=\"field-input\"\n formControlName=\"name\"\n placeholder=\"My Application\"\n [class.error]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n [attr.aria-invalid]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n aria-describedby=\"app-name-error\"\n />\n @if (applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched) {\n <div class=\"field-error\" id=\"app-name-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"></i>\n @if (applicationForm.get('name')?.errors?.['required']) {\n Application name is required\n }\n @if (applicationForm.get('name')?.errors?.['maxlength']) {\n Application name cannot exceed 100 characters\n }\n </div>\n }\n </div>\n\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"app-description\">Description</label>\n <textarea\n id=\"app-description\"\n class=\"field-textarea\"\n formControlName=\"description\"\n placeholder=\"Describe the application's purpose and functionality...\"\n rows=\"4\"\n ></textarea>\n <div class=\"field-hint\">\n Provide a clear description of what this application does and its main features.\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n\n <!-- Entity Management Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('entities')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n Application Entities\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.entities\"\n [class.fa-chevron-down]=\"!sectionExpanded.entities\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Manage which entities are included in this application</span>\n </legend>\n\n @if (sectionExpanded.entities) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <!-- Assigned Entities -->\n @if (applicationEntities.length > 0) {\n <div class=\"assigned-entities\">\n <h4 class=\"subsection-title\">Assigned Entities ({{ applicationEntities.length }})</h4>\n <div class=\"entities-list\"\n role=\"list\"\n cdkDropList\n (cdkDropListDropped)=\"onEntityDrop($event)\">\n @for (config of applicationEntities; track config.entity.ID; let i = $index) {\n <div\n class=\"entity-item\"\n [class.is-new]=\"config.isNew\"\n [class.has-changes]=\"config.hasChanges\"\n role=\"listitem\"\n cdkDrag\n >\n <i class=\"fa-solid fa-grip-vertical drag-handle\" aria-hidden=\"true\"></i>\n <div class=\"entity-info\">\n <div class=\"entity-icon\">\n <i class=\"fa-solid fa-table\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"entity-details\">\n <div class=\"entity-name\">\n {{ config.entity.Name }}\n @if (config.entity.Description) {\n <i\n class=\"fa-solid fa-info-circle entity-info-icon\"\n [title]=\"config.entity.Description\"\n [attr.aria-label]=\"'Entity description: ' + config.entity.Description\"\n ></i>\n }\n </div>\n </div>\n </div>\n\n <div class=\"entity-config\">\n <div class=\"config-item\">\n <label class=\"config-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config.defaultForNewUser\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"onDefaultForNewUserChange(config)\"\n class=\"config-checkbox\"\n />\n <span class=\"checkbox-text\">Default for new users</span>\n </label>\n </div>\n <div class=\"sequence-badge\" [attr.aria-label]=\"'Sequence ' + config.sequence\">{{ config.sequence }}</div>\n </div>\n\n <div class=\"entity-actions\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeEntity(config)\"\n title=\"Remove entity\"\n [attr.aria-label]=\"'Remove ' + config.entity.Name\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"no-entities\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n <p>No entities assigned to this application</p>\n <p class=\"empty-subtext\">Add entities from the available list below</p>\n </div>\n }\n\n <!-- Available Entities -->\n @if (availableEntities.length > 0) {\n <div class=\"available-entities\">\n <div class=\"available-entities-header\">\n <h4 class=\"subsection-title\">Available Entities ({{ filteredAvailableEntities.length }} of {{ availableEntities.length }})</h4>\n <div class=\"entity-search\">\n <i class=\"fa-solid fa-search entity-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"entity-search-input\"\n placeholder=\"Search entities...\"\n [value]=\"entitySearchTerm\"\n (input)=\"onEntitySearchChange($event)\"\n aria-label=\"Search available entities\"\n />\n @if (entitySearchTerm) {\n <button\n type=\"button\"\n class=\"entity-search-clear\"\n (click)=\"clearEntitySearch()\"\n aria-label=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n @if (filteredAvailableEntities.length > 0) {\n <div class=\"entities-grid\" role=\"list\">\n @for (entity of filteredAvailableEntities; track entity.ID) {\n <button\n type=\"button\"\n class=\"entity-chip\"\n (click)=\"addEntity(entity)\"\n role=\"listitem\"\n [attr.aria-label]=\"'Add ' + entity.Name\"\n >\n <div class=\"chip-content\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"chip-name\">{{ entity.Name }}</span>\n </div>\n </button>\n }\n </div>\n } @else {\n <div class=\"no-search-results\">\n <i class=\"fa-solid fa-search\" aria-hidden=\"true\"></i>\n <p>No entities match \"{{ entitySearchTerm }}\"</p>\n </div>\n }\n </div>\n } @else {\n <div class=\"all-assigned\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <p>All entities have been assigned to this application</p>\n </div>\n }\n </div>\n </div>\n }\n </fieldset>\n\n <!-- System Information Section (Edit Mode Only) -->\n @if (isEditMode) {\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('systemInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n System Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.systemInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.systemInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Application metadata and audit information</span>\n </legend>\n\n @if (sectionExpanded.systemInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{ data?.application?.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Updated</span>\n <span class=\"info-value\">{{ data?.application?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Application ID</span>\n <span class=\"info-value\">{{ data?.application?.ID }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Total Entities</span>\n <span class=\"info-value\">{{ applicationEntities.length }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n }\n </form>\n </div>\n\n <!-- Modal Footer - Primary and Cancel buttons on RIGHT -->\n <div class=\"modal-footer\">\n <button\n type=\"submit\"\n mjButton variant=\"primary\"\n [disabled]=\"applicationForm.invalid || isLoading\"\n (click)=\"onSubmit()\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Update Application' : 'Create Application' }}\n }\n </button>\n <button type=\"button\" mjButton (click)=\"onCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n"]}