@memberjunction/ng-explorer-settings 5.4.0 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-dialog/application-dialog.component.js +6 -5
- package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
- package/dist/lib/application-management/application-management.component.js +2 -2
- package/dist/lib/application-management/application-management.component.js.map +1 -1
- package/dist/lib/application-settings/application-settings.component.d.ts.map +1 -1
- package/dist/lib/application-settings/application-settings.component.js +3 -2
- package/dist/lib/application-settings/application-settings.component.js.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.js +2 -2
- package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +6 -5
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.js +3 -2
- package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
- package/dist/lib/user-app-config/user-app-config.component.d.ts.map +1 -1
- package/dist/lib/user-app-config/user-app-config.component.js +3 -2
- package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
- package/dist/lib/user-management/user-management.component.js +2 -2
- package/dist/lib/user-management/user-management.component.js.map +1 -1
- package/package.json +17 -17
package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/application-management/application-dialog/application-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAmD,MAAM,eAAe,CAAC;AAErK,OAAO,EAAiD,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAmB,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;;
|
|
1
|
+
{"version":3,"file":"application-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/application-management/application-dialog/application-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAmD,MAAM,eAAe,CAAC;AAErK,OAAO,EAAiD,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAmB,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;;AAG/G,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;CACzB;AAED,UAAU,uBAAuB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,qBAMa,0BAA2B,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS;IACpE,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAQ;IAC1C,OAAO,UAAS;IACf,MAAM,wCAA+C;IAE/D,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAE3B,eAAe,EAAE,SAAS,CAAC;IAC3B,SAAS,UAAS;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,mBAAmB,EAAE,uBAAuB,EAAE,CAAM;IACpD,iBAAiB,EAAE,cAAc,EAAE,CAAM;IACzC,WAAW,EAAE,cAAc,EAAE,CAAM;IAGnC,gBAAgB,SAAM;IAGtB,eAAe;;;;MAIpB;IAGK,YAAY,UAAS;;IAS5B,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC,WAAW,IAAI,IAAI;YAIL,gBAAgB;YA6BhB,eAAe;IAW7B,OAAO,CAAC,SAAS;IAYjB,WAAW,IAAI,IAAI;IAMnB,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,UAAU,IAAI,OAAO,CAE/B;YAEa,mBAAmB;YAanB,uBAAuB;IAsC9B,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAiBvC,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAcnD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASjC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS1C,OAAO,CAAC,eAAe;IAShB,yBAAyB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAMvE,IAAW,gBAAgB,IAAI,OAAO,CAErC;IAGD,IAAW,yBAAyB,IAAI,cAAc,EAAE,CASvD;IAEM,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKxC,iBAAiB,IAAI,IAAI;IAIzB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI;IAIrE,gBAAgB,IAAI,IAAI;IAIxB,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,uBAAuB,EAAE,CAAC,GAAG,IAAI;IAO3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAqDxB,uBAAuB;IA8B9B,QAAQ,IAAI,IAAI;IAIvB,OAAO,CAAC,oBAAoB;yCAzWjB,0BAA0B;2CAA1B,0BAA0B;CA+WtC"}
|
|
@@ -2,6 +2,7 @@ import { Component, Input, Output, EventEmitter, inject, HostListener, ChangeDet
|
|
|
2
2
|
import { FormBuilder, Validators } from '@angular/forms';
|
|
3
3
|
import { moveItemInArray } from '@angular/cdk/drag-drop';
|
|
4
4
|
import { Metadata, RunView } from '@memberjunction/core';
|
|
5
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
import * as i1 from "@angular/forms";
|
|
7
8
|
import * as i2 from "@angular/cdk/drag-drop";
|
|
@@ -520,7 +521,7 @@ export class ApplicationDialogComponent {
|
|
|
520
521
|
this.applicationEntities = [];
|
|
521
522
|
const usedEntityIds = new Set();
|
|
522
523
|
for (const appEntity of result.Results) {
|
|
523
|
-
const entity = this.allEntities.find(e => e.ID
|
|
524
|
+
const entity = this.allEntities.find(e => UUIDsEqual(e.ID, appEntity.EntityID));
|
|
524
525
|
if (entity) {
|
|
525
526
|
this.applicationEntities.push({
|
|
526
527
|
entity,
|
|
@@ -554,15 +555,15 @@ export class ApplicationDialogComponent {
|
|
|
554
555
|
// Update all sequences to be consecutive
|
|
555
556
|
this.updateSequences();
|
|
556
557
|
// Remove from available entities
|
|
557
|
-
this.availableEntities = this.availableEntities.filter(e => e.ID
|
|
558
|
+
this.availableEntities = this.availableEntities.filter(e => !UUIDsEqual(e.ID, entity.ID));
|
|
558
559
|
}
|
|
559
560
|
removeEntity(config) {
|
|
560
561
|
// Remove from application entities
|
|
561
|
-
this.applicationEntities = this.applicationEntities.filter(ae => ae.entity.ID
|
|
562
|
+
this.applicationEntities = this.applicationEntities.filter(ae => !UUIDsEqual(ae.entity.ID, config.entity.ID));
|
|
562
563
|
// Update all sequences to be consecutive
|
|
563
564
|
this.updateSequences();
|
|
564
565
|
// Add back to available entities if not already there
|
|
565
|
-
if (!this.availableEntities.find(e => e.ID
|
|
566
|
+
if (!this.availableEntities.find(e => UUIDsEqual(e.ID, config.entity.ID))) {
|
|
566
567
|
this.availableEntities.push(config.entity);
|
|
567
568
|
this.availableEntities.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));
|
|
568
569
|
}
|
|
@@ -733,5 +734,5 @@ export class ApplicationDialogComponent {
|
|
|
733
734
|
type: HostListener,
|
|
734
735
|
args: ['document:keydown.escape']
|
|
735
736
|
}] }); })();
|
|
736
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationDialogComponent, { className: "ApplicationDialogComponent", filePath: "src/lib/application-management/application-dialog/application-dialog.component.ts", lineNumber:
|
|
737
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationDialogComponent, { className: "ApplicationDialogComponent", filePath: "src/lib/application-management/application-dialog/application-dialog.component.ts", lineNumber: 34 }); })();
|
|
737
738
|
//# sourceMappingURL=application-dialog.component.js.map
|
package/dist/lib/application-management/application-dialog/application-dialog.component.js.map
CHANGED
|
@@ -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';\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 => 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 => e.ID !== entity.ID);\n }\n\n public removeEntity(config: ApplicationEntityConfig): void {\n // Remove from application entities\n this.applicationEntities = this.applicationEntities.filter(ae => 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 => 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 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"]}
|
|
@@ -9,7 +9,7 @@ import { Subject, BehaviorSubject } from 'rxjs';
|
|
|
9
9
|
import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
10
10
|
import { RunView, Metadata } from '@memberjunction/core';
|
|
11
11
|
import { BaseDashboard } from '@memberjunction/ng-shared';
|
|
12
|
-
import { RegisterClass } from '@memberjunction/global';
|
|
12
|
+
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
13
13
|
import * as i0 from "@angular/core";
|
|
14
14
|
import * as i1 from "@memberjunction/ng-shared-generic";
|
|
15
15
|
import * as i2 from "./application-dialog/application-dialog.component";
|
|
@@ -447,7 +447,7 @@ let ApplicationManagementComponent = class ApplicationManagementComponent extend
|
|
|
447
447
|
return this.appEntities.get(appId) || [];
|
|
448
448
|
}
|
|
449
449
|
getEntityInfo(entityId) {
|
|
450
|
-
return this.metadata.Entities.find(e => e.ID
|
|
450
|
+
return this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));
|
|
451
451
|
}
|
|
452
452
|
createNewApplication() {
|
|
453
453
|
this.applicationDialogData = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-management.component.js","sourceRoot":"","sources":["../../../src/lib/application-management/application-management.component.ts","../../../src/lib/application-management/application-management.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAqB,SAAS,EAAqB,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;;;;;IC+GnD,+BAAgE;IAC9D,iCAAwD;IAC1D,iBAAM;;;;IAMJ,AADF,+BAA0C,cACb;IACzB,wBAA8E;IAC9E,6BAAyB;IAAA,YAAW;IAAA,iBAAI;IACxC,kCAAkE;IAA5B,mMAAS,wBAAiB,KAAC;IAC/D,wBAAmC;IACnC,2BACF;IAEJ,AADE,AADE,iBAAS,EACL,EACF;;;IANuB,eAAW;IAAX,kCAAW;;;IAmHZ,gCAAkC;IAAA,sBAAM;IAAA,iBAAO;;;IAHnD,AADF,+BAAyB,cACE;IAAA,YAAiB;IAAA,iBAAM;IAChD,+BAAyB;IACvB,yKAAmC;IAGnC,gCAA8B;IAAA,YAA+B;IAEjE,AADE,AAD+D,iBAAO,EAChE,EACF;;;IAPqB,eAAiB;IAAjB,8BAAiB;IAExC,eAEC;IAFD,yDAEC;IAC6B,eAA+B;IAA/B,uDAA+B;;;IAPnE,0JAAoD;;;;;IAApD,6FAUC;;;IAZL,+BAA2B;IACzB,sJAYC;IACH,iBAAM;;;;IAbJ,cAYC;IAZD,cAAA,gCAAsB,CAYrB;;;IAGH,6BAAuB;IAAA,2DAA2C;IAAA,iBAAI;;;;IAnE1E,AAFF,+BAAyB,cAE4C;IAAnC,wLAAS,wBAAwB,KAAC;IAChE,gCAA4D;IAC1D,YACF;IAAA,iBAAO;IAEL,AADF,+BAAmC,iBAMhC;IAHC,sQAAS,8BAAoB,KAAC;IAI9B,wBAAgC;IAChC,gCAAwB;IAAA,oBAAI;IAC9B,AAD8B,iBAAO,EAC5B;IACT,kCAKC;IAHC,sQAAS,uCAA6B,KAAC;IAIvC,yBAAiC;IACjC,iCAAwB;IAAA,uBAAM;IAGpC,AADE,AADE,AADgC,iBAAO,EAC9B,EACL,EACF;IAGJ,AADF,gCAAuB,eACE;IACrB,yBAAuD;IACvD,iCAAyB;IAAA,0BAAS;IAAA,iBAAO;IACzC,iCAAyB;IAAA,aAAmC;IAC9D,AAD8D,iBAAO,EAC/D;IACN,gCAAuB;IACrB,yBAAuD;IACvD,iCAAyB;IAAA,yBAAQ;IAAA,iBAAO;IACxC,iCAAyB;IAAA,aAAuC;;IAClE,AADkE,iBAAO,EACnE;IACN,gCAAuB;IACrB,yBAAoD;IACpD,iCAAyB;IAAA,yBAAQ;IAAA,iBAAO;IACxC,iCAAyB;IAAA,aAAuC;;IAEpE,AADE,AADkE,iBAAO,EACnE,EACF;IAGJ,AADF,gCAA8B,cACF;IACxB,yBAAuD;IACvD,uCACF;IAAA,iBAAK;IAkBH,AAhBF,uIAAyC,+GAgBhC;IAIb,AADE,iBAAM,EACF;;;;IArEyB,eAAgC;IAAhC,+CAAgC;IACzD,cACF;IADE,iEACF;IAMI,eAAsC;;IAStC,eAAwC;;IAYjB,gBAAmC;IAAnC,6DAAmC;IAKnC,eAAuC;IAAvC,2EAAuC;IAKvC,eAAuC;IAAvC,4EAAuC;IAUlE,eAkBC;IAlBD,uEAkBC;;;;IA9GP,AADF,+BAA+E,cAC2C;IAAhG,gOAAS,oCAA0B,KAAC;IAExD,AADF,+BAAsB,cACU;IAC5B,wBAAkE;IACpE,iBAAM;IAEJ,AADF,+BAAyB,aACF;IAAA,YAAc;IAAA,iBAAK;IACxC,6BAA2B;IAAA,YAAmD;IAElF,AADE,AADgF,iBAAI,EAC9E,EACF;IAGJ,AADF,gCAAsB,gBACwC;IAC1D,aACF;IAAA,iBAAO;IACP,gCAA4D;IAAnC,0KAAS,wBAAwB,KAAC;IACzD,mCAKC;IAHC,oOAAS,8BAAoB,KAAC;IAI9B,yBAAgC;IAClC,iBAAS;IACT,mCAKC;IAHC,oOAAS,uCAA6B,KAAC;IAIvC,yBAAiC;IAErC,AADE,iBAAS,EACL;IACN,mCAAuD;IACrD,yBAA2D;IAGjE,AADE,AADE,iBAAS,EACL,EACF;IAEN,0HAA6B;IA2E/B,iBAAM;;;;IAnHgB,2DAAwC;IACe,cAA4C;;IAG9G,eAAuC;IAAvC,sDAAuC;IAGrB,eAAc;IAAd,iCAAc;IACR,eAAmD;IAAnD,sEAAmD;IAKrD,eAAgC;IAAhC,+CAAgC;IACzD,cACF;IADE,iEACF;IAMI,eAAsC;;IAQtC,eAAwC;;IAWhD,eA0EC;IA1ED,2DA0EC;;;IAKH,+BAAyB;IACvB,wBAA+D;IAC/D,6BAAsB;IAAA,qCAAqB;IAAA,iBAAI;IAC/C,6BAAyB;IAAA,sEAAsD;IACjF,AADiF,iBAAI,EAC/E;;;IA7HV,AADF,+BAA0B,cACmB;IACzC,mHAqHC;IAED,gHAAyC;IAQ7C,AADE,iBAAM,EACF;;;IA/HF,eAqHC;IArHD,0CAqHC;IAED,eAMC;IAND,mEAMC;;;IAgDK,yBAA8D;IAC9D,6BACF;;;IACE,yBAAoD;IACpD,oCACF;;;;IAtCR,+BAAoF;IAAxD,2NAA6B,KAAK,KAAC;IAC7D,+BAOC;IALC,mKAAS,wBAAwB,KAAC;IAOhC,AADF,+BAA0B,aACyB;IAC/C,wBAA+E;IAC/E,gCACF;IAAA,iBAAK;IACL,kCAIC;IAFC,8NAA6B,KAAK,KAAC;IAGnC,wBAAoD;IAExD,AADE,iBAAS,EACL;IAEJ,AADF,+BAAuD,QAClD;IAAA,iEAAgD;IAAA,+BAAQ;IAAA,aAAsB;IAAA,iBAAS;IAAA,kBAAC;IAAA,iBAAI;IAC/F,8BAAwB;IACtB,yBAAsD;IACtD,iFACF;IACF,AADE,iBAAI,EACA;IAGJ,AAFF,gCAA0B,kBAEkE;IAArD,oMAAS,0BAAmB,KAAC;IAI9D,AAHF,uGAAiB,iFAGR;IAIX,iBAAS;IACT,mCAA4E;IAApC,+NAA6B,KAAK,KAAC;IACzE,yBACF;IAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;;IAtB2D,gBAAsB;IAAtB,6CAAsB;IAQd,eAAsB;IAAtB,2CAAsB;IACvF,cAMC;IAND,4CAMC;;ADlSN,IAAM,8BAA8B,GAApC,MAAM,8BAA+B,SAAQ,aAAa;IAkC3C;IAAgC;IAjCpD,mBAAmB;IACZ,YAAY,GAA0B,EAAE,CAAC;IACzC,oBAAoB,GAA0B,EAAE,CAAC;IACjD,WAAW,GAA+B,IAAI,CAAC;IAC/C,SAAS,GAAG,KAAK,CAAC;IAClB,KAAK,GAAkB,IAAI,CAAC;IAEnC,+BAA+B;IACxB,WAAW,GAA6C,IAAI,GAAG,EAAE,CAAC;IAEzE,QAAQ;IACD,KAAK,GAAa;QACvB,iBAAiB,EAAE,CAAC;QACpB,kBAAkB,EAAE,CAAC;QACrB,aAAa,EAAE,CAAC;QAChB,cAAc,EAAE,CAAC;KAClB,CAAC;IAEF,UAAU;IACH,QAAQ,GAAG,IAAI,eAAe,CAAgB;QACnD,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,EAAE;KACX,CAAC,CAAC;IAEH,WAAW;IACJ,qBAAqB,GAAG,KAAK,CAAC;IAC9B,qBAAqB,GAAiC,IAAI,CAAC;IAC3D,iBAAiB,GAAG,KAAK,CAAC;IAC1B,aAAa,GAAkB,IAAI,CAAC;IAEnC,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAC/B,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAElC,YAAoB,GAAsB,EAAU,MAAc;QAChE,KAAK,EAAE,CAAC;QADU,QAAG,GAAH,GAAG,CAAmB;QAAU,WAAM,GAAN,MAAM,CAAQ;IAElE,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,wBAAwB,CAAA;IACjC,CAAC;IAES,aAAa;QACrB,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAES,QAAQ;QAChB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEQ,WAAW;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,eAAe;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAElB,uCAAuC;YACvC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC5C,IAAI,CAAC,gBAAgB,EAAE;gBACvB,IAAI,CAAC,uBAAuB,EAAE;aAC/B,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,EAAE,CAAC;QAEtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,GAAG,oDAAoD,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAsB;YACnD,UAAU,EAAE,kBAAkB;YAC9B,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACnC,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAA4B;YACzD,UAAU,EAAE,0BAA0B;YACtC,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,yBAAyB;SACnC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,CAAC;IAEO,0BAA0B,CAAC,WAAwC;QACzE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,uBAAuB;QAC7B,IAAI,CAAC,QAAQ;aACV,IAAI,CACH,YAAY,CAAC,GAAG,CAAC,EACjB,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACvE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB;aACA,SAAS,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC,IAAI,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtC,wEAAwE;QACxE,0EAA0E;QAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAClC,8CAA8C;YAC9C,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,sBAAsB;QACtB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACjD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/B,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC7C,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CACrD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEO,cAAc;QACpB,+CAA+C;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC;QACrC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5C,aAAa,IAAI,QAAQ,CAAC,MAAM,CAAC;YACjC,cAAc,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;QACrE,CAAC;QAED,IAAI,CAAC,KAAK,GAAG;YACX,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;YAC3C,kBAAkB,EAAE,UAAU,CAAC,MAAM;YACrC,aAAa;YACb,cAAc;SACf,CAAC;IACJ,CAAC;IAED,8BAA8B;IACvB,cAAc,CAAC,KAAY;QAChC,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;IAEM,oBAAoB,CAAC,MAAqC;QAC/D,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,CAAC;IAEM,YAAY,CAAC,OAA+B;QACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK;YACtB,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAEM,kBAAkB,CAAC,KAAa;QACrC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,CAAC;IAEM,aAAa,CAAC,KAAa;QAChC,OAAO,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC;IACtC,CAAC;IAEM,cAAc,CAAC,KAAa;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAEM,aAAa,CAAC,QAAgB;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAEM,oBAAoB;QACzB,IAAI,CAAC,qBAAqB,GAAG;YAC3B,IAAI,EAAE,QAAQ;SACf,CAAC;QACF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACpC,CAAC;IAEM,eAAe,CAAC,GAAwB;QAC7C,IAAI,CAAC,qBAAqB,GAAG;YAC3B,WAAW,EAAE,GAAG;YAChB,IAAI,EAAE,MAAM;SACb,CAAC;QACF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACpC,CAAC;IAEM,wBAAwB,CAAC,GAAwB;QACtD,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACvB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,iBAAiB;QAC5B,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9B,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAElB,yBAAyB;YACzB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACrD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,IAAI,8BAA8B,CAAC,CAAC;YAC5F,CAAC;YAED,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC;gBACrF,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,yBAAyB,CAAC,MAA+B;QAC9D,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAElC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,0CAA0C;YAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,GAAwB;QACxC,oEAAoE;QACpE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAE5C,mCAAmC;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1D,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxF,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAClF,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACvD,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAChF,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACrF,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACtF,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACzF,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrF,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/E,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,OAAO,WAAW,CAAC;IACrB,CAAC;IAEM,iBAAiB,CAAC,GAAwB;QAC/C,0CAA0C;QAC1C,OAAO,eAAe,CAAC;IACzB,CAAC;IAEM,iBAAiB,CAAC,GAAwB;QAC/C,0CAA0C;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;wHAzUU,8BAA8B;6DAA9B,8BAA8B;YCvBrC,AADF,AAFF,AAFF,8BAA8C,aAEjB,aAE8D,gBAMpF;YAHC,2GAAS,iBAAa,IAAC;YAIvB,uBAAkF;YAClF,+BAAuB;YAAA,uBAAO;YAChC,AADgC,iBAAO,EAC9B;YACT,iCAA2H;YAAlE,2GAAS,0BAAsB,IAAC;YACvF,uBAAmD;YACnD,+BAAuB;YAAA,gCAAe;YAE1C,AADE,AADwC,iBAAO,EACtC,EACL;YAKF,AADF,AADF,+BAAyE,cAClD,eACuC;YACxD,yBAAiC;YACnC,iBAAM;YAEJ,AADF,gCAA0B,eACsC;YAAA,aAA6B;YAAA,iBAAM;YACjG,gCAAwB;YAAA,mCAAkB;YAE9C,AADE,AAD4C,iBAAM,EAC5C,EACF;YAGJ,AADF,+BAAqB,eACwC;YACzD,yBAAwC;YAC1C,iBAAM;YAEJ,AADF,gCAA0B,eACuC;YAAA,aAA8B;YAAA,iBAAM;YACnG,gCAAwB;YAAA,oCAAmB;YAE/C,AADE,AAD6C,iBAAM,EAC7C,EACF;YAGJ,AADF,+BAAqB,eAC0C;YAC3D,yBAAoC;YACtC,iBAAM;YAEJ,AADF,gCAA0B,eACkC;YAAA,aAAyB;YAAA,iBAAM;YACzF,gCAAwB;YAAA,+BAAc;YAE1C,AADE,AADwC,iBAAM,EACxC,EACF;YAGJ,AADF,+BAAqB,eACwC;YACzD,yBAAiC;YACnC,iBAAM;YAEJ,AADF,gCAA0B,eACmC;YAAA,aAA0B;YAAA,iBAAM;YAC3F,gCAAwB;YAAA,gCAAe;YAG7C,AADE,AADE,AADyC,iBAAM,EACzC,EACF,EACF;YAMF,AAFF,AADF,gCAA4E,eACjD,eAEA;YACrB,yBAAoE;YACpE,kCAOE;YAHA,iHAAS,0BAAsB,IAAC;YAIpC,AARE,iBAOE,EACE;YAIJ,AADF,gCAA6B,iBAC6B;YAAA,uBAAM;YAAA,iBAAQ;YAEpE,AADF,gCAAkF,kBAM/E;YAFC,4GAAS,yBAAqB,KAAK,CAAC,IAAC;YAGrC,sBACF;YAAA,iBAAS;YACT,mCAKC;YAFC,4GAAS,yBAAqB,QAAQ,CAAC,IAAC;YAGxC,yBACF;YAAA,iBAAS;YACT,mCAKC;YAFC,4GAAS,yBAAqB,UAAU,CAAC,IAAC;YAG1C,2BACF;YAKV,AADE,AADE,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF,EACF,EACF;YAGN,gCAAgC;YAEhC,mGAAiB;YAOjB,mGAA2B;YAc3B,mGAA4B;YAoI5B,iBAAM;YAGN,kDAIC;YADC,mIAAU,qCAAiC,IAAC;YAC7C,iBAAwB;YAGzB,oGAAwC;YAgD1C,iBAAM;;YA/TE,eAAsB;YAAtB,wCAAsB;YAGS,cAA2B;YAA3B,wCAA2B;YAgBM,gBAA6B;YAA7B,iDAA6B;YAU5B,eAA8B;YAA9B,kDAA8B;YAUnC,eAAyB;YAAzB,6CAAyB;YAUxB,eAA0B;YAA1B,8CAA0B;YAiBnF,eAA+B;YAA/B,iDAA+B;YAW7B,eAAwD;YAAxD,qEAAwD;;YAQxD,eAA2D;YAA3D,wEAA2D;;YAQ3D,eAA6D;YAA7D,0EAA6D;;YAezE,eAIC;YAJD,yCAIC;YAGD,cAWC;YAXD,uDAWC;YAGD,cAmIC;YAnID,wDAmIC;YAKC,cAAiC;YACjC,AADA,mDAAiC,mCACH;YAKhC,cA+CC;YA/CD,oEA+CC;;;AD1SU,8BAA8B;IAD1C,aAAa,CAAC,aAAa,EAAE,uBAAuB,CAAC;GACzC,8BAA8B,CA0U1C;;iFA1UY,8BAA8B;cAP1C,SAAS;6BACI,KAAK,YACP,2BAA2B;;kFAK1B,8BAA8B","sourcesContent":["import { ChangeDetectorRef, Component, NgZone, OnDestroy } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJApplicationEntity, MJApplicationEntityEntity, ResourceData } from '@memberjunction/core-entities';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { ApplicationDialogData, ApplicationDialogResult } from './application-dialog/application-dialog.component';\n\ninterface AppStats {\n totalApplications: number;\n activeApplications: number;\n totalEntities: number;\n publicEntities: number;\n}\n\ninterface FilterOptions {\n status: 'all' | 'active' | 'inactive';\n search: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-application-management',\n templateUrl: './application-management.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './application-management.component.css']\n})\n@RegisterClass(BaseDashboard, 'ApplicationManagement')\nexport class ApplicationManagementComponent extends BaseDashboard implements OnDestroy {\n // State management\n public applications: MJApplicationEntity[] = [];\n public filteredApplications: MJApplicationEntity[] = [];\n public selectedApp: MJApplicationEntity | null = null;\n public isLoading = false;\n public error: string | null = null;\n\n // Application entities mapping\n public appEntities: Map<string, MJApplicationEntityEntity[]> = new Map();\n\n // Stats\n public stats: AppStats = {\n totalApplications: 0,\n activeApplications: 0,\n totalEntities: 0,\n publicEntities: 0\n };\n\n // Filters\n public filters$ = new BehaviorSubject<FilterOptions>({\n status: 'all',\n search: ''\n });\n\n // UI State\n public showApplicationDialog = false;\n public applicationDialogData: ApplicationDialogData | null = null;\n public showDeleteConfirm = false;\n public expandedAppId: string | null = null;\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 \"Application 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 applications and their entities\n const [apps, appEntities] = await Promise.all([\n this.loadApplications(),\n this.loadApplicationEntities()\n ]);\n \n this.applications = apps;\n this.processApplicationEntities(appEntities);\n this.calculateStats();\n this.applyFilters();\n \n } catch (error) {\n console.error('Error loading application data:', error);\n this.error = 'Failed to load application 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 loadApplications(): Promise<MJApplicationEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJApplicationEntity>({\n EntityName: 'MJ: Applications',\n ResultType: 'entity_object',\n OrderBy: 'Name ASC'\n });\n \n return result.Success ? result.Results : [];\n }\n \n private async loadApplicationEntities(): Promise<MJApplicationEntityEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJApplicationEntityEntity>({\n EntityName: 'MJ: Application Entities',\n ResultType: 'entity_object',\n OrderBy: 'ApplicationID, Sequence'\n });\n \n return result.Success ? result.Results : [];\n }\n \n private processApplicationEntities(appEntities: MJApplicationEntityEntity[]): void {\n this.appEntities.clear();\n \n for (const appEntity of appEntities) {\n const appId = appEntity.ApplicationID;\n if (!this.appEntities.has(appId)) {\n this.appEntities.set(appId, []);\n }\n this.appEntities.get(appId)!.push(appEntity);\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.applications];\n \n // Apply status filter - for now, all applications are considered active\n // In the future, we might add an IsActive field to the Applications table\n if (filters.status === 'inactive') {\n // Currently no way to determine inactive apps\n filtered = [];\n }\n \n // Apply search filter\n if (filters.search) {\n const searchLower = filters.search.toLowerCase();\n filtered = filtered.filter(app =>\n app.Name?.toLowerCase().includes(searchLower) ||\n app.Description?.toLowerCase().includes(searchLower)\n );\n }\n \n this.filteredApplications = filtered;\n this.cdr.detectChanges();\n }\n \n private calculateStats(): void {\n // For now, consider all applications as active\n const activeApps = this.applications;\n let totalEntities = 0;\n let publicEntities = 0;\n \n for (const [, entities] of this.appEntities) {\n totalEntities += entities.length;\n publicEntities += entities.filter(e => e.DefaultForNewUser).length;\n }\n \n this.stats = {\n totalApplications: this.applications.length,\n activeApplications: activeApps.length,\n totalEntities,\n publicEntities\n };\n }\n \n // Public methods for template\n public onSearchChange(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.updateFilter({ search: value });\n }\n \n public onStatusFilterChange(status: 'all' | 'active' | 'inactive'): void {\n this.updateFilter({ status });\n }\n \n public updateFilter(partial: Partial<FilterOptions>): void {\n this.filters$.next({\n ...this.filters$.value,\n ...partial\n });\n }\n \n public toggleAppExpansion(appId: string): void {\n this.expandedAppId = this.expandedAppId === appId ? null : appId;\n }\n \n public isAppExpanded(appId: string): boolean {\n return this.expandedAppId === appId;\n }\n \n public getAppEntities(appId: string): MJApplicationEntityEntity[] {\n return this.appEntities.get(appId) || [];\n }\n \n public getEntityInfo(entityId: string): any {\n return this.metadata.Entities.find(e => e.ID === entityId);\n }\n \n public createNewApplication(): void {\n this.applicationDialogData = {\n mode: 'create'\n };\n this.showApplicationDialog = true;\n }\n \n public editApplication(app: MJApplicationEntity): void {\n this.applicationDialogData = {\n application: app,\n mode: 'edit'\n };\n this.showApplicationDialog = true;\n }\n \n public confirmDeleteApplication(app: MJApplicationEntity): void {\n this.selectedApp = app;\n this.showDeleteConfirm = true;\n }\n \n public async deleteApplication(): Promise<void> {\n if (!this.selectedApp) return;\n \n try {\n this.isLoading = true;\n this.error = null;\n\n // Delete the application\n const deleteResult = await this.selectedApp.Delete();\n if (!deleteResult) {\n throw new Error(this.selectedApp.LatestResult?.Message || 'Failed to delete application');\n }\n\n this.showDeleteConfirm = false;\n this.selectedApp = null;\n await this.loadInitialData();\n } catch (error: unknown) {\n console.error('Error deleting application:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Failed to delete application';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n public onApplicationDialogResult(result: ApplicationDialogResult): void {\n this.showApplicationDialog = false;\n this.applicationDialogData = null;\n\n if (result.action === 'save') {\n // Refresh the application list after save\n this.loadInitialData();\n }\n }\n \n public getAppIcon(app: MJApplicationEntity): string {\n // Map application names to appropriate icons based on their purpose\n const name = (app.Name || '').toLowerCase();\n\n // Common application type mappings\n if (name.includes('admin') || name.includes('management')) {\n return 'fa-cog';\n }\n if (name.includes('report') || name.includes('analytics') || name.includes('dashboard')) {\n return 'fa-chart-line';\n }\n if (name.includes('user') || name.includes('people') || name.includes('employee')) {\n return 'fa-users';\n }\n if (name.includes('settings') || name.includes('config')) {\n return 'fa-sliders';\n }\n if (name.includes('data') || name.includes('database')) {\n return 'fa-database';\n }\n if (name.includes('file') || name.includes('document')) {\n return 'fa-file-alt';\n }\n if (name.includes('mail') || name.includes('email') || name.includes('message')) {\n return 'fa-envelope';\n }\n if (name.includes('search') || name.includes('explorer')) {\n return 'fa-search';\n }\n if (name.includes('calendar') || name.includes('schedule') || name.includes('event')) {\n return 'fa-calendar';\n }\n if (name.includes('security') || name.includes('auth') || name.includes('permission')) {\n return 'fa-shield-alt';\n }\n if (name.includes('integration') || name.includes('api') || name.includes('connect')) {\n return 'fa-plug';\n }\n if (name.includes('workflow') || name.includes('process') || name.includes('automation')) {\n return 'fa-project-diagram';\n }\n if (name.includes('ai') || name.includes('intelligence') || name.includes('machine')) {\n return 'fa-brain';\n }\n if (name.includes('home') || name.includes('main') || name.includes('default')) {\n return 'fa-home';\n }\n\n // Default icon for applications\n return 'fa-grid-2';\n }\n \n public getAppStatusClass(app: MJApplicationEntity): string {\n // For now, all apps are considered active\n return 'status-active';\n }\n \n public getAppStatusLabel(app: MJApplicationEntity): string {\n // For now, all apps are considered active\n return 'Active';\n }\n \n public refreshData(): void {\n this.loadInitialData();\n }\n}","<div class=\"application-management-container\">\n <!-- Sticky Header Section -->\n <div class=\"sticky-header\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\" role=\"toolbar\" aria-label=\"Application management actions\">\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-icon-mobile\"\n (click)=\"refreshData()\"\n [disabled]=\"isLoading\"\n aria-label=\"Refresh applications\"\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 class=\"mj-btn mj-btn-primary mj-btn-icon-mobile\" (click)=\"createNewApplication()\" aria-label=\"Add new application\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Add Application</span>\n </button>\n </div>\n\n <!-- Stats Cards -->\n <div class=\"mj-grid-4\" role=\"region\" aria-label=\"Application statistics\">\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-total\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total applications count\">{{ stats.totalApplications }}</div>\n <div class=\"stat-label\">Total Applications</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 applications count\">{{ stats.activeApplications }}</div>\n <div class=\"stat-label\">Active Applications</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-entities\" 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\">\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 </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\" role=\"search\" aria-label=\"Filter applications\">\n <div class=\"filters-row\">\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 applications by name or description...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.search\"\n aria-label=\"Search applications\"\n />\n </div>\n\n <!-- Status Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" id=\"status-filter-label\">Status</label>\n <div class=\"mj-filter-buttons\" role=\"group\" aria-labelledby=\"status-filter-label\">\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'all'\"\n (click)=\"onStatusFilterChange('all')\"\n [attr.aria-pressed]=\"filters$.value.status === 'all'\"\n >\n All\n </button>\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'active'\"\n (click)=\"onStatusFilterChange('active')\"\n [attr.aria-pressed]=\"filters$.value.status === 'active'\"\n >\n Active\n </button>\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'inactive'\"\n (click)=\"onStatusFilterChange('inactive')\"\n [attr.aria-pressed]=\"filters$.value.status === 'inactive'\"\n >\n Inactive\n </button>\n </div>\n </div>\n </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\">\n <mj-loading text=\"Loading applications...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\" role=\"alert\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\" aria-hidden=\"true\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"mj-btn mj-btn-primary\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\"></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=\"applications-list\" role=\"list\">\n @for (app of filteredApplications; track app.ID) {\n <div class=\"app-card\" [class.expanded]=\"isAppExpanded(app.ID)\" role=\"listitem\">\n <div class=\"app-header\" (click)=\"toggleAppExpansion(app.ID)\" role=\"button\" [attr.aria-expanded]=\"isAppExpanded(app.ID)\">\n <div class=\"app-info\">\n <div class=\"app-icon-wrapper\">\n <i [class]=\"'fa-solid ' + getAppIcon(app)\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"app-details\">\n <h3 class=\"app-name\">{{ app.Name }}</h3>\n <p class=\"app-description\">{{ app.Description || 'No description available' }}</p>\n </div>\n </div>\n\n <div class=\"app-meta\">\n <span class=\"status-badge\" [class]=\"getAppStatusClass(app)\">\n {{ getAppStatusLabel(app) }}\n </span>\n <div class=\"app-actions\" (click)=\"$event.stopPropagation()\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"editApplication(app)\"\n title=\"Edit\"\n [attr.aria-label]=\"'Edit ' + app.Name\"\n >\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"confirmDeleteApplication(app)\"\n title=\"Delete\"\n [attr.aria-label]=\"'Delete ' + app.Name\"\n >\n <i class=\"fa-solid fa-trash\"></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 (isAppExpanded(app.ID)) {\n <div class=\"app-content\">\n <!-- Mobile-only actions bar -->\n <div class=\"mobile-actions-bar\" (click)=\"$event.stopPropagation()\">\n <span class=\"status-badge\" [class]=\"getAppStatusClass(app)\">\n {{ getAppStatusLabel(app) }}\n </span>\n <div class=\"mobile-action-buttons\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"editApplication(app)\"\n title=\"Edit\"\n [attr.aria-label]=\"'Edit ' + app.Name\"\n >\n <i class=\"fa-solid fa-edit\"></i>\n <span class=\"btn-label\">Edit</span>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"confirmDeleteApplication(app)\"\n title=\"Delete\"\n [attr.aria-label]=\"'Delete ' + app.Name\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n <span class=\"btn-label\">Delete</span>\n </button>\n </div>\n </div>\n\n <div class=\"app-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Entities:</span>\n <span class=\"stat-value\">{{ getAppEntities(app.ID).length }}</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\">{{ app.__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\">{{ app.__mj_UpdatedAt | date:'short' }}</span>\n </div>\n </div>\n\n <div class=\"entities-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n Application Entities\n </h4>\n\n @if (getAppEntities(app.ID).length > 0) {\n <div class=\"entities-grid\">\n @for (appEntity of getAppEntities(app.ID); track appEntity.ID) {\n @if (getEntityInfo(appEntity.EntityID); as entity) {\n <div class=\"entity-item\">\n <div class=\"entity-name\">{{ entity.Name }}</div>\n <div class=\"entity-meta\">\n @if (appEntity.DefaultForNewUser) {\n <span class=\"entity-badge public\">Public</span>\n }\n <span class=\"entity-sequence\">Order: {{ appEntity.Sequence }}</span>\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <p class=\"no-entities\">No entities configured for this application</p>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (filteredApplications.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cubes empty-icon\" aria-hidden=\"true\"></i>\n <p class=\"empty-text\">No applications found</p>\n <p class=\"empty-subtext\">Try adjusting your filters or create a new application</p>\n </div>\n }\n </div>\n </div>\n }\n </div><!-- End Scrollable Content -->\n\n <!-- Application Dialog -->\n <mj-application-dialog\n [visible]=\"showApplicationDialog\"\n [data]=\"applicationDialogData\"\n (result)=\"onApplicationDialogResult($event)\"\n ></mj-application-dialog>\n\n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm && selectedApp) {\n <div class=\"modal-backdrop\" (click)=\"showDeleteConfirm = false\" role=\"presentation\">\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-description\"\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-description\">\n <p>Are you sure you want to delete the application <strong>{{ selectedApp.Name }}</strong>?</p>\n <p class=\"text-warning\">\n <i class=\"fa-solid fa-warning\" aria-hidden=\"true\"></i>\n This will remove all entity associations for this application.\n </p>\n </div>\n <div class=\"modal-footer\">\n <!-- Primary action (Delete) on LEFT per MD3 design guide -->\n <button class=\"mj-btn mj-btn-danger\" (click)=\"deleteApplication()\" [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 Application\n }\n </button>\n <button class=\"mj-btn mj-btn-secondary\" (click)=\"showDeleteConfirm = false\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"application-management.component.js","sourceRoot":"","sources":["../../../src/lib/application-management/application-management.component.ts","../../../src/lib/application-management/application-management.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectorRef, Component, NgZone, OnDestroy } from '@angular/core';\nimport { Subject, BehaviorSubject } from 'rxjs';\nimport { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { RunView, Metadata } from '@memberjunction/core';\nimport { MJApplicationEntity, MJApplicationEntityEntity, ResourceData } from '@memberjunction/core-entities';\nimport { BaseDashboard } from '@memberjunction/ng-shared';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { ApplicationDialogData, ApplicationDialogResult } from './application-dialog/application-dialog.component';\n\ninterface AppStats {\n totalApplications: number;\n activeApplications: number;\n totalEntities: number;\n publicEntities: number;\n}\n\ninterface FilterOptions {\n status: 'all' | 'active' | 'inactive';\n search: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-application-management',\n templateUrl: './application-management.component.html',\n styleUrls: ['../shared/styles/_admin-patterns.css', './application-management.component.css']\n})\n@RegisterClass(BaseDashboard, 'ApplicationManagement')\nexport class ApplicationManagementComponent extends BaseDashboard implements OnDestroy {\n // State management\n public applications: MJApplicationEntity[] = [];\n public filteredApplications: MJApplicationEntity[] = [];\n public selectedApp: MJApplicationEntity | null = null;\n public isLoading = false;\n public error: string | null = null;\n\n // Application entities mapping\n public appEntities: Map<string, MJApplicationEntityEntity[]> = new Map();\n\n // Stats\n public stats: AppStats = {\n totalApplications: 0,\n activeApplications: 0,\n totalEntities: 0,\n publicEntities: 0\n };\n\n // Filters\n public filters$ = new BehaviorSubject<FilterOptions>({\n status: 'all',\n search: ''\n });\n\n // UI State\n public showApplicationDialog = false;\n public applicationDialogData: ApplicationDialogData | null = null;\n public showDeleteConfirm = false;\n public expandedAppId: string | null = null;\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 \"Application 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 applications and their entities\n const [apps, appEntities] = await Promise.all([\n this.loadApplications(),\n this.loadApplicationEntities()\n ]);\n \n this.applications = apps;\n this.processApplicationEntities(appEntities);\n this.calculateStats();\n this.applyFilters();\n \n } catch (error) {\n console.error('Error loading application data:', error);\n this.error = 'Failed to load application 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 loadApplications(): Promise<MJApplicationEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJApplicationEntity>({\n EntityName: 'MJ: Applications',\n ResultType: 'entity_object',\n OrderBy: 'Name ASC'\n });\n \n return result.Success ? result.Results : [];\n }\n \n private async loadApplicationEntities(): Promise<MJApplicationEntityEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView<MJApplicationEntityEntity>({\n EntityName: 'MJ: Application Entities',\n ResultType: 'entity_object',\n OrderBy: 'ApplicationID, Sequence'\n });\n \n return result.Success ? result.Results : [];\n }\n \n private processApplicationEntities(appEntities: MJApplicationEntityEntity[]): void {\n this.appEntities.clear();\n \n for (const appEntity of appEntities) {\n const appId = appEntity.ApplicationID;\n if (!this.appEntities.has(appId)) {\n this.appEntities.set(appId, []);\n }\n this.appEntities.get(appId)!.push(appEntity);\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.applications];\n \n // Apply status filter - for now, all applications are considered active\n // In the future, we might add an IsActive field to the Applications table\n if (filters.status === 'inactive') {\n // Currently no way to determine inactive apps\n filtered = [];\n }\n \n // Apply search filter\n if (filters.search) {\n const searchLower = filters.search.toLowerCase();\n filtered = filtered.filter(app =>\n app.Name?.toLowerCase().includes(searchLower) ||\n app.Description?.toLowerCase().includes(searchLower)\n );\n }\n \n this.filteredApplications = filtered;\n this.cdr.detectChanges();\n }\n \n private calculateStats(): void {\n // For now, consider all applications as active\n const activeApps = this.applications;\n let totalEntities = 0;\n let publicEntities = 0;\n \n for (const [, entities] of this.appEntities) {\n totalEntities += entities.length;\n publicEntities += entities.filter(e => e.DefaultForNewUser).length;\n }\n \n this.stats = {\n totalApplications: this.applications.length,\n activeApplications: activeApps.length,\n totalEntities,\n publicEntities\n };\n }\n \n // Public methods for template\n public onSearchChange(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.updateFilter({ search: value });\n }\n \n public onStatusFilterChange(status: 'all' | 'active' | 'inactive'): void {\n this.updateFilter({ status });\n }\n \n public updateFilter(partial: Partial<FilterOptions>): void {\n this.filters$.next({\n ...this.filters$.value,\n ...partial\n });\n }\n \n public toggleAppExpansion(appId: string): void {\n this.expandedAppId = this.expandedAppId === appId ? null : appId;\n }\n \n public isAppExpanded(appId: string): boolean {\n return this.expandedAppId === appId;\n }\n \n public getAppEntities(appId: string): MJApplicationEntityEntity[] {\n return this.appEntities.get(appId) || [];\n }\n \n public getEntityInfo(entityId: string): any {\n return this.metadata.Entities.find(e => UUIDsEqual(e.ID, entityId));\n }\n \n public createNewApplication(): void {\n this.applicationDialogData = {\n mode: 'create'\n };\n this.showApplicationDialog = true;\n }\n \n public editApplication(app: MJApplicationEntity): void {\n this.applicationDialogData = {\n application: app,\n mode: 'edit'\n };\n this.showApplicationDialog = true;\n }\n \n public confirmDeleteApplication(app: MJApplicationEntity): void {\n this.selectedApp = app;\n this.showDeleteConfirm = true;\n }\n \n public async deleteApplication(): Promise<void> {\n if (!this.selectedApp) return;\n \n try {\n this.isLoading = true;\n this.error = null;\n\n // Delete the application\n const deleteResult = await this.selectedApp.Delete();\n if (!deleteResult) {\n throw new Error(this.selectedApp.LatestResult?.Message || 'Failed to delete application');\n }\n\n this.showDeleteConfirm = false;\n this.selectedApp = null;\n await this.loadInitialData();\n } catch (error: unknown) {\n console.error('Error deleting application:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'Failed to delete application';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n public onApplicationDialogResult(result: ApplicationDialogResult): void {\n this.showApplicationDialog = false;\n this.applicationDialogData = null;\n\n if (result.action === 'save') {\n // Refresh the application list after save\n this.loadInitialData();\n }\n }\n \n public getAppIcon(app: MJApplicationEntity): string {\n // Map application names to appropriate icons based on their purpose\n const name = (app.Name || '').toLowerCase();\n\n // Common application type mappings\n if (name.includes('admin') || name.includes('management')) {\n return 'fa-cog';\n }\n if (name.includes('report') || name.includes('analytics') || name.includes('dashboard')) {\n return 'fa-chart-line';\n }\n if (name.includes('user') || name.includes('people') || name.includes('employee')) {\n return 'fa-users';\n }\n if (name.includes('settings') || name.includes('config')) {\n return 'fa-sliders';\n }\n if (name.includes('data') || name.includes('database')) {\n return 'fa-database';\n }\n if (name.includes('file') || name.includes('document')) {\n return 'fa-file-alt';\n }\n if (name.includes('mail') || name.includes('email') || name.includes('message')) {\n return 'fa-envelope';\n }\n if (name.includes('search') || name.includes('explorer')) {\n return 'fa-search';\n }\n if (name.includes('calendar') || name.includes('schedule') || name.includes('event')) {\n return 'fa-calendar';\n }\n if (name.includes('security') || name.includes('auth') || name.includes('permission')) {\n return 'fa-shield-alt';\n }\n if (name.includes('integration') || name.includes('api') || name.includes('connect')) {\n return 'fa-plug';\n }\n if (name.includes('workflow') || name.includes('process') || name.includes('automation')) {\n return 'fa-project-diagram';\n }\n if (name.includes('ai') || name.includes('intelligence') || name.includes('machine')) {\n return 'fa-brain';\n }\n if (name.includes('home') || name.includes('main') || name.includes('default')) {\n return 'fa-home';\n }\n\n // Default icon for applications\n return 'fa-grid-2';\n }\n \n public getAppStatusClass(app: MJApplicationEntity): string {\n // For now, all apps are considered active\n return 'status-active';\n }\n \n public getAppStatusLabel(app: MJApplicationEntity): string {\n // For now, all apps are considered active\n return 'Active';\n }\n \n public refreshData(): void {\n this.loadInitialData();\n }\n}","<div class=\"application-management-container\">\n <!-- Sticky Header Section -->\n <div class=\"sticky-header\">\n <!-- Action Buttons -->\n <div class=\"action-buttons\" role=\"toolbar\" aria-label=\"Application management actions\">\n <button\n class=\"mj-btn mj-btn-secondary mj-btn-icon-mobile\"\n (click)=\"refreshData()\"\n [disabled]=\"isLoading\"\n aria-label=\"Refresh applications\"\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 class=\"mj-btn mj-btn-primary mj-btn-icon-mobile\" (click)=\"createNewApplication()\" aria-label=\"Add new application\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"btn-text\">Add Application</span>\n </button>\n </div>\n\n <!-- Stats Cards -->\n <div class=\"mj-grid-4\" role=\"region\" aria-label=\"Application statistics\">\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-total\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-cubes\"></i>\n </div>\n <div class=\"stat-content\">\n <div class=\"stat-value\" aria-label=\"Total applications count\">{{ stats.totalApplications }}</div>\n <div class=\"stat-label\">Total Applications</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 applications count\">{{ stats.activeApplications }}</div>\n <div class=\"stat-label\">Active Applications</div>\n </div>\n </div>\n\n <div class=\"mj-card\">\n <div class=\"stat-icon stat-icon-entities\" 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\">\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 </div>\n\n <!-- Filters Section -->\n <div class=\"filters-section\" role=\"search\" aria-label=\"Filter applications\">\n <div class=\"filters-row\">\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 applications by name or description...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"filters$.value.search\"\n aria-label=\"Search applications\"\n />\n </div>\n\n <!-- Status Filter -->\n <div class=\"mj-filter-group\">\n <label class=\"mj-filter-label\" id=\"status-filter-label\">Status</label>\n <div class=\"mj-filter-buttons\" role=\"group\" aria-labelledby=\"status-filter-label\">\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'all'\"\n (click)=\"onStatusFilterChange('all')\"\n [attr.aria-pressed]=\"filters$.value.status === 'all'\"\n >\n All\n </button>\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'active'\"\n (click)=\"onStatusFilterChange('active')\"\n [attr.aria-pressed]=\"filters$.value.status === 'active'\"\n >\n Active\n </button>\n <button\n class=\"mj-btn mj-btn-ghost\"\n [class.mj-btn-primary]=\"filters$.value.status === 'inactive'\"\n (click)=\"onStatusFilterChange('inactive')\"\n [attr.aria-pressed]=\"filters$.value.status === 'inactive'\"\n >\n Inactive\n </button>\n </div>\n </div>\n </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\">\n <mj-loading text=\"Loading applications...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\" role=\"alert\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\" aria-hidden=\"true\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"mj-btn mj-btn-primary\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\"></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=\"applications-list\" role=\"list\">\n @for (app of filteredApplications; track app.ID) {\n <div class=\"app-card\" [class.expanded]=\"isAppExpanded(app.ID)\" role=\"listitem\">\n <div class=\"app-header\" (click)=\"toggleAppExpansion(app.ID)\" role=\"button\" [attr.aria-expanded]=\"isAppExpanded(app.ID)\">\n <div class=\"app-info\">\n <div class=\"app-icon-wrapper\">\n <i [class]=\"'fa-solid ' + getAppIcon(app)\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"app-details\">\n <h3 class=\"app-name\">{{ app.Name }}</h3>\n <p class=\"app-description\">{{ app.Description || 'No description available' }}</p>\n </div>\n </div>\n\n <div class=\"app-meta\">\n <span class=\"status-badge\" [class]=\"getAppStatusClass(app)\">\n {{ getAppStatusLabel(app) }}\n </span>\n <div class=\"app-actions\" (click)=\"$event.stopPropagation()\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"editApplication(app)\"\n title=\"Edit\"\n [attr.aria-label]=\"'Edit ' + app.Name\"\n >\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"confirmDeleteApplication(app)\"\n title=\"Delete\"\n [attr.aria-label]=\"'Delete ' + app.Name\"\n >\n <i class=\"fa-solid fa-trash\"></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 (isAppExpanded(app.ID)) {\n <div class=\"app-content\">\n <!-- Mobile-only actions bar -->\n <div class=\"mobile-actions-bar\" (click)=\"$event.stopPropagation()\">\n <span class=\"status-badge\" [class]=\"getAppStatusClass(app)\">\n {{ getAppStatusLabel(app) }}\n </span>\n <div class=\"mobile-action-buttons\">\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm\"\n (click)=\"editApplication(app)\"\n title=\"Edit\"\n [attr.aria-label]=\"'Edit ' + app.Name\"\n >\n <i class=\"fa-solid fa-edit\"></i>\n <span class=\"btn-label\">Edit</span>\n </button>\n <button\n class=\"mj-btn mj-btn-ghost mj-btn-sm mj-btn-danger\"\n (click)=\"confirmDeleteApplication(app)\"\n title=\"Delete\"\n [attr.aria-label]=\"'Delete ' + app.Name\"\n >\n <i class=\"fa-solid fa-trash\"></i>\n <span class=\"btn-label\">Delete</span>\n </button>\n </div>\n </div>\n\n <div class=\"app-stats\">\n <div class=\"stat-item\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n <span class=\"stat-label\">Entities:</span>\n <span class=\"stat-value\">{{ getAppEntities(app.ID).length }}</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\">{{ app.__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\">{{ app.__mj_UpdatedAt | date:'short' }}</span>\n </div>\n </div>\n\n <div class=\"entities-section\">\n <h4 class=\"section-title\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n Application Entities\n </h4>\n\n @if (getAppEntities(app.ID).length > 0) {\n <div class=\"entities-grid\">\n @for (appEntity of getAppEntities(app.ID); track appEntity.ID) {\n @if (getEntityInfo(appEntity.EntityID); as entity) {\n <div class=\"entity-item\">\n <div class=\"entity-name\">{{ entity.Name }}</div>\n <div class=\"entity-meta\">\n @if (appEntity.DefaultForNewUser) {\n <span class=\"entity-badge public\">Public</span>\n }\n <span class=\"entity-sequence\">Order: {{ appEntity.Sequence }}</span>\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <p class=\"no-entities\">No entities configured for this application</p>\n }\n </div>\n </div>\n }\n </div>\n }\n\n @if (filteredApplications.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-cubes empty-icon\" aria-hidden=\"true\"></i>\n <p class=\"empty-text\">No applications found</p>\n <p class=\"empty-subtext\">Try adjusting your filters or create a new application</p>\n </div>\n }\n </div>\n </div>\n }\n </div><!-- End Scrollable Content -->\n\n <!-- Application Dialog -->\n <mj-application-dialog\n [visible]=\"showApplicationDialog\"\n [data]=\"applicationDialogData\"\n (result)=\"onApplicationDialogResult($event)\"\n ></mj-application-dialog>\n\n <!-- Delete Confirmation Dialog -->\n @if (showDeleteConfirm && selectedApp) {\n <div class=\"modal-backdrop\" (click)=\"showDeleteConfirm = false\" role=\"presentation\">\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-description\"\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-description\">\n <p>Are you sure you want to delete the application <strong>{{ selectedApp.Name }}</strong>?</p>\n <p class=\"text-warning\">\n <i class=\"fa-solid fa-warning\" aria-hidden=\"true\"></i>\n This will remove all entity associations for this application.\n </p>\n </div>\n <div class=\"modal-footer\">\n <!-- Primary action (Delete) on LEFT per MD3 design guide -->\n <button class=\"mj-btn mj-btn-danger\" (click)=\"deleteApplication()\" [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 Application\n }\n </button>\n <button class=\"mj-btn mj-btn-secondary\" (click)=\"showDeleteConfirm = false\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n</div>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-settings.component.d.ts","sourceRoot":"","sources":["../../../src/lib/application-settings/application-settings.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG7E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;
|
|
1
|
+
{"version":3,"file":"application-settings.component.d.ts","sourceRoot":"","sources":["../../../src/lib/application-settings/application-settings.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG7E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;AAG1D;;GAEG;AACH,UAAU,aAAa;IACrB,GAAG,EAAE,eAAe,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAMa,4BAA6B,YAAW,MAAM;IAqBvD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,MAAM;IAtBhB,OAAO,EAAE,aAAa,EAAE,CAAM;IAG9B,UAAU,EAAE,aAAa,EAAE,CAAM;IAGjC,aAAa,EAAE,aAAa,EAAE,CAAM;IAEpC,SAAS,UAAS;IAClB,QAAQ,UAAS;IACjB,YAAY,SAAM;IAClB,cAAc,SAAM;IAGpB,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,eAAe,CAAM;gBAGnB,UAAU,EAAE,kBAAkB,EAC9B,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,MAAM;IAGlB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAUvE;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAOlC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlD;;OAEG;IACH,SAAS,IAAI,IAAI;IAMjB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAyB9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAOjC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAepC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAkBjC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAkBnC;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C3B;;OAEG;YACW,qBAAqB;IAgBnC;;OAEG;YACW,qBAAqB;IAmBnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;yCAhWzB,4BAA4B;2CAA5B,4BAA4B;CAmWxC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component } from '@angular/core';
|
|
2
2
|
import { Metadata, RunView, LogError, LogStatus } from '@memberjunction/core';
|
|
3
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
import * as i1 from "@memberjunction/ng-base-application";
|
|
5
6
|
import * as i2 from "@memberjunction/ng-shared";
|
|
@@ -263,7 +264,7 @@ export class ApplicationSettingsComponent {
|
|
|
263
264
|
BuildAppConfigItems(systemApps, userApps) {
|
|
264
265
|
const items = [];
|
|
265
266
|
for (const app of systemApps) {
|
|
266
|
-
const userApp = userApps.find(ua => ua.ApplicationID
|
|
267
|
+
const userApp = userApps.find(ua => UUIDsEqual(ua.ApplicationID, app.ID));
|
|
267
268
|
items.push({
|
|
268
269
|
App: app,
|
|
269
270
|
UserAppId: userApp?.ID || null,
|
|
@@ -525,5 +526,5 @@ export class ApplicationSettingsComponent {
|
|
|
525
526
|
type: Component,
|
|
526
527
|
args: [{ standalone: false, selector: 'mj-application-settings', template: "<div class=\"application-settings\">\n <h2 class=\"section-title\">Applications</h2>\n <p class=\"section-description\">Choose which applications appear in your app switcher and set their order</p>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading applications...\"></mj-loading>\n </div>\n }\n\n @if (ErrorMessage && !IsLoading) {\n <div class=\"message error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n }\n\n @if (SuccessMessage && !IsLoading) {\n <div class=\"message success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ SuccessMessage }}</span>\n </div>\n }\n\n @if (!IsLoading && !ErrorMessage) {\n <div class=\"app-config-layout\">\n <!-- Available Apps Panel -->\n <div class=\"app-panel available-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-grid-2\"></i>\n Available Applications\n </h3>\n <span class=\"panel-count\">{{ AvailableApps.length }}</span>\n </div>\n <div class=\"panel-content\">\n @if (AvailableApps.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>All applications are selected</span>\n </div>\n }\n @for (item of AvailableApps; track item.App.ID) {\n <div class=\"app-item\" (click)=\"AddApp(item)\">\n <div class=\"app-icon\">\n <i [class]=\"item.App.Icon || 'fa-solid fa-window-maximize'\"></i>\n </div>\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.App.Name }}</span>\n @if (item.App.Description) {\n <span class=\"app-desc\">{{ item.App.Description }}</span>\n }\n </div>\n <button\n class=\"app-action add-btn\"\n (click)=\"AddApp(item); $event.stopPropagation()\"\n title=\"Add to selected\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n\n <!-- Selected Apps Panel -->\n <div class=\"app-panel selected-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-star\"></i>\n Your Applications\n </h3>\n <span class=\"panel-count\">{{ ActiveApps.length }}</span>\n </div>\n <div class=\"panel-content\" (dragover)=\"OnDragOver($event)\">\n @if (ActiveApps.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <span>Add applications from the list</span>\n </div>\n }\n @for (item of ActiveApps; track item.App.ID; let i = $index; let first = $first; let last = $last) {\n <div\n class=\"app-item selected\"\n [class.drop-target]=\"IsDropTarget(i)\"\n [class.dirty]=\"item.IsDirty\"\n draggable=\"true\"\n (dragstart)=\"OnDragStart($event, item, i)\"\n (dragenter)=\"OnDragEnter($event, i)\"\n (dragend)=\"OnDragEnd()\"\n (drop)=\"OnDrop($event)\"\n >\n <div class=\"drag-handle\" title=\"Drag to reorder\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </div>\n <div class=\"app-icon\">\n <i [class]=\"item.App.Icon || 'fa-solid fa-window-maximize'\"></i>\n </div>\n <div class=\"app-info\">\n <span class=\"app-name\">{{ item.App.Name }}</span>\n <span class=\"app-sequence\">Position {{ i + 1 }}</span>\n </div>\n <div class=\"app-actions\">\n <button\n class=\"action-btn\"\n [disabled]=\"first\"\n (click)=\"MoveUp(item)\"\n title=\"Move up\"\n >\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button\n class=\"action-btn\"\n [disabled]=\"last\"\n (click)=\"MoveDown(item)\"\n title=\"Move down\"\n >\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button\n class=\"action-btn remove-btn\"\n (click)=\"RemoveApp(item)\"\n title=\"Remove\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"action-bar\">\n <button\n class=\"btn btn-secondary\"\n (click)=\"Reset()\"\n [disabled]=\"!HasChanges() || IsSaving\"\n >\n <i class=\"fa-solid fa-undo\"></i>\n Reset\n </button>\n <button\n class=\"btn btn-primary\"\n (click)=\"Save()\"\n [disabled]=\"!HasChanges() || IsSaving\"\n >\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n Save Changes\n }\n </button>\n </div>\n }\n</div>\n", styles: [".application-settings {\n padding: 0;\n}\n\n.section-title {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary, #1a1a1a);\n}\n\n.section-description {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #666);\n margin: 0 0 1.5rem 0;\n}\n\n.loading-container {\n display: flex;\n justify-content: center;\n padding: 3rem;\n}\n\n.message {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n border-radius: 8px;\n font-size: 0.875rem;\n margin-bottom: 1rem;\n}\n\n.message.error {\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n}\n\n.message.success {\n background-color: var(--mj-success-bg, #dcfce7);\n color: var(--mj-success-text, #16a34a);\n}\n\n.app-config-layout {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n margin-bottom: 1.5rem;\n}\n\n@media (max-width: 768px) {\n .app-config-layout {\n grid-template-columns: 1fr;\n }\n}\n\n.app-panel {\n background: var(--mj-surface-color, #fff);\n border: 1px solid var(--mj-border-color, #e5e7eb);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.25rem;\n background: var(--mj-surface-secondary, #f9fafb);\n border-bottom: 1px solid var(--mj-border-color, #e5e7eb);\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n font-weight: 600;\n margin: 0;\n color: var(--mj-text-primary, #1f2937);\n}\n\n.panel-title i {\n color: var(--mj-primary-color, #3b82f6);\n}\n\n.panel-count {\n background: var(--mj-primary-color, #3b82f6);\n color: white;\n font-size: 0.75rem;\n font-weight: 600;\n padding: 0.125rem 0.5rem;\n border-radius: 9999px;\n}\n\n.panel-content {\n padding: 0.5rem;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n color: var(--mj-text-secondary, #6b7280);\n text-align: center;\n}\n\n.empty-state i {\n font-size: 1.5rem;\n margin-bottom: 0.5rem;\n opacity: 0.5;\n}\n\n.app-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n border-radius: 8px;\n cursor: pointer;\n transition: background-color 0.15s ease;\n}\n\n.app-item:hover {\n background-color: var(--mj-hover-bg, #f3f4f6);\n}\n\n.app-item.selected {\n cursor: grab;\n}\n\n.app-item.selected:active {\n cursor: grabbing;\n}\n\n.app-item.drop-target {\n background-color: var(--mj-primary-light, #dbeafe);\n border: 2px dashed var(--mj-primary-color, #3b82f6);\n}\n\n.app-item.dirty {\n background-color: var(--mj-warning-bg-light, #fefce8);\n}\n\n.drag-handle {\n color: var(--mj-text-tertiary, #9ca3af);\n cursor: grab;\n padding: 0.25rem;\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.app-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n background: var(--mj-primary-light, #dbeafe);\n color: var(--mj-primary-color, #3b82f6);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.app-info {\n flex: 1;\n min-width: 0;\n}\n\n.app-name {\n display: block;\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-desc {\n display: block;\n font-size: 0.75rem;\n color: var(--mj-text-secondary, #6b7280);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-sequence {\n display: block;\n font-size: 0.75rem;\n color: var(--mj-text-tertiary, #9ca3af);\n}\n\n.app-action {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.add-btn {\n background: var(--mj-success-bg, #dcfce7);\n color: var(--mj-success-text, #16a34a);\n}\n\n.add-btn:hover {\n background: var(--mj-success-color, #16a34a);\n color: white;\n}\n\n.app-actions {\n display: flex;\n gap: 0.25rem;\n}\n\n.action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary, #6b7280);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.action-btn:hover:not(:disabled) {\n background: var(--mj-hover-bg, #f3f4f6);\n color: var(--mj-text-primary, #1f2937);\n}\n\n.action-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.action-btn.remove-btn:hover:not(:disabled) {\n background: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n}\n\n.action-bar {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding-top: 1rem;\n border-top: 1px solid var(--mj-border-color, #e5e7eb);\n}\n\n.btn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.625rem 1.25rem;\n border-radius: 8px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n border: none;\n}\n\n.btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: var(--mj-surface-secondary, #f3f4f6);\n color: var(--mj-text-primary, #1f2937);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-hover-bg, #e5e7eb);\n}\n\n.btn-primary {\n background: var(--mj-primary-color, #3b82f6);\n color: white;\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-primary-dark, #2563eb);\n}\n"] }]
|
|
527
528
|
}], () => [{ type: i1.ApplicationManager }, { type: i2.SharedService }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }], null); })();
|
|
528
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationSettingsComponent, { className: "ApplicationSettingsComponent", filePath: "src/lib/application-settings/application-settings.component.ts", lineNumber:
|
|
529
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationSettingsComponent, { className: "ApplicationSettingsComponent", filePath: "src/lib/application-settings/application-settings.component.ts", lineNumber: 31 }); })();
|
|
529
530
|
//# sourceMappingURL=application-settings.component.js.map
|