@memberjunction/ng-explorer-settings 5.42.0 → 5.44.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/__tests__/role-management-agent-context.test.d.ts +2 -0
- package/dist/__tests__/role-management-agent-context.test.d.ts.map +1 -0
- package/dist/__tests__/role-management-agent-context.test.js +107 -0
- package/dist/__tests__/role-management-agent-context.test.js.map +1 -0
- package/dist/__tests__/user-management-agent-context.test.d.ts +2 -0
- package/dist/__tests__/user-management-agent-context.test.d.ts.map +1 -0
- package/dist/__tests__/user-management-agent-context.test.js +134 -0
- package/dist/__tests__/user-management-agent-context.test.js.map +1 -0
- package/dist/lib/application-management/application-dialog/application-dialog.component.js +176 -200
- package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
- package/dist/lib/application-management/application-management.component.d.ts +7 -0
- package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-management.component.js +49 -39
- package/dist/lib/application-management/application-management.component.js.map +1 -1
- package/dist/lib/application-settings/application-settings.component.js +58 -70
- package/dist/lib/application-settings/application-settings.component.js.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts +10 -0
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.js +32 -16
- package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +32 -33
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
- package/dist/lib/module.d.ts +1 -1
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +13 -4
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.js +30 -35
- package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
- package/dist/lib/role-management/role-dialog/role-dialog.component.js +26 -46
- package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
- package/dist/lib/role-management/role-management-agent-context.d.ts +96 -0
- package/dist/lib/role-management/role-management-agent-context.d.ts.map +1 -0
- package/dist/lib/role-management/role-management-agent-context.js +85 -0
- package/dist/lib/role-management/role-management-agent-context.js.map +1 -0
- package/dist/lib/role-management/role-management.component.d.ts +32 -0
- package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
- package/dist/lib/role-management/role-management.component.js +236 -41
- package/dist/lib/role-management/role-management.component.js.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.js +151 -184
- package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
- package/dist/lib/user-app-config/user-app-config.component.js +80 -93
- package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
- package/dist/lib/user-management/user-dialog/user-dialog.component.js +20 -21
- package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
- package/dist/lib/user-management/user-management-agent-context.d.ts +107 -0
- package/dist/lib/user-management/user-management-agent-context.d.ts.map +1 -0
- package/dist/lib/user-management/user-management-agent-context.js +132 -0
- package/dist/lib/user-management/user-management-agent-context.js.map +1 -0
- package/dist/lib/user-management/user-management.component.d.ts +35 -0
- package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
- package/dist/lib/user-management/user-management.component.js +311 -71
- package/dist/lib/user-management/user-management.component.js.map +1 -1
- package/dist/lib/user-profile-settings/user-profile-settings.component.js +52 -70
- package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
- package/package.json +19 -19
|
@@ -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":"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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 { FilterFieldConfig } from '@memberjunction/ng-ui-components';\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 protected override destroy$ = new Subject<void>();\n private get metadata() { return this.ProviderToUse; }\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 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 // Discrete changes (chips) apply immediately. Text search still goes\n // through the 300ms debounce in setupFilterSubscription.\n if (!('search' in partial)) {\n this.applyFilters();\n this.cdr.markForCheck();\n }\n }\n\n // -- Concise chrome: one Filter popover (Status) + applied-filter chips -----\n\n public get filterFields(): FilterFieldConfig[] {\n return [\n {\n key: 'status',\n type: 'chips',\n label: 'Status',\n chipOptions: [\n { text: 'All', value: 'all' },\n { text: 'Active', value: 'active' },\n { text: 'Inactive', value: 'inactive' },\n ],\n },\n ];\n }\n\n public get filterValues(): Record<string, unknown> {\n return { status: this.filters$.value.status };\n }\n\n /** Total active filters (Status) — drives the Filter button badge. */\n public get TotalActiveFilterCount(): number {\n return this.filters$.value.status !== 'all' ? 1 : 0;\n }\n\n public onFilterPanelChange(values: Record<string, unknown>): void {\n if ('status' in values) {\n this.updateFilter({ status: (values['status'] as FilterOptions['status']) || 'all' });\n }\n }\n\n /** Clear all filters (Status); search persists. */\n public clearAllAppliedFilters(): void {\n this.updateFilter({ status: 'all' });\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}","<!--\n Interior chrome — see Section 10 of explorer-chrome-conventions.\n-->\n<mj-page-header-interior\n AriaLabel=\"Filter applications\"\n Title=\"Applications\"\n Subtitle=\"Configure applications and their entity associations\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2.\n Partition badges (entities/public) stay dropped — Active/Inactive\n chips in [toolbar] handle the partition signal. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredApplications.length\"\n [Total]=\"applications.length\"\n Label=\"applications\">\n </mj-stat-badge>\n </div>\n <div toolbar>\n <!-- Concise-chrome control bar: search · Filter. Status lives behind the\n one Filter button; applied filters show as removable chips below the\n card. On mobile the popover docks as a bottom sheet. -->\n <mj-page-search\n Placeholder=\"Search applications by name or description...\"\n [Value]=\"filters$.value.search\"\n (ValueChange)=\"updateFilter({ search: $event })\">\n </mj-page-search>\n <mj-filter-popover\n Label=\"Filters\"\n Icon=\"fa-solid fa-filter\"\n [ActiveCount]=\"TotalActiveFilterCount\"\n [ShowClearAll]=\"TotalActiveFilterCount > 0\"\n (ClearAllRequested)=\"clearAllAppliedFilters()\">\n <mj-filter-panel\n [Fields]=\"filterFields\"\n [Values]=\"filterValues\"\n (ValuesChange)=\"onFilterPanelChange($event)\"\n (Reset)=\"clearAllAppliedFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refreshData()\"></mj-refresh-button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewApplication()\" aria-label=\"Add new application\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"mj-action-label\">Add Application</span>\n </button>\n </div>\n</mj-page-header-interior>\n\n<!-- Scrollable Content Section — owned by <mj-page-body-interior>. -->\n<mj-page-body-interior>\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 mjButton variant=\"primary\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Applications List -->\n @if (!isLoading && !error) {\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 mjButton variant=\"flat\" size=\"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 mjButton variant=\"danger\" size=\"sm\"\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 mjButton variant=\"flat\" size=\"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 mjButton variant=\"danger\" size=\"sm\"\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 }\n </mj-page-body-interior>\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 mjButton variant=\"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 mjButton (click)=\"showDeleteConfirm = false\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\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 { FilterFieldConfig } from '@memberjunction/ng-ui-components';\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 protected override destroy$ = new Subject<void>();\n private get metadata() { return this.ProviderToUse; }\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 = RunView.FromMetadataProvider(this.ProviderToUse);\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 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 // Discrete changes (chips) apply immediately. Text search still goes\n // through the 300ms debounce in setupFilterSubscription.\n if (!('search' in partial)) {\n this.applyFilters();\n this.cdr.markForCheck();\n }\n }\n\n // -- Concise chrome: one Filter popover (Status) + applied-filter chips -----\n\n public get filterFields(): FilterFieldConfig[] {\n return [\n {\n key: 'status',\n type: 'chips',\n label: 'Status',\n chipOptions: [\n { text: 'All', value: 'all' },\n { text: 'Active', value: 'active' },\n { text: 'Inactive', value: 'inactive' },\n ],\n },\n ];\n }\n\n public get filterValues(): Record<string, unknown> {\n return { status: this.filters$.value.status };\n }\n\n /** Total active filters (Status) — drives the Filter button badge. */\n public get TotalActiveFilterCount(): number {\n return this.filters$.value.status !== 'all' ? 1 : 0;\n }\n\n public onFilterPanelChange(values: Record<string, unknown>): void {\n if ('status' in values) {\n this.updateFilter({ status: (values['status'] as FilterOptions['status']) || 'all' });\n }\n }\n\n /** Clear all filters (Status); search persists. */\n public clearAllAppliedFilters(): void {\n this.updateFilter({ status: 'all' });\n }\n\n /** True when search and/or panel filters are narrowing the list — gates the\n * no-results empty-state \"Reset filters\" CTA. */\n public get IsListNarrowed(): boolean {\n return this.filters$.value.search !== '' || this.TotalActiveFilterCount > 0;\n }\n\n /** Reset everything narrowing the list (search + Status) and refresh\n * immediately. Wired to the no-results empty-state CTA. Unlike\n * clearAllAppliedFilters(), this also clears the search box. */\n public resetAllFiltersAndSearch(): void {\n this.filters$.next({ status: 'all', search: '' });\n this.applyFilters();\n this.cdr.markForCheck();\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}","<!--\n Interior chrome — see Section 10 of explorer-chrome-conventions.\n-->\n<mj-page-header-interior\n AriaLabel=\"Filter applications\"\n Title=\"Applications\"\n Subtitle=\"Configure applications and their entity associations\">\n <!-- X-of-Y filtered count earns its meta spot per chrome conventions §2.\n Partition badges (entities/public) stay dropped — Active/Inactive\n chips in [toolbar] handle the partition signal. -->\n <div meta>\n <mj-stat-badge\n [Count]=\"filteredApplications.length\"\n [Total]=\"applications.length\"\n Label=\"applications\">\n </mj-stat-badge>\n </div>\n <div toolbar>\n <!-- Concise-chrome control bar: search · Filter. Status lives behind the\n one Filter button; applied filters show as removable chips below the\n card. On mobile the popover docks as a bottom sheet. -->\n <mj-page-search\n Placeholder=\"Search applications by name or description...\"\n [Value]=\"filters$.value.search\"\n (ValueChange)=\"updateFilter({ search: $event })\">\n </mj-page-search>\n <mj-filter-popover\n Label=\"Filters\"\n Icon=\"fa-solid fa-filter\"\n [ActiveCount]=\"TotalActiveFilterCount\"\n [ShowClearAll]=\"TotalActiveFilterCount > 0\"\n (ClearAllRequested)=\"clearAllAppliedFilters()\">\n <mj-filter-panel\n [Fields]=\"filterFields\"\n [Values]=\"filterValues\"\n (ValuesChange)=\"onFilterPanelChange($event)\"\n (Reset)=\"clearAllAppliedFilters()\">\n </mj-filter-panel>\n </mj-filter-popover>\n </div>\n <div actions>\n <mj-refresh-button [Loading]=\"isLoading\" (Clicked)=\"refreshData()\"></mj-refresh-button>\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewApplication()\" aria-label=\"Add new application\">\n <i class=\"fa-solid fa-plus\"></i> <span class=\"mj-action-label\">Add Application</span>\n </button>\n </div>\n</mj-page-header-interior>\n\n<!-- Scrollable Content Section — owned by <mj-page-body-interior>. -->\n<mj-page-body-interior>\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 mjButton variant=\"primary\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Applications List -->\n @if (!isLoading && !error) {\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 mjButton variant=\"flat\" size=\"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 mjButton variant=\"danger\" size=\"sm\"\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 mjButton variant=\"flat\" size=\"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 mjButton variant=\"danger\" size=\"sm\"\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 <mj-empty-state\n [Variant]=\"IsListNarrowed ? 'no-results' : 'empty'\"\n Icon=\"fa-solid fa-cubes\"\n Title=\"No applications found\"\n Message=\"Try adjusting your filters or create a new application\"\n [ActionText]=\"IsListNarrowed ? 'Reset filters' : ''\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n (Action)=\"resetAllFiltersAndSearch()\" />\n }\n </div>\n }\n </mj-page-body-interior>\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 <mj-alert Variant=\"warning\" Message=\"This will remove all entity associations for this application.\" />\n </div>\n <div class=\"modal-footer\">\n <!-- Primary action (Delete) on LEFT per MD3 design guide -->\n <button mjButton variant=\"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 mjButton (click)=\"showDeleteConfirm = false\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n"]}
|
|
@@ -14,36 +14,28 @@ function ApplicationSettingsComponent_Conditional_5_Template(rf, ctx) { if (rf &
|
|
|
14
14
|
i0.ɵɵelementEnd();
|
|
15
15
|
} }
|
|
16
16
|
function ApplicationSettingsComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
17
|
-
i0.ɵɵelementStart(0, "
|
|
18
|
-
i0.ɵɵ
|
|
19
|
-
i0.ɵɵ
|
|
20
|
-
i0.ɵɵtext(3);
|
|
21
|
-
i0.ɵɵelementEnd()();
|
|
17
|
+
i0.ɵɵelementStart(0, "mj-alert", 4);
|
|
18
|
+
i0.ɵɵtext(1);
|
|
19
|
+
i0.ɵɵelementEnd();
|
|
22
20
|
} if (rf & 2) {
|
|
23
21
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
24
|
-
i0.ɵɵadvance(
|
|
22
|
+
i0.ɵɵadvance();
|
|
25
23
|
i0.ɵɵtextInterpolate(ctx_r0.ErrorMessage);
|
|
26
24
|
} }
|
|
27
25
|
function ApplicationSettingsComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
-
i0.ɵɵelementStart(0, "
|
|
29
|
-
i0.ɵɵ
|
|
30
|
-
i0.ɵɵ
|
|
31
|
-
i0.ɵɵtext(3);
|
|
32
|
-
i0.ɵɵelementEnd()();
|
|
26
|
+
i0.ɵɵelementStart(0, "mj-alert", 5);
|
|
27
|
+
i0.ɵɵtext(1);
|
|
28
|
+
i0.ɵɵelementEnd();
|
|
33
29
|
} if (rf & 2) {
|
|
34
30
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
35
|
-
i0.ɵɵadvance(
|
|
31
|
+
i0.ɵɵadvance();
|
|
36
32
|
i0.ɵɵtextInterpolate(ctx_r0.SuccessMessage);
|
|
37
33
|
} }
|
|
38
34
|
function ApplicationSettingsComponent_Conditional_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
-
i0.ɵɵ
|
|
40
|
-
i0.ɵɵelement(1, "i", 8);
|
|
41
|
-
i0.ɵɵelementStart(2, "span");
|
|
42
|
-
i0.ɵɵtext(3, "All applications are selected");
|
|
43
|
-
i0.ɵɵelementEnd()();
|
|
35
|
+
i0.ɵɵelement(0, "mj-empty-state", 14);
|
|
44
36
|
} }
|
|
45
37
|
function ApplicationSettingsComponent_Conditional_8_For_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
46
|
-
i0.ɵɵelementStart(0, "span",
|
|
38
|
+
i0.ɵɵelementStart(0, "span", 29);
|
|
47
39
|
i0.ɵɵtext(1);
|
|
48
40
|
i0.ɵɵelementEnd();
|
|
49
41
|
} if (rf & 2) {
|
|
@@ -53,19 +45,19 @@ function ApplicationSettingsComponent_Conditional_8_For_11_Conditional_6_Templat
|
|
|
53
45
|
} }
|
|
54
46
|
function ApplicationSettingsComponent_Conditional_8_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
55
47
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
56
|
-
i0.ɵɵelementStart(0, "div",
|
|
48
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
57
49
|
i0.ɵɵlistener("click", function ApplicationSettingsComponent_Conditional_8_For_11_Template_div_click_0_listener() { const item_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.AddApp(item_r4)); });
|
|
58
|
-
i0.ɵɵelementStart(1, "div",
|
|
50
|
+
i0.ɵɵelementStart(1, "div", 26);
|
|
59
51
|
i0.ɵɵelement(2, "i");
|
|
60
52
|
i0.ɵɵelementEnd();
|
|
61
|
-
i0.ɵɵelementStart(3, "div",
|
|
53
|
+
i0.ɵɵelementStart(3, "div", 27)(4, "span", 28);
|
|
62
54
|
i0.ɵɵtext(5);
|
|
63
55
|
i0.ɵɵelementEnd();
|
|
64
|
-
i0.ɵɵconditionalCreate(6, ApplicationSettingsComponent_Conditional_8_For_11_Conditional_6_Template, 2, 1, "span",
|
|
56
|
+
i0.ɵɵconditionalCreate(6, ApplicationSettingsComponent_Conditional_8_For_11_Conditional_6_Template, 2, 1, "span", 29);
|
|
65
57
|
i0.ɵɵelementEnd();
|
|
66
|
-
i0.ɵɵelementStart(7, "button",
|
|
58
|
+
i0.ɵɵelementStart(7, "button", 30);
|
|
67
59
|
i0.ɵɵlistener("click", function ApplicationSettingsComponent_Conditional_8_For_11_Template_button_click_7_listener($event) { const item_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); ctx_r0.AddApp(item_r4); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
68
|
-
i0.ɵɵelement(8, "i",
|
|
60
|
+
i0.ɵɵelement(8, "i", 31);
|
|
69
61
|
i0.ɵɵelementEnd()();
|
|
70
62
|
} if (rf & 2) {
|
|
71
63
|
const item_r4 = ctx.$implicit;
|
|
@@ -77,96 +69,92 @@ function ApplicationSettingsComponent_Conditional_8_For_11_Template(rf, ctx) { i
|
|
|
77
69
|
i0.ɵɵconditional(item_r4.App.Description ? 6 : -1);
|
|
78
70
|
} }
|
|
79
71
|
function ApplicationSettingsComponent_Conditional_8_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
80
|
-
i0.ɵɵ
|
|
81
|
-
i0.ɵɵelement(1, "i", 33);
|
|
82
|
-
i0.ɵɵelementStart(2, "span");
|
|
83
|
-
i0.ɵɵtext(3, "Add applications from the list");
|
|
84
|
-
i0.ɵɵelementEnd()();
|
|
72
|
+
i0.ɵɵelement(0, "mj-empty-state", 19);
|
|
85
73
|
} }
|
|
86
74
|
function ApplicationSettingsComponent_Conditional_8_For_22_Template(rf, ctx) { if (rf & 1) {
|
|
87
75
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
88
|
-
i0.ɵɵelementStart(0, "div",
|
|
89
|
-
i0.ɵɵlistener("dragstart", function ApplicationSettingsComponent_Conditional_8_For_22_Template_div_dragstart_0_listener($event) { const ctx_r5 = i0.ɵɵrestoreView(_r5); const item_r7 = ctx_r5.$implicit; const ɵ$
|
|
90
|
-
i0.ɵɵelementStart(1, "div",
|
|
91
|
-
i0.ɵɵelement(2, "i",
|
|
76
|
+
i0.ɵɵelementStart(0, "div", 32);
|
|
77
|
+
i0.ɵɵlistener("dragstart", function ApplicationSettingsComponent_Conditional_8_For_22_Template_div_dragstart_0_listener($event) { const ctx_r5 = i0.ɵɵrestoreView(_r5); const item_r7 = ctx_r5.$implicit; const ɵ$index_79_r8 = ctx_r5.$index; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDragStart($event, item_r7, ɵ$index_79_r8)); })("dragenter", function ApplicationSettingsComponent_Conditional_8_For_22_Template_div_dragenter_0_listener($event) { const ɵ$index_79_r8 = i0.ɵɵrestoreView(_r5).$index; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDragEnter($event, ɵ$index_79_r8)); })("dragend", function ApplicationSettingsComponent_Conditional_8_For_22_Template_div_dragend_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDragEnd()); })("drop", function ApplicationSettingsComponent_Conditional_8_For_22_Template_div_drop_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnDrop($event)); });
|
|
78
|
+
i0.ɵɵelementStart(1, "div", 33);
|
|
79
|
+
i0.ɵɵelement(2, "i", 34);
|
|
92
80
|
i0.ɵɵelementEnd();
|
|
93
|
-
i0.ɵɵelementStart(3, "div",
|
|
81
|
+
i0.ɵɵelementStart(3, "div", 26);
|
|
94
82
|
i0.ɵɵelement(4, "i");
|
|
95
83
|
i0.ɵɵelementEnd();
|
|
96
|
-
i0.ɵɵelementStart(5, "div",
|
|
84
|
+
i0.ɵɵelementStart(5, "div", 27)(6, "span", 28);
|
|
97
85
|
i0.ɵɵtext(7);
|
|
98
86
|
i0.ɵɵelementEnd();
|
|
99
|
-
i0.ɵɵelementStart(8, "span",
|
|
87
|
+
i0.ɵɵelementStart(8, "span", 35);
|
|
100
88
|
i0.ɵɵtext(9);
|
|
101
89
|
i0.ɵɵelementEnd()();
|
|
102
|
-
i0.ɵɵelementStart(10, "div",
|
|
90
|
+
i0.ɵɵelementStart(10, "div", 36)(11, "button", 37);
|
|
103
91
|
i0.ɵɵlistener("click", function ApplicationSettingsComponent_Conditional_8_For_22_Template_button_click_11_listener() { const item_r7 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.MoveUp(item_r7)); });
|
|
104
|
-
i0.ɵɵelement(12, "i",
|
|
92
|
+
i0.ɵɵelement(12, "i", 38);
|
|
105
93
|
i0.ɵɵelementEnd();
|
|
106
|
-
i0.ɵɵelementStart(13, "button",
|
|
94
|
+
i0.ɵɵelementStart(13, "button", 39);
|
|
107
95
|
i0.ɵɵlistener("click", function ApplicationSettingsComponent_Conditional_8_For_22_Template_button_click_13_listener() { const item_r7 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.MoveDown(item_r7)); });
|
|
108
|
-
i0.ɵɵelement(14, "i",
|
|
96
|
+
i0.ɵɵelement(14, "i", 40);
|
|
109
97
|
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementStart(15, "button",
|
|
98
|
+
i0.ɵɵelementStart(15, "button", 41);
|
|
111
99
|
i0.ɵɵlistener("click", function ApplicationSettingsComponent_Conditional_8_For_22_Template_button_click_15_listener() { const item_r7 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.RemoveApp(item_r7)); });
|
|
112
|
-
i0.ɵɵelement(16, "i",
|
|
100
|
+
i0.ɵɵelement(16, "i", 42);
|
|
113
101
|
i0.ɵɵelementEnd()()();
|
|
114
102
|
} if (rf & 2) {
|
|
115
103
|
const item_r7 = ctx.$implicit;
|
|
116
|
-
const ɵ$
|
|
117
|
-
const ɵ$
|
|
104
|
+
const ɵ$index_79_r8 = ctx.$index;
|
|
105
|
+
const ɵ$count_79_r9 = ctx.$count;
|
|
118
106
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
119
|
-
i0.ɵɵclassProp("drop-target", ctx_r0.IsDropTarget(ɵ$
|
|
107
|
+
i0.ɵɵclassProp("drop-target", ctx_r0.IsDropTarget(ɵ$index_79_r8))("dirty", item_r7.IsDirty);
|
|
120
108
|
i0.ɵɵadvance(4);
|
|
121
109
|
i0.ɵɵclassMap(item_r7.App.Icon || "fa-solid fa-window-maximize");
|
|
122
110
|
i0.ɵɵadvance(3);
|
|
123
111
|
i0.ɵɵtextInterpolate(item_r7.App.Name);
|
|
124
112
|
i0.ɵɵadvance(2);
|
|
125
|
-
i0.ɵɵtextInterpolate1("Position ", ɵ$
|
|
113
|
+
i0.ɵɵtextInterpolate1("Position ", ɵ$index_79_r8 + 1);
|
|
126
114
|
i0.ɵɵadvance(2);
|
|
127
|
-
i0.ɵɵproperty("disabled", ɵ$
|
|
115
|
+
i0.ɵɵproperty("disabled", ɵ$index_79_r8 === 0);
|
|
128
116
|
i0.ɵɵadvance(2);
|
|
129
|
-
i0.ɵɵproperty("disabled", ɵ$
|
|
117
|
+
i0.ɵɵproperty("disabled", ɵ$index_79_r8 === ɵ$count_79_r9 - 1);
|
|
130
118
|
} }
|
|
131
119
|
function ApplicationSettingsComponent_Conditional_8_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
132
|
-
i0.ɵɵelement(0, "i",
|
|
120
|
+
i0.ɵɵelement(0, "i", 43);
|
|
133
121
|
i0.ɵɵtext(1, " Saving... ");
|
|
134
122
|
} }
|
|
135
123
|
function ApplicationSettingsComponent_Conditional_8_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
136
|
-
i0.ɵɵelement(0, "i",
|
|
124
|
+
i0.ɵɵelement(0, "i", 44);
|
|
137
125
|
i0.ɵɵtext(1, " Save Changes ");
|
|
138
126
|
} }
|
|
139
127
|
function ApplicationSettingsComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
140
128
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
141
|
-
i0.ɵɵelementStart(0, "div",
|
|
142
|
-
i0.ɵɵelement(4, "i",
|
|
129
|
+
i0.ɵɵelementStart(0, "div", 7)(1, "div", 8)(2, "div", 9)(3, "h3", 10);
|
|
130
|
+
i0.ɵɵelement(4, "i", 11);
|
|
143
131
|
i0.ɵɵtext(5, " Available Applications ");
|
|
144
132
|
i0.ɵɵelementEnd();
|
|
145
|
-
i0.ɵɵelementStart(6, "span",
|
|
133
|
+
i0.ɵɵelementStart(6, "span", 12);
|
|
146
134
|
i0.ɵɵtext(7);
|
|
147
135
|
i0.ɵɵelementEnd()();
|
|
148
|
-
i0.ɵɵelementStart(8, "div",
|
|
149
|
-
i0.ɵɵconditionalCreate(9, ApplicationSettingsComponent_Conditional_8_Conditional_9_Template,
|
|
150
|
-
i0.ɵɵrepeaterCreate(10, ApplicationSettingsComponent_Conditional_8_For_11_Template, 9, 4, "div",
|
|
136
|
+
i0.ɵɵelementStart(8, "div", 13);
|
|
137
|
+
i0.ɵɵconditionalCreate(9, ApplicationSettingsComponent_Conditional_8_Conditional_9_Template, 1, 0, "mj-empty-state", 14);
|
|
138
|
+
i0.ɵɵrepeaterCreate(10, ApplicationSettingsComponent_Conditional_8_For_11_Template, 9, 4, "div", 15, _forTrack0);
|
|
151
139
|
i0.ɵɵelementEnd()();
|
|
152
|
-
i0.ɵɵelementStart(12, "div",
|
|
153
|
-
i0.ɵɵelement(15, "i",
|
|
140
|
+
i0.ɵɵelementStart(12, "div", 16)(13, "div", 9)(14, "h3", 10);
|
|
141
|
+
i0.ɵɵelement(15, "i", 17);
|
|
154
142
|
i0.ɵɵtext(16, " Your Applications ");
|
|
155
143
|
i0.ɵɵelementEnd();
|
|
156
|
-
i0.ɵɵelementStart(17, "span",
|
|
144
|
+
i0.ɵɵelementStart(17, "span", 12);
|
|
157
145
|
i0.ɵɵtext(18);
|
|
158
146
|
i0.ɵɵelementEnd()();
|
|
159
|
-
i0.ɵɵelementStart(19, "div",
|
|
147
|
+
i0.ɵɵelementStart(19, "div", 18);
|
|
160
148
|
i0.ɵɵlistener("dragover", function ApplicationSettingsComponent_Conditional_8_Template_div_dragover_19_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnDragOver($event)); });
|
|
161
|
-
i0.ɵɵconditionalCreate(20, ApplicationSettingsComponent_Conditional_8_Conditional_20_Template,
|
|
162
|
-
i0.ɵɵrepeaterCreate(21, ApplicationSettingsComponent_Conditional_8_For_22_Template, 17, 10, "div",
|
|
149
|
+
i0.ɵɵconditionalCreate(20, ApplicationSettingsComponent_Conditional_8_Conditional_20_Template, 1, 0, "mj-empty-state", 19);
|
|
150
|
+
i0.ɵɵrepeaterCreate(21, ApplicationSettingsComponent_Conditional_8_For_22_Template, 17, 10, "div", 20, _forTrack0);
|
|
163
151
|
i0.ɵɵelementEnd()()();
|
|
164
|
-
i0.ɵɵelementStart(23, "div",
|
|
152
|
+
i0.ɵɵelementStart(23, "div", 21)(24, "button", 22);
|
|
165
153
|
i0.ɵɵlistener("click", function ApplicationSettingsComponent_Conditional_8_Template_button_click_24_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Reset()); });
|
|
166
|
-
i0.ɵɵelement(25, "i",
|
|
154
|
+
i0.ɵɵelement(25, "i", 23);
|
|
167
155
|
i0.ɵɵtext(26, " Reset ");
|
|
168
156
|
i0.ɵɵelementEnd();
|
|
169
|
-
i0.ɵɵelementStart(27, "button",
|
|
157
|
+
i0.ɵɵelementStart(27, "button", 24);
|
|
170
158
|
i0.ɵɵlistener("click", function ApplicationSettingsComponent_Conditional_8_Template_button_click_27_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Save()); });
|
|
171
159
|
i0.ɵɵconditionalCreate(28, ApplicationSettingsComponent_Conditional_8_Conditional_28_Template, 2, 0)(29, ApplicationSettingsComponent_Conditional_8_Conditional_29_Template, 2, 0);
|
|
172
160
|
i0.ɵɵelementEnd()();
|
|
@@ -502,7 +490,7 @@ export class ApplicationSettingsComponent extends BaseAngularComponent {
|
|
|
502
490
|
return this.dropTargetIndex === index;
|
|
503
491
|
}
|
|
504
492
|
static ɵfac = function ApplicationSettingsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ApplicationSettingsComponent)(i0.ɵɵdirectiveInject(i1.ApplicationManager), i0.ɵɵdirectiveInject(i2.SharedService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); };
|
|
505
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationSettingsComponent, selectors: [["mj-application-settings"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 4, consts: [[1, "application-settings"], [1, "section-title"], [1, "section-description"], [1, "loading-container"], [
|
|
493
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationSettingsComponent, selectors: [["mj-application-settings"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 4, consts: [[1, "application-settings"], [1, "section-title"], [1, "section-description"], [1, "loading-container"], ["Variant", "error"], ["Variant", "success"], ["text", "Loading applications..."], [1, "app-config-layout"], [1, "app-panel", "available-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-grid-2"], [1, "panel-count"], [1, "panel-content"], ["Size", "compact", "Icon", "fa-solid fa-circle-check", "Title", "All applications are selected"], [1, "app-item"], [1, "app-panel", "selected-panel"], [1, "fa-solid", "fa-star"], [1, "panel-content", 3, "dragover"], ["Size", "compact", "Icon", "fa-solid fa-arrow-left", "Title", "Add applications from the list"], ["draggable", "true", 1, "app-item", "selected", 3, "drop-target", "dirty"], [1, "action-bar"], [1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-undo"], [1, "btn", "btn-primary", 3, "click", "disabled"], [1, "app-item", 3, "click"], [1, "app-icon"], [1, "app-info"], [1, "app-name"], [1, "app-desc"], ["title", "Add to selected", 1, "app-action", "add-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["draggable", "true", 1, "app-item", "selected", 3, "dragstart", "dragenter", "dragend", "drop"], ["title", "Drag to reorder", 1, "drag-handle"], [1, "fa-solid", "fa-grip-vertical"], [1, "app-sequence"], [1, "app-actions"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Move up", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Move down", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Remove", 3, "click"], [1, "fa-solid", "fa-times"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-save"]], template: function ApplicationSettingsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
506
494
|
i0.ɵɵelementStart(0, "div", 0)(1, "h2", 1);
|
|
507
495
|
i0.ɵɵtext(2, "Applications");
|
|
508
496
|
i0.ɵɵelementEnd();
|
|
@@ -510,8 +498,8 @@ export class ApplicationSettingsComponent extends BaseAngularComponent {
|
|
|
510
498
|
i0.ɵɵtext(4, "Choose which applications appear in your app switcher and set their order");
|
|
511
499
|
i0.ɵɵelementEnd();
|
|
512
500
|
i0.ɵɵconditionalCreate(5, ApplicationSettingsComponent_Conditional_5_Template, 2, 0, "div", 3);
|
|
513
|
-
i0.ɵɵconditionalCreate(6, ApplicationSettingsComponent_Conditional_6_Template,
|
|
514
|
-
i0.ɵɵconditionalCreate(7, ApplicationSettingsComponent_Conditional_7_Template,
|
|
501
|
+
i0.ɵɵconditionalCreate(6, ApplicationSettingsComponent_Conditional_6_Template, 2, 1, "mj-alert", 4);
|
|
502
|
+
i0.ɵɵconditionalCreate(7, ApplicationSettingsComponent_Conditional_7_Template, 2, 1, "mj-alert", 5);
|
|
515
503
|
i0.ɵɵconditionalCreate(8, ApplicationSettingsComponent_Conditional_8_Template, 30, 7);
|
|
516
504
|
i0.ɵɵelementEnd();
|
|
517
505
|
} if (rf & 2) {
|
|
@@ -523,11 +511,11 @@ export class ApplicationSettingsComponent extends BaseAngularComponent {
|
|
|
523
511
|
i0.ɵɵconditional(ctx.SuccessMessage && !ctx.IsLoading ? 7 : -1);
|
|
524
512
|
i0.ɵɵadvance();
|
|
525
513
|
i0.ɵɵconditional(!ctx.IsLoading && !ctx.ErrorMessage ? 8 : -1);
|
|
526
|
-
} }, dependencies: [i3.LoadingComponent, i4.MJButtonDirective], styles: [".application-settings[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.section-title[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary);\n}\n\n.section-description[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n color: var(--mj-text-secondary);\n margin: 0 0 1.5rem 0;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 3rem;\n}\n\n
|
|
514
|
+
} }, dependencies: [i3.LoadingComponent, i4.MJButtonDirective, i4.MJEmptyStateComponent, i4.MJAlertComponent], styles: [".application-settings[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.section-title[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary);\n}\n\n.section-description[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n color: var(--mj-text-secondary);\n margin: 0 0 1.5rem 0;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 3rem;\n}\n\n\n.app-config-layout[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n.app-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 1rem 1.25rem;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.panel-title[_ngcontent-%COMP%] {\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);\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.panel-count[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\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[_ngcontent-%COMP%] {\n padding: 0.5rem;\n max-height: 400px;\n overflow-y: auto;\n}\n\n.app-item[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.app-item.selected[_ngcontent-%COMP%] {\n cursor: grab;\n}\n\n.app-item.selected[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.app-item.drop-target[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 2px dashed var(--mj-brand-primary);\n}\n\n.app-item.dirty[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n cursor: grab;\n padding: 0.25rem;\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.app-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.app-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.app-name[_ngcontent-%COMP%] {\n display: block;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-desc[_ngcontent-%COMP%] {\n display: block;\n font-size: 0.75rem;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.app-sequence[_ngcontent-%COMP%] {\n display: block;\n font-size: 0.75rem;\n color: var(--mj-text-disabled);\n}\n\n.app-action[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.add-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-success);\n color: white;\n}\n\n.app-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n}\n\n.action-btn[_ngcontent-%COMP%] {\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);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.action-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.action-btn.remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.action-bar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding-top: 1rem;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.btn[_ngcontent-%COMP%] {\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[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-border-default);\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: white;\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n}"] });
|
|
527
515
|
}
|
|
528
516
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ApplicationSettingsComponent, [{
|
|
529
517
|
type: Component,
|
|
530
|
-
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 mjButton\n variant=\"flat\"\n size=\"sm\"\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 mjButton\n variant=\"flat\"\n size=\"sm\"\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 mjButton\n variant=\"danger\"\n size=\"sm\"\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);\n}\n\n.section-description {\n font-size: 0.875rem;\n color: var(--mj-text-secondary);\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: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.message.success {\n background-color: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\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-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\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);\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.panel-count {\n background: var(--mj-brand-primary);\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);\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-bg-surface-sunken);\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: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 2px dashed var(--mj-brand-primary);\n}\n\n.app-item.dirty {\n background-color: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.drag-handle {\n color: var(--mj-text-disabled);\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: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\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);\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);\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-disabled);\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: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.add-btn:hover {\n background: var(--mj-status-success);\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);\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-bg-surface-sunken);\n color: var(--mj-text-primary);\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: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\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-default);\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-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-border-default);\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: white;\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n}\n"] }]
|
|
518
|
+
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 <mj-alert Variant=\"error\">{{ ErrorMessage }}</mj-alert>\n }\n\n @if (SuccessMessage && !IsLoading) {\n <mj-alert Variant=\"success\">{{ SuccessMessage }}</mj-alert>\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 <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-circle-check\"\n Title=\"All applications are selected\" />\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 <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-arrow-left\"\n Title=\"Add applications from the list\" />\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 mjButton\n variant=\"flat\"\n size=\"sm\"\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 mjButton\n variant=\"flat\"\n size=\"sm\"\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 mjButton\n variant=\"danger\"\n size=\"sm\"\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);\n}\n\n.section-description {\n font-size: 0.875rem;\n color: var(--mj-text-secondary);\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\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-bg-surface-card);\n border: 1px solid var(--mj-border-default);\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-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\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);\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.panel-count {\n background: var(--mj-brand-primary);\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.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-bg-surface-sunken);\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: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 2px dashed var(--mj-brand-primary);\n}\n\n.app-item.dirty {\n background-color: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n}\n\n.drag-handle {\n color: var(--mj-text-disabled);\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: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\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);\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);\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-disabled);\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: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.add-btn:hover {\n background: var(--mj-status-success);\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);\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-bg-surface-sunken);\n color: var(--mj-text-primary);\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: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n color: var(--mj-status-error);\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-default);\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-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-border-default);\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: white;\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n}\n"] }]
|
|
531
519
|
}], () => [{ type: i1.ApplicationManager }, { type: i2.SharedService }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }], null); })();
|
|
532
520
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationSettingsComponent, { className: "ApplicationSettingsComponent", filePath: "src/lib/application-settings/application-settings.component.ts", lineNumber: 32 }); })();
|
|
533
521
|
//# sourceMappingURL=application-settings.component.js.map
|