cloud-ide-layout 1.0.297 → 1.0.299

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (15) hide show
  1. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-DgwU-sCr.mjs → cloud-ide-layout-cloud-ide-layout-HmeFdi-u.mjs} +11 -6
  2. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-DgwU-sCr.mjs.map → cloud-ide-layout-cloud-ide-layout-HmeFdi-u.mjs.map} +1 -1
  3. package/fesm2022/cloud-ide-layout-dashboard-manager.component-KTWusuWF.mjs +706 -0
  4. package/fesm2022/cloud-ide-layout-dashboard-manager.component-KTWusuWF.mjs.map +1 -0
  5. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BWSMDvLy.mjs → cloud-ide-layout-drawer-theme.component-pfhoTzJt.mjs} +2 -2
  6. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BWSMDvLy.mjs.map → cloud-ide-layout-drawer-theme.component-pfhoTzJt.mjs.map} +1 -1
  7. package/fesm2022/{cloud-ide-layout-home-wrapper.component-CH7LlO1x.mjs → cloud-ide-layout-home-wrapper.component-DyFnB93U.mjs} +2 -2
  8. package/fesm2022/{cloud-ide-layout-home-wrapper.component-CH7LlO1x.mjs.map → cloud-ide-layout-home-wrapper.component-DyFnB93U.mjs.map} +1 -1
  9. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-DVj6eU3V.mjs → cloud-ide-layout-sidedrawer-notes.component-Sb7czuvE.mjs} +2 -2
  10. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-DVj6eU3V.mjs.map → cloud-ide-layout-sidedrawer-notes.component-Sb7czuvE.mjs.map} +1 -1
  11. package/fesm2022/cloud-ide-layout.mjs +1 -1
  12. package/index.d.ts +1 -1
  13. package/package.json +1 -1
  14. package/fesm2022/cloud-ide-layout-dashboard-manager.component-CHthRoQj.mjs +0 -653
  15. package/fesm2022/cloud-ide-layout-dashboard-manager.component-CHthRoQj.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-ide-layout-dashboard-manager.component-KTWusuWF.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/components/dashboard-manager/dashboard-card-form.component.ts","../../../projects/cloud-ide-layout/src/lib/components/dashboard-manager/dashboard-manager.component.ts"],"sourcesContent":["import { Component, OnInit, inject, signal, computed, input, output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n CideEleButtonComponent,\r\n CideInputComponent,\r\n CideSelectComponent,\r\n NotificationService\r\n} from 'cloud-ide-element';\r\nimport {\r\n CoreDashboardCards,\r\n DashboardCardsSaveUpdatePayload\r\n} from 'cloud-ide-lms-model';\r\nimport { DashboardCardsService } from '../../services/dashboard-cards.service';\r\nimport { CideEleFloatingContainerService } from 'cloud-ide-element';\r\n\r\ninterface ApiEndpoint {\r\n endpoint: string;\r\n method: string;\r\n description: string;\r\n category: string;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-lyt-dashboard-card-form',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n CideEleButtonComponent,\r\n CideInputComponent,\r\n CideSelectComponent\r\n ],\r\n template: `\r\n <div class=\"tw-p-4 tw-space-y-4\">\r\n <form (ngSubmit)=\"saveCard()\" class=\"tw-space-y-4\">\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Title</label>\r\n <cide-ele-input\r\n [(ngModel)]=\"cardForm.title\"\r\n [name]=\"'title'\"\r\n [required]=\"true\"\r\n [placeholder]=\"'Enter card title'\">\r\n </cide-ele-input>\r\n </div>\r\n \r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Type</label>\r\n <cide-ele-select\r\n [ngModel]=\"cardForm.type || 'custom'\"\r\n (ngModelChange)=\"onTypeChange($event)\"\r\n [options]=\"cardTypes\"\r\n [required]=\"true\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Description</label>\r\n <cide-ele-input\r\n [(ngModel)]=\"cardForm.description\"\r\n [name]=\"'description'\"\r\n [type]=\"'text'\"\r\n [placeholder]=\"'Enter card description'\">\r\n </cide-ele-input>\r\n </div>\r\n\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">API Endpoint</label>\r\n <cide-ele-select\r\n [ngModel]=\"cardForm.apiEndpoint\"\r\n (ngModelChange)=\"onApiEndpointChange($event)\"\r\n [options]=\"apiEndpointsOptions()\"\r\n [placeholder]=\"'Select API endpoint'\">\r\n </cide-ele-select>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Icon</label>\r\n <cide-ele-input\r\n [(ngModel)]=\"cardForm.icon\"\r\n [name]=\"'icon'\"\r\n [placeholder]=\"'e.g., dashboard, analytics'\">\r\n </cide-ele-input>\r\n </div>\r\n \r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Color</label>\r\n <cide-ele-input\r\n [(ngModel)]=\"cardForm.color\"\r\n [name]=\"'color'\"\r\n [type]=\"'text'\"\r\n [placeholder]=\"'#3B82F6'\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-grid tw-grid-cols-4 tw-gap-4\">\r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Row</label>\r\n <cide-ele-input\r\n [(ngModel)]=\"cardForm.position.row\"\r\n [name]=\"'row'\"\r\n [type]=\"'number'\"\r\n [min]=\"1\">\r\n </cide-ele-input>\r\n </div>\r\n \r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Col</label>\r\n <cide-ele-input\r\n [(ngModel)]=\"cardForm.position.col\"\r\n [name]=\"'col'\"\r\n [type]=\"'number'\"\r\n [min]=\"1\">\r\n </cide-ele-input>\r\n </div>\r\n \r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Col Span</label>\r\n <cide-ele-input\r\n [(ngModel)]=\"cardForm.position.colspan\"\r\n [name]=\"'colspan'\"\r\n [type]=\"'number'\"\r\n [min]=\"1\"\r\n [max]=\"12\">\r\n </cide-ele-input>\r\n </div>\r\n \r\n <div>\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-mb-1\">Row Span</label>\r\n <cide-ele-input\r\n [(ngModel)]=\"cardForm.position.rowspan\"\r\n [name]=\"'rowspan'\"\r\n [type]=\"'number'\"\r\n [min]=\"1\">\r\n </cide-ele-input>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tw-flex tw-gap-2 tw-pt-4 tw-justify-end\">\r\n <cide-ele-button\r\n [label]=\"'Cancel'\"\r\n variant=\"secondary\"\r\n (click)=\"closeForm()\">\r\n </cide-ele-button>\r\n <cide-ele-button\r\n [label]=\"'Save'\"\r\n variant=\"primary\"\r\n [type]=\"'submit'\"\r\n [loading]=\"saving()\">\r\n </cide-ele-button>\r\n </div>\r\n </form>\r\n </div>\r\n `\r\n})\r\nexport class DashboardCardFormComponent implements OnInit {\r\n // Inputs from floating container config\r\n containerId = input<string>('');\r\n editCardData = input<CoreDashboardCards | null>(null);\r\n\r\n // Outputs\r\n saved = output<void>();\r\n cancelled = output<void>();\r\n\r\n protected dashboardCardsService = inject(DashboardCardsService);\r\n protected notificationService = inject(NotificationService);\r\n protected floatingContainerService = inject(CideEleFloatingContainerService);\r\n\r\n saving = signal(false);\r\n apiEndpoints = signal<ApiEndpoint[]>([]);\r\n\r\n cardTypes = [\r\n { value: 'stats', label: 'Stats' },\r\n { value: 'chart', label: 'Chart' },\r\n { value: 'table', label: 'Table' },\r\n { value: 'module-card', label: 'Module Card' },\r\n { value: 'activity-feed', label: 'Activity Feed' },\r\n { value: 'events', label: 'Events' },\r\n { value: 'custom', label: 'Custom' }\r\n ];\r\n\r\n cardForm = {\r\n title: '',\r\n description: '',\r\n type: 'custom' as CoreDashboardCards['cdc_type'],\r\n apiEndpoint: '',\r\n icon: '',\r\n color: '#3B82F6',\r\n position: {\r\n row: 1,\r\n col: 1,\r\n colspan: 1,\r\n rowspan: 1\r\n }\r\n };\r\n\r\n apiEndpointsOptions = computed(() => {\r\n return this.apiEndpoints().map(api => ({\r\n value: api.endpoint,\r\n label: `${api.method} ${api.endpoint} - ${api.description}`\r\n }));\r\n });\r\n\r\n ngOnInit(): void {\r\n this.loadApiEndpoints();\r\n\r\n // Initialize form if editing\r\n const card = this.editCardData();\r\n if (card) {\r\n this.cardForm = {\r\n title: card.cdc_title || '',\r\n description: card.cdc_description || '',\r\n type: card.cdc_type || 'custom',\r\n apiEndpoint: card.cdc_api_endpoint || '',\r\n icon: card.cdc_icon || '',\r\n color: card.cdc_color || '#3B82F6',\r\n position: card.cdc_position && typeof card.cdc_position === 'object' &&\r\n 'row' in card.cdc_position && 'col' in card.cdc_position &&\r\n 'colspan' in card.cdc_position && 'rowspan' in card.cdc_position\r\n ? {\r\n row: card.cdc_position.row || 1,\r\n col: card.cdc_position.col || 1,\r\n colspan: card.cdc_position.colspan || 1,\r\n rowspan: card.cdc_position.rowspan || 1\r\n }\r\n : {\r\n row: 1,\r\n col: 1,\r\n colspan: 1,\r\n rowspan: 1\r\n }\r\n };\r\n }\r\n }\r\n\r\n loadApiEndpoints(): void {\r\n this.dashboardCardsService.getApiList().subscribe({\r\n next: (response) => {\r\n if (response.success && response.data) {\r\n this.apiEndpoints.set(response.data as ApiEndpoint[]);\r\n }\r\n },\r\n error: (error) => {\r\n console.error('Error loading API endpoints:', error);\r\n }\r\n });\r\n }\r\n\r\n saveCard(): void {\r\n this.saving.set(true);\r\n const card = this.editCardData();\r\n\r\n const payload: DashboardCardsSaveUpdatePayload = {\r\n core_dashboard_cards: {\r\n _id: card?._id,\r\n cdc_title: this.cardForm.title,\r\n cdc_description: this.cardForm.description,\r\n cdc_type: this.cardForm.type,\r\n cdc_api_endpoint: this.cardForm.apiEndpoint,\r\n cdc_icon: this.cardForm.icon,\r\n cdc_color: this.cardForm.color,\r\n cdc_position: this.cardForm.position,\r\n cdc_visible: true,\r\n cdc_draggable: true\r\n }\r\n };\r\n\r\n this.dashboardCardsService.saveUpdateDashboardCard(payload).subscribe({\r\n next: (response) => {\r\n if (response.success) {\r\n this.notificationService.success(\r\n card ? 'Card updated successfully' : 'Card created successfully'\r\n );\r\n this.saved.emit();\r\n this.closeForm();\r\n } else {\r\n this.notificationService.error(response.message || 'Error saving card');\r\n }\r\n this.saving.set(false);\r\n },\r\n error: (error) => {\r\n console.error('Error saving card:', error);\r\n this.notificationService.error('Error saving card');\r\n this.saving.set(false);\r\n }\r\n });\r\n }\r\n\r\n closeForm(): void {\r\n const id = this.containerId();\r\n if (id) {\r\n this.floatingContainerService.hide(id);\r\n }\r\n this.cancelled.emit();\r\n }\r\n\r\n onTypeChange(value: string | number | string[]): void {\r\n this.cardForm.type = value as CoreDashboardCards['cdc_type'];\r\n }\r\n\r\n onApiEndpointChange(value: string | number | string[]): void {\r\n this.cardForm.apiEndpoint = String(value);\r\n }\r\n}\r\n","import { Component, OnInit, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CideLytSharedWrapperComponent } from '../../layout/shared/shared-wrapper/shared-wrapper.component';\nimport { DashboardCardsService } from '../../services/dashboard-cards.service';\nimport {\n CoreDashboardCards,\n DashboardCardsListResponse,\n DashboardCardsSaveUpdatePayload\n} from 'cloud-ide-lms-model';\nimport {\n CideEleDataGridComponent,\n CideEleButtonComponent,\n NotificationService,\n ConfirmationService,\n GridEvent,\n GridConfiguration,\n GridColumn,\n CideEleFloatingContainerService\n} from 'cloud-ide-element';\nimport { DashboardCardFormComponent } from './dashboard-card-form.component';\n\n@Component({\n selector: 'cide-lyt-dashboard-manager',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n CideLytSharedWrapperComponent,\n CideEleDataGridComponent,\n CideEleButtonComponent\n ],\n template: `\n <cide-lyt-shared-wrapper [shared_wrapper_setup_param]=\"shared_wrapper_setup_param\">\n <div class=\"tw-p-4 tw-space-y-4\">\n <div breadcrumb-actions>\n <cide-ele-button\n [label]=\"'Add New Card'\"\n leftIcon=\"add\"\n (click)=\"openAddCardModal()\"\n variant=\"primary\"\n size=\"xs\"\n [adaptive]=\"true\">\n </cide-ele-button>\n </div>\n\n <!-- Cards Grid -->\n <cide-ele-data-grid\n [config]=\"gridConfig()\"\n (gridEvent)=\"onGridEvent($event)\">\n </cide-ele-data-grid>\n </div>\n </cide-lyt-shared-wrapper>\n `\n})\nexport class DashboardManagerComponent implements OnInit {\n protected dashboardCardsService = inject(DashboardCardsService);\n protected notificationService = inject(NotificationService);\n protected confirmationService = inject(ConfirmationService);\n protected floatingContainerService = inject(CideEleFloatingContainerService);\n\n shared_wrapper_setup_param = {\n sypg_page_code: \"cide_lyt_dashboard_manager\"\n };\n\n cardsList = signal<CoreDashboardCards[]>([]);\n loading = signal(false);\n\n constructor() {\n this.floatingContainerService.registerComponent('dashboard-card-form', DashboardCardFormComponent);\n }\n\n gridConfig = computed<GridConfiguration<CoreDashboardCards>>(() => ({\n id: 'dashboard-cards-grid',\n columns: [\n {\n key: 'cdc_title',\n header: 'Title',\n type: 'text',\n sortable: true\n },\n {\n key: 'cdc_type',\n header: 'Type',\n type: 'text',\n sortable: true\n },\n {\n key: 'cdc_api_endpoint',\n header: 'API Endpoint',\n type: 'text'\n },\n {\n key: 'cdc_visible',\n header: 'Visible',\n type: 'status',\n statusConfig: {\n activeValue: true,\n activeLabel: 'Visible',\n inactiveLabel: 'Hidden',\n activeClass: 'tw-bg-green-100 tw-text-green-800',\n inactiveClass: 'tw-bg-gray-100 tw-text-gray-800'\n }\n },\n {\n key: 'actions',\n header: 'Actions',\n type: 'actions',\n actions: [\n {\n key: 'edit',\n label: 'Edit',\n icon: 'edit',\n variant: 'primary',\n onClick: 'edit'\n },\n {\n key: 'delete',\n label: 'Delete',\n icon: 'delete',\n variant: 'danger',\n onClick: 'delete'\n },\n {\n key: 'toggle',\n label: 'Toggle Visibility',\n icon: 'visibility',\n variant: 'outline',\n onClick: 'toggle'\n }\n ]\n }\n ] as GridColumn[],\n data: this.cardsList(),\n pagination: {\n enabled: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search cards...',\n searchableColumns: ['cdc_title', 'cdc_type', 'cdc_api_endpoint']\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n responsive: true,\n striped: false,\n bordered: true,\n compact: true\n }));\n\n ngOnInit(): void {\n this.loadCards();\n }\n\n loadCards(): void {\n this.loading.set(true);\n this.dashboardCardsService.getDashboardCardsList({}).subscribe({\n next: (response) => {\n if (response.success && response.data) {\n // Map DashboardCardsListResponse to CoreDashboardCards\n const mappedCards: CoreDashboardCards[] = response.data.map((card: DashboardCardsListResponse) => ({\n ...card,\n cdc_entity_id_syen: card.cdc_entity_id_syen?._id || card.cdc_entity_id_syen,\n cdc_created_by_user: card.cdc_created_by_user?._id || card.cdc_created_by_user,\n cdc_modified_by_user: card.cdc_modified_by_user?._id || card.cdc_modified_by_user\n } as CoreDashboardCards));\n this.cardsList.set(mappedCards);\n }\n this.loading.set(false);\n },\n error: (error) => {\n console.error('Error loading cards:', error);\n this.notificationService.error('Error loading dashboard cards');\n this.loading.set(false);\n }\n });\n }\n\n openAddCardModal(): void {\n const containerId = 'dashboard-card-create';\n this.floatingContainerService.show({\n id: containerId,\n title: 'Create Dashboard Card',\n icon: 'add_card',\n width: '800px',\n height: 'auto',\n componentId: 'dashboard-card-form',\n componentConfig: {\n inputs: {\n containerId: signal(containerId),\n editCardData: signal(null)\n },\n outputs: {\n saved: () => {\n this.loadCards();\n this.floatingContainerService.hide(containerId);\n },\n cancelled: () => this.floatingContainerService.hide(containerId)\n }\n }\n });\n }\n\n editCard(card: CoreDashboardCards): void {\n const containerId = `dashboard-card-edit-${card._id}`;\n this.floatingContainerService.show({\n id: containerId,\n title: `Edit Card: ${card.cdc_title}`,\n icon: 'edit',\n width: '800px',\n height: 'auto',\n componentId: 'dashboard-card-form',\n componentConfig: {\n inputs: {\n containerId: signal(containerId),\n editCardData: signal(card)\n },\n outputs: {\n saved: () => {\n this.loadCards();\n this.floatingContainerService.hide(containerId);\n },\n cancelled: () => this.floatingContainerService.hide(containerId)\n }\n }\n });\n }\n\n deleteCard(card: CoreDashboardCards): void {\n if (!card._id) return;\n\n this.confirmationService.ask({\n title: 'Delete Card',\n message: `Are you sure you want to delete \"\\${card.cdc_title}\"?`,\n type: 'danger',\n icon: 'delete_forever',\n confirmText: 'Delete',\n cancelText: 'Cancel'\n }).then((confirmed) => {\n if (confirmed) {\n this.dashboardCardsService.deleteDashboardCard(card._id!).subscribe({\n next: (response) => {\n if (response.success) {\n this.notificationService.success('Card deleted successfully');\n this.loadCards();\n } else {\n this.notificationService.error(response.message || 'Error deleting card');\n }\n },\n error: (error) => {\n console.error('Error deleting card:', error);\n this.notificationService.error('Error deleting card');\n }\n });\n }\n });\n }\n\n toggleVisibility(card: CoreDashboardCards): void {\n const payload: DashboardCardsSaveUpdatePayload = {\n core_dashboard_cards: {\n _id: card._id,\n cdc_visible: !card.cdc_visible\n }\n };\n\n this.dashboardCardsService.saveUpdateDashboardCard(payload).subscribe({\n next: (response) => {\n if (response.success) {\n this.loadCards();\n }\n },\n error: (error) => {\n console.error('Error toggling visibility:', error);\n this.notificationService.error('Error updating card');\n }\n });\n }\n\n onGridEvent(event: GridEvent<CoreDashboardCards>): void {\n if (event.type === 'action' && event.action) {\n const card = event.data as CoreDashboardCards;\n\n if (event.action.key === 'edit') {\n this.editCard(card);\n } else if (event.action.key === 'delete') {\n this.deleteCard(card);\n } else if (event.action.key === 'toggle') {\n this.toggleVisibility(card);\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { inject, PLATFORM_ID, Inject, Component } from '@angular/core';
4
4
  import * as i1 from '@angular/forms';
5
5
  import { FormsModule } from '@angular/forms';
6
6
  import { CideSelectComponent, CideEleButtonComponent } from 'cloud-ide-element';
7
- import { A as AppStateHelperService, s as setCSSVariable, c as CideLytThemeService } from './cloud-ide-layout-cloud-ide-layout-DgwU-sCr.mjs';
7
+ import { A as AppStateHelperService, s as setCSSVariable, c as CideLytThemeService } from './cloud-ide-layout-cloud-ide-layout-HmeFdi-u.mjs';
8
8
  import { cloneDeep, isEqual } from 'lodash-es';
9
9
 
10
10
  class CideLytDrawerThemeComponent {
@@ -343,4 +343,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
343
343
  }] }] });
344
344
 
345
345
  export { CideLytDrawerThemeComponent };
346
- //# sourceMappingURL=cloud-ide-layout-drawer-theme.component-BWSMDvLy.mjs.map
346
+ //# sourceMappingURL=cloud-ide-layout-drawer-theme.component-pfhoTzJt.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-ide-layout-drawer-theme.component-BWSMDvLy.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.ts","../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.html"],"sourcesContent":["import { NgFor, NgIf } from '@angular/common';\nimport { NgClass } from '@angular/common';\nimport { Component, OnInit, PLATFORM_ID, Inject, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CideSelectComponent, SelectOption, CideEleButtonComponent } from 'cloud-ide-element';\nimport { CideLytThemeService, Theme, setCSSVariable } from '../../../services/theme/theme.service';\nimport type { MSystemThemeUserPreferencesRequest, SystemThemesListControllerRespoonse, SystemThemeUserPreferencesControllerRespoonse } from 'cloud-ide-lms-model';\nimport type { SystemThemeControllerRespoonse } from 'cloud-ide-lms-model';\nimport type { ICoreSyth, ICoreSyoth, ICoreSyupth } from 'cloud-ide-lms-model';\nimport { isEqual, cloneDeep } from 'lodash-es';\nimport { AppStateHelperService } from '../../../services/app-state';\n\ninterface ThemeColor {\n label: string;\n varName: string;\n value: string;\n}\n\ninterface TypographySetting {\n label: string;\n varName: string;\n value: string;\n type: 'number' | 'text';\n min?: number;\n max?: number;\n step?: number;\n}\n\ntype ThemeGroup = {\n label: string;\n items: Array<{\n label: string;\n varName: string;\n value: string;\n type: 'number' | 'text';\n min?: number;\n max?: number;\n step?: number;\n }>;\n};\n\n@Component({\n selector: 'cide-lyt-drawer-theme',\n standalone: true,\n imports: [FormsModule, NgFor, NgIf, NgClass, CideSelectComponent, CideEleButtonComponent],\n templateUrl: './drawer-theme.component.html',\n styleUrl: './drawer-theme.component.scss'\n})\nexport class CideLytDrawerThemeComponent implements OnInit {\n private readonly appState = inject(AppStateHelperService);\n // Preset themes\n presetThemes: { value: string, label: string, theme: ICoreSyth }[] = [];\n selectedTheme = '';\n isLoadingThemes = false;\n themeLoadError = '';\n mergedTheme: { [key: string]: string } = {};\n isRTL = false;\n originalThemeGroupValues: ThemeGroup[] = [];\n originalApiThemeValues: { [key: string]: string } = {}; // Store original API values\n\n themeGroups: ThemeGroup[] = [\n {\n label: 'Brand Colors',\n items: [\n { label: 'Primary', varName: '--cide-theme-color-brand-primary', value: '#4f46e5', type: 'text' },\n { label: 'Accent', varName: '--cide-theme-color-brand-accent', value: '#4338ca', type: 'text' },\n { label: 'Separator', varName: '--cide-theme-color-brand-separator', value: '#e5e7eb', type: 'text' }\n ]\n },\n {\n label: 'Text Colors',\n items: [\n { label: 'Body Text', varName: '--cide-theme-color-text-body', value: '#374151', type: 'text' },\n { label: 'Heading Text', varName: '--cide-theme-color-text-heading', value: '#111827', type: 'text' },\n { label: 'Link Text', varName: '--cide-theme-color-text-link', value: '#3b82f6', type: 'text' },\n { label: 'Muted Text', varName: '--cide-theme-color-text-muted', value: '#6b7280', type: 'text' }\n ]\n },\n {\n label: 'Background Colors',\n items: [\n { label: 'Body Background', varName: '--cide-theme-color-background-body', value: '#ffffff', type: 'text' }\n ]\n },\n {\n label: 'Layout Dimensions',\n items: [\n { label: 'Stack Wrapper Width', varName: '--cide-lyt-stack-wrapper-width', value: '60', type: 'number', min: 20, max: 120 }\n ]\n },\n {\n label: 'Responsive Scale',\n items: [\n { label: 'Font Scale', varName: '--cide-lyt-font-responsive-scale-base', value: '1.0', type: 'number', min: 0.5, max: 2.0, step: 0.01 }\n ]\n },\n {\n label: 'Line Heights',\n items: [\n { label: 'Body Line Height', varName: '--cide-theme-line-height-body', value: '1.6', type: 'number', min: 1, max: 3 },\n { label: 'Heading Line Height', varName: '--cide-theme-line-height-heading', value: '1.2', type: 'number', min: 1, max: 3 }\n ]\n }\n ];\n\n constructor(\n private themeService: CideLytThemeService,\n @Inject(PLATFORM_ID) private platformId: object\n ) { }\n\n ngOnInit(): void {\n // Modern Angular v20 pattern: Use Signals directly\n this.selectedTheme = this.themeService.selectedTheme();\n\n // fetch the system themes list\n this.isLoadingThemes = true;\n this.themeService.fetchSystemThemesList().subscribe({\n next: (res: SystemThemesListControllerRespoonse) => {\n const themes: ICoreSyth[] = res?.data?.core_system_themes || [];\n this.presetThemes = themes.map((theme: ICoreSyth) => ({\n value: theme._id || '',\n label: theme.syth_theme_name || theme.syth_theme_id || '',\n theme\n }));\n this.isLoadingThemes = false;\n // If user has no theme set, select and apply the default theme\n if (!this.selectedTheme) {\n const defaultTheme = this.presetThemes.find(t => t.theme.syth_is_default);\n if (defaultTheme) {\n this.selectedTheme = defaultTheme.value;\n // Apply the default theme as CSS variables\n if (defaultTheme.theme.syth_properties) {\n Object.entries(defaultTheme.theme.syth_properties).forEach(([varName, value]) => {\n this.updateVar(varName, value as string);\n });\n }\n }\n }\n },\n error: () => {\n this.themeLoadError = 'Failed to load themes';\n this.isLoadingThemes = false;\n }\n });\n this.loadAndApplyUserTheme();\n }\n\n loadAndApplyUserTheme(): void {\n this.themeService.loadTheme().subscribe({\n next: (res: SystemThemeControllerRespoonse) => {\n const base: ICoreSyth | undefined = res?.data?.core_system_themes;\n const org: ICoreSyoth | undefined = res?.data?.core_system_organization_themes;\n const user: ICoreSyupth | undefined = res?.data?.core_system_theme_user_preferences;\n // Start with base theme properties\n let merged = { ...(base?.syth_properties || {}) };\n // Override with org overrides\n if (org?.syoth_overrides) {\n merged = { ...merged, ...org.syoth_overrides };\n }\n // Override with user overrides\n if (user?.syupth_overrides) {\n merged = { ...merged, ...user.syupth_overrides };\n }\n this.mergedTheme = merged;\n\n // Store original API values for reset functionality\n this.originalApiThemeValues = { ...merged };\n\n // Apply merged theme as CSS variables\n Object.entries(this.mergedTheme).forEach(([varName, value]) => {\n this.updateVar(varName, value as string);\n \n // If API returns font-size without -base, create the -base version for backward compatibility\n if (varName.includes('font-size') && !varName.includes('-base') && !varName.includes('responsive-scale')) {\n const baseVarName = varName + '-base';\n // Only create if it doesn't already exist\n if (!this.mergedTheme[baseVarName] && !this.mergedTheme[baseVarName.replace(/-/g, '_')]) {\n this.updateVar(baseVarName, value as string);\n }\n }\n });\n\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n const key = item.varName.replace(/-/g, '_');\n // Check both the exact varName and the key format\n // Also check for non-base version if looking for base (for backward compatibility)\n let foundValue = merged[item.varName] || merged[key];\n \n // For base font sizes, also check non-base version from API (backward compatibility)\n if (!foundValue && item.varName.includes('-base') && item.varName.includes('font-size')) {\n const nonBaseVarName = item.varName.replace('-base', '');\n const nonBaseKey = nonBaseVarName.replace(/-/g, '_');\n foundValue = merged[nonBaseVarName] || merged[nonBaseKey];\n }\n \n item.value = foundValue || item.value;\n\n // Parse numeric values for font sizes, line heights, and scale\n if (key.includes('font_size') || key.includes('line_height') || key.includes('responsive_scale')) {\n // Remove 'rem' if present to get numeric value\n const numericValue = typeof item.value === 'string' ? parseFloat(item.value.replace('rem', '')) : parseFloat(item.value);\n item.value = numericValue as unknown as string;\n }\n }\n }\n // Store a deep copy of the current values for reset\n this.originalThemeGroupValues = cloneDeep(this.themeGroups);\n },\n error: () => {\n // handle error if needed\n }\n });\n }\n\n // Update CSS variable in real time\n updateVar(varName: string, value: string) {\n // You can use either the utility function directly or the service method\n setCSSVariable(varName, value, this.platformId);\n // Alternative: this.themeService.updateCSSVariable(varName, value);\n }\n\n onThemeModelChange(value: string | number | string[]): void {\n this.selectedTheme = value as string;\n const selected = this.presetThemes.find(t => t.value === this.selectedTheme);\n if (selected) {\n this.onThemeChange({ value: this.selectedTheme, label: selected.label });\n }\n }\n\n onThemeChange(event: SelectOption) {\n this.selectedTheme = event.value as string;\n const selected = this.presetThemes.find(t => t.value === this.selectedTheme);\n if (selected && selected.theme && selected.theme.syth_properties) {\n // here we will check the theme selected by organization is same if yes then overide also for user preferences\n if (this.themeService.selectedTheme() === selected.theme._id) {\n this.loadAndApplyUserTheme();\n } else {\n // Store original API values for the selected theme\n this.originalApiThemeValues = cloneDeep(selected.theme.syth_properties);\n\n // Update all group values from the selected theme\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n const key = item.varName.replace(/-/g, '_');\n item.value = selected.theme.syth_properties[item.varName] ||\n selected.theme.syth_properties[key] ||\n item.value;\n\n this.updateVar(item.varName, item.value);\n\n if (key.includes('font_size') || key.includes('line_height') || key.includes('responsive_scale')) {\n // Remove 'rem' if present to get numeric value\n const numericValue = typeof item.value === 'string' ? parseFloat(item.value.replace('rem', '')) : parseFloat(item.value);\n item.value = numericValue as unknown as string;\n }\n }\n }\n // Store a deep copy of the current values for reset\n this.originalThemeGroupValues = cloneDeep(this.themeGroups);\n }\n }\n }\n\n onReset() {\n // Restore all values from the original API values\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n const key = item.varName.replace(/-/g, '_');\n // Get the original API value\n const originalValue = this.originalApiThemeValues[item.varName] ||\n this.originalApiThemeValues[key] ||\n item.value;\n\n // Update the item value\n item.value = originalValue;\n\n // Apply the CSS variable\n this.updateVar(item.varName, item.value);\n \n // Note: Font sizes now directly use -base variables, so no need to create -base from non-base\n\n if (key.includes('font_size') || key.includes('line_height') || key.includes('responsive_scale')) {\n item.value = parseFloat(item.value) as unknown as string;\n }\n }\n }\n\n // Update the originalThemeGroupValues to reflect the reset state\n this.originalThemeGroupValues = cloneDeep(this.themeGroups);\n }\n\n onSave() {\n // Collect all current values\n const themeVars: Theme = {\n\n };\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n themeVars[item.varName?.replaceAll('-', '_')] = item.value;\n }\n }\n\n const systemThemePreferences: MSystemThemeUserPreferencesRequest = {\n syupth_overrides: {\n ...themeVars\n },\n syupth_system_theme_id_syth: this.selectedTheme, // LATER: need to upadate LATER\n syupth_user_id_user: this.appState.currentUser()?._id || '', // LATER: need to get user id from user\n syupth_entity_id_syen: this.appState.getActiveEntityId() || '', // LATER: need to get entity id from user\n syth_theme_id: \"\" // need to upadate LATER\n };\n\n // TODO: Send themeVars to backend or emit event by designConfigRoutesUrl?.systemThemeUserPreferences\n this.themeService.saveSystemThemeUserPreferences(systemThemePreferences).subscribe({\n next: (res: SystemThemeUserPreferencesControllerRespoonse) => {\n console.log('Theme saved:', res);\n // Modern Angular v20 pattern: Update Signal through service method\n // Note: The theme service should provide a method to update the selected theme\n // For now, we'll just log the change since the service doesn't expose a setter\n console.log('Theme selected:', this.selectedTheme);\n },\n error: (error) => {\n console.error('Error saving theme:', error);\n }\n });\n }\n\n hasUnsavedChanges(): boolean {\n // chec selected theme is different\n if (this.themeService.selectedTheme() !== this.selectedTheme) {\n return true;\n }\n // check the theme groups are different\n return !isEqual(this.themeGroups, this.originalThemeGroupValues);\n }\n\n /**\n * Check if current values differ from the original API values\n * This is useful for determining if reset should be enabled\n */\n hasChangesFromOriginal(): boolean {\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n const key = item.varName.replace(/-/g, '_');\n const originalValue = this.originalApiThemeValues[item.varName] ||\n this.originalApiThemeValues[key];\n\n if (originalValue !== undefined && item.value !== originalValue) {\n return true;\n }\n }\n }\n return false;\n }\n\n onColorChange(event: Event, color: ThemeColor) {\n const input = event.target as HTMLInputElement;\n color.value = input.value;\n this.updateVar(color.varName, color.value);\n }\n\n onTypographyChange(event: Event, setting: TypographySetting) {\n const input = event.target as HTMLInputElement;\n setting.value = input.value;\n \n // Handle different variable types\n if (setting.varName.includes('font-responsive-scale') || setting.varName.includes('responsive-scale')) {\n // Scale variables are unitless, keep as-is\n this.updateVar(setting.varName, setting.value);\n } else if (setting.varName.includes('font-size')) {\n // Font size base variables get 'rem' unit\n const value = setting.type === 'number' ? setting.value + 'rem' : setting.value;\n this.updateVar(setting.varName, value);\n } else if (setting.varName.includes('line-height')) {\n // Line heights are unitless\n this.updateVar(setting.varName, setting.value);\n } else {\n // Default: add 'rem' for number types\n const value = setting.type === 'number' ? setting.value + 'rem' : setting.value;\n this.updateVar(setting.varName, value);\n }\n }\n\n onLayoutChange(event: Event, setting: TypographySetting) {\n const input = event.target as HTMLInputElement;\n setting.value = input.value;\n // For layout dimensions, store base value and append 'px' unit\n const baseVarName = setting.varName + '-base';\n this.updateVar(baseVarName, setting.value);\n this.updateVar(setting.varName, setting.value + 'px');\n }\n\n onScaleChange(event: Event, setting: TypographySetting) {\n const input = event.target as HTMLInputElement;\n setting.value = input.value;\n // For responsive scale, set as unitless number\n this.updateVar(setting.varName, setting.value);\n }\n\n onDirectionToggle(event: Event) {\n this.isRTL = (event.target as HTMLInputElement).checked;\n document.documentElement.dir = this.isRTL ? 'rtl' : 'ltr';\n }\n}\n","<div class=\"tw-relative tw-h-full tw-bg-white tw-overflow-hidden tw-flex tw-flex-col\">\n <!-- STICKY HEADER SECTION -->\n <div class=\"tw-bg-white tw-sticky tw-top-0 tw-border-b tw-border-gray-200 tw-z-10 tw-flex-shrink-0\">\n <!-- DYNAMIC HEADING -->\n <div class=\"tw-flex tw-justify-between tw-items-center tw-p-2 tw-bg-white tw-border-b tw-border-gray-200\">\n <h6 class=\"tw-font-semibold tw-text-gray-800\">Preset Theme</h6>\n </div>\n </div>\n\n <!-- SCROLLABLE CONTENT AREA -->\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-scroll-smooth tw-p-2 tw-flex tw-flex-col tw-gap-5 tw-text-sm tw-pb-3 theme-scroll-container\">\n <!-- Preset Theme -->\n <section>\n <cide-ele-select id=\"theme-selector\" [ngModel]=\"selectedTheme\" (ngModelChange)=\"onThemeModelChange($event)\"\n [options]=\"presetThemes\" [size]=\"'sm'\"></cide-ele-select>\n </section>\n\n <!-- Direction Toggle -->\n <section>\n <div class=\"tw-flex tw-justify-between tw-items-center tw-mb-2\">\n <h2 class=\"tw-text-md tw-font-semibold tw-text-gray-800\">Text Direction</h2>\n <div class=\"tw-flex tw-items-center tw-gap-1\">\n <span class=\"tw-text-xs tw-text-gray-500\">LTR</span>\n <label for=\"direction-toggle\" class=\"tw-relative tw-inline-block tw-w-9 tw-h-5\">\n <input type=\"checkbox\" id=\"direction-toggle\" class=\"tw-opacity-0 tw-w-0 tw-h-0\" [(ngModel)]=\"isRTL\"\n (change)=\"onDirectionToggle($event)\">\n <span\n class=\"tw-absolute tw-cursor-pointer tw-top-0 tw-left-0 tw-right-0 tw-bottom-0 tw-bg-gray-300 tw-rounded-full tw-transition-colors checked:tw-bg-blue-500 before:tw-absolute before:tw-content-[''] before:tw-h-4 before:tw-w-4 before:tw-left-0.5 before:tw-bottom-0.5 before:tw-bg-white before:tw-rounded-full before:tw-transition-transform checked:before:tw-translate-x-4\"></span>\n </label>\n <span class=\"tw-text-xs tw-text-gray-500\">RTL</span>\n </div>\n </div>\n </section>\n\n <!-- Theme Property Groups (Brand, Text, Background, Font Sizes, Line Heights) -->\n <section *ngFor=\"let group of themeGroups\" class=\"theme-section\">\n <h2 class=\"tw-text-md tw-font-semibold tw-mb-2 tw-text-gray-800\">{{ group.label }}</h2>\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-2 tw-gap-x-4\">\n <div *ngFor=\"let item of group.items\"\n class=\"tw-flex tw-items-center tw-gap-2 tw-p-1 tw-rounded-lg tw-bg-gray-50\"\n [ngClass]=\"{'tw-flex-col tw-items-stretch': (group.label === 'Line Heights' || group.label === 'Layout Dimensions' || group.label === 'Responsive Scale')}\">\n <!-- Line Heights: label on top, input and unit on same line -->\n <ng-container *ngIf=\"group.label === 'Line Heights'\">\n <label [for]=\"item.varName\" class=\"tw-text-sm tw-font-medium tw-text-gray-700 tw-text-left\">{{ item.label\n }}</label>\n <div class=\"tw-flex tw-items-start\">\n <input [id]=\"item.varName\" type=\"number\" step=\"0.1\" [min]=\"item.min ?? null\" [max]=\"item.max ?? null\"\n [(ngModel)]=\"item.value\" (input)=\"onTypographyChange($event, item)\"\n class=\"tw-w-18 tw-text-right tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n <span class=\"tw-text-xs tw-text-gray-400\">unitless</span>\n </div>\n </ng-container>\n <!-- Layout Dimensions: label on top, input in middle, px unit at bottom -->\n <ng-container *ngIf=\"group.label === 'Layout Dimensions'\">\n <label [for]=\"item.varName\" class=\"tw-text-sm tw-font-medium tw-text-gray-700 tw-text-left\">{{ item.label\n }}</label>\n <div class=\"tw-flex tw-items-start\">\n <input [id]=\"item.varName\" type=\"number\" step=\"1\" [min]=\"item.min ?? null\" [max]=\"item.max ?? null\"\n [(ngModel)]=\"item.value\" (input)=\"onLayoutChange($event, item)\"\n class=\"tw-w-18 tw-text-right tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n <span class=\"tw-text-xs tw-text-gray-400\">px</span>\n </div>\n </ng-container>\n <!-- Responsive Scale: label on top, input in middle, unitless at bottom -->\n <ng-container *ngIf=\"group.label === 'Responsive Scale'\">\n <label [for]=\"item.varName\" class=\"tw-text-sm tw-font-medium tw-text-gray-700 tw-text-left\">{{ item.label\n }}</label>\n <div class=\"tw-flex tw-items-start\">\n <input [id]=\"item.varName\" type=\"number\" step=\"0.01\" [min]=\"item.min ?? null\" [max]=\"item.max ?? null\"\n [(ngModel)]=\"item.value\" (input)=\"onScaleChange($event, item)\"\n class=\"tw-w-18 tw-text-right tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n <span class=\"tw-text-xs tw-text-gray-400\">scale</span>\n </div>\n </ng-container>\n <!-- Other groups: keep previous layout -->\n <ng-container *ngIf=\"group.label !== 'Line Heights' && group.label !== 'Layout Dimensions' && group.label !== 'Responsive Scale'\">\n <!-- Color input for color variables -->\n <ng-container *ngIf=\"item.varName.includes('color')\">\n <input [id]=\"item.varName\" [attr.data-variable]=\"item.varName\" type=\"color\" [(ngModel)]=\"item.value\"\n (input)=\"onColorChange($event, item)\"\n class=\"tw-appearance-none tw-border-2 tw-border-gray-200 tw-rounded tw-w-8 tw-h-8 tw-p-0 tw-bg-none tw-shadow-none tw-cursor-pointer tw-transition-colors focus:tw-border-blue-500 color-input\">\n </ng-container>\n <!-- Number input for line heights -->\n <ng-container\n *ngIf=\"!item.varName.includes('color') && item.type === 'number' && group.label !== 'Font Sizes'\">\n <input [id]=\"item.varName\" type=\"number\" [step]=\"item.varName.includes('line-height') ? 0.1 : 0.001\"\n [min]=\"item.min ?? null\" [max]=\"item.max ?? null\" [(ngModel)]=\"item.value\"\n (input)=\"onTypographyChange($event, item)\"\n class=\"tw-w-16 tw-text-right tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n <span class=\"tw-text-xs tw-text-gray-400\" *ngIf=\"!item.varName.includes('line-height')\">rem</span>\n </ng-container>\n <!-- Text input fallback (if needed) -->\n <ng-container *ngIf=\"!item.varName.includes('color') && item.type !== 'number'\">\n <input [id]=\"item.varName\" type=\"text\" [(ngModel)]=\"item.value\" (input)=\"onTypographyChange($event, item)\"\n class=\"tw-w-24 tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n </ng-container>\n <div class=\"tw-flex tw-flex-col tw-gap-0.5\">\n <label [for]=\"item.varName\" class=\"tw-text-sm tw-font-medium tw-text-gray-700\">{{ item.label }}</label>\n <span class=\"tw-text-xs tw-text-gray-500 tw-font-mono\">{{ item.value }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </section>\n </div>\n\n <!-- STICKY ACTION BUTTONS SECTION -->\n <div class=\"tw-bg-white tw-sticky tw-bottom-0 tw-border-t tw-border-gray-200 tw-z-10 tw-flex-shrink-0 tw-p-3 tw-shadow-lg sticky-action-buttons\">\n <div class=\"tw-flex tw-gap-2 tw-justify-end\">\n <button cideEleButton \n variant=\"outline\" \n size=\"sm\" \n (btnClick)=\"onReset()\" \n [disabled]=\"!hasChangesFromOriginal()\"\n class=\"tw-transition-all tw-duration-200 hover:tw-scale-105 action-button\">\n Reset to Original\n </button>\n <button cideEleButton \n variant=\"primary\" \n size=\"sm\" \n (btnClick)=\"onSave()\" \n [disabled]=\"!hasUnsavedChanges()\"\n class=\"tw-transition-all tw-duration-200 hover:tw-scale-105 action-button\">\n Save Changes\n </button>\n </div>\n </div>\n</div>"],"names":["i2"],"mappings":"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"}
1
+ {"version":3,"file":"cloud-ide-layout-drawer-theme.component-pfhoTzJt.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.ts","../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/drawer-theme/drawer-theme.component.html"],"sourcesContent":["import { NgFor, NgIf } from '@angular/common';\nimport { NgClass } from '@angular/common';\nimport { Component, OnInit, PLATFORM_ID, Inject, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CideSelectComponent, SelectOption, CideEleButtonComponent } from 'cloud-ide-element';\nimport { CideLytThemeService, Theme, setCSSVariable } from '../../../services/theme/theme.service';\nimport type { MSystemThemeUserPreferencesRequest, SystemThemesListControllerRespoonse, SystemThemeUserPreferencesControllerRespoonse } from 'cloud-ide-lms-model';\nimport type { SystemThemeControllerRespoonse } from 'cloud-ide-lms-model';\nimport type { ICoreSyth, ICoreSyoth, ICoreSyupth } from 'cloud-ide-lms-model';\nimport { isEqual, cloneDeep } from 'lodash-es';\nimport { AppStateHelperService } from '../../../services/app-state';\n\ninterface ThemeColor {\n label: string;\n varName: string;\n value: string;\n}\n\ninterface TypographySetting {\n label: string;\n varName: string;\n value: string;\n type: 'number' | 'text';\n min?: number;\n max?: number;\n step?: number;\n}\n\ntype ThemeGroup = {\n label: string;\n items: Array<{\n label: string;\n varName: string;\n value: string;\n type: 'number' | 'text';\n min?: number;\n max?: number;\n step?: number;\n }>;\n};\n\n@Component({\n selector: 'cide-lyt-drawer-theme',\n standalone: true,\n imports: [FormsModule, NgFor, NgIf, NgClass, CideSelectComponent, CideEleButtonComponent],\n templateUrl: './drawer-theme.component.html',\n styleUrl: './drawer-theme.component.scss'\n})\nexport class CideLytDrawerThemeComponent implements OnInit {\n private readonly appState = inject(AppStateHelperService);\n // Preset themes\n presetThemes: { value: string, label: string, theme: ICoreSyth }[] = [];\n selectedTheme = '';\n isLoadingThemes = false;\n themeLoadError = '';\n mergedTheme: { [key: string]: string } = {};\n isRTL = false;\n originalThemeGroupValues: ThemeGroup[] = [];\n originalApiThemeValues: { [key: string]: string } = {}; // Store original API values\n\n themeGroups: ThemeGroup[] = [\n {\n label: 'Brand Colors',\n items: [\n { label: 'Primary', varName: '--cide-theme-color-brand-primary', value: '#4f46e5', type: 'text' },\n { label: 'Accent', varName: '--cide-theme-color-brand-accent', value: '#4338ca', type: 'text' },\n { label: 'Separator', varName: '--cide-theme-color-brand-separator', value: '#e5e7eb', type: 'text' }\n ]\n },\n {\n label: 'Text Colors',\n items: [\n { label: 'Body Text', varName: '--cide-theme-color-text-body', value: '#374151', type: 'text' },\n { label: 'Heading Text', varName: '--cide-theme-color-text-heading', value: '#111827', type: 'text' },\n { label: 'Link Text', varName: '--cide-theme-color-text-link', value: '#3b82f6', type: 'text' },\n { label: 'Muted Text', varName: '--cide-theme-color-text-muted', value: '#6b7280', type: 'text' }\n ]\n },\n {\n label: 'Background Colors',\n items: [\n { label: 'Body Background', varName: '--cide-theme-color-background-body', value: '#ffffff', type: 'text' }\n ]\n },\n {\n label: 'Layout Dimensions',\n items: [\n { label: 'Stack Wrapper Width', varName: '--cide-lyt-stack-wrapper-width', value: '60', type: 'number', min: 20, max: 120 }\n ]\n },\n {\n label: 'Responsive Scale',\n items: [\n { label: 'Font Scale', varName: '--cide-lyt-font-responsive-scale-base', value: '1.0', type: 'number', min: 0.5, max: 2.0, step: 0.01 }\n ]\n },\n {\n label: 'Line Heights',\n items: [\n { label: 'Body Line Height', varName: '--cide-theme-line-height-body', value: '1.6', type: 'number', min: 1, max: 3 },\n { label: 'Heading Line Height', varName: '--cide-theme-line-height-heading', value: '1.2', type: 'number', min: 1, max: 3 }\n ]\n }\n ];\n\n constructor(\n private themeService: CideLytThemeService,\n @Inject(PLATFORM_ID) private platformId: object\n ) { }\n\n ngOnInit(): void {\n // Modern Angular v20 pattern: Use Signals directly\n this.selectedTheme = this.themeService.selectedTheme();\n\n // fetch the system themes list\n this.isLoadingThemes = true;\n this.themeService.fetchSystemThemesList().subscribe({\n next: (res: SystemThemesListControllerRespoonse) => {\n const themes: ICoreSyth[] = res?.data?.core_system_themes || [];\n this.presetThemes = themes.map((theme: ICoreSyth) => ({\n value: theme._id || '',\n label: theme.syth_theme_name || theme.syth_theme_id || '',\n theme\n }));\n this.isLoadingThemes = false;\n // If user has no theme set, select and apply the default theme\n if (!this.selectedTheme) {\n const defaultTheme = this.presetThemes.find(t => t.theme.syth_is_default);\n if (defaultTheme) {\n this.selectedTheme = defaultTheme.value;\n // Apply the default theme as CSS variables\n if (defaultTheme.theme.syth_properties) {\n Object.entries(defaultTheme.theme.syth_properties).forEach(([varName, value]) => {\n this.updateVar(varName, value as string);\n });\n }\n }\n }\n },\n error: () => {\n this.themeLoadError = 'Failed to load themes';\n this.isLoadingThemes = false;\n }\n });\n this.loadAndApplyUserTheme();\n }\n\n loadAndApplyUserTheme(): void {\n this.themeService.loadTheme().subscribe({\n next: (res: SystemThemeControllerRespoonse) => {\n const base: ICoreSyth | undefined = res?.data?.core_system_themes;\n const org: ICoreSyoth | undefined = res?.data?.core_system_organization_themes;\n const user: ICoreSyupth | undefined = res?.data?.core_system_theme_user_preferences;\n // Start with base theme properties\n let merged = { ...(base?.syth_properties || {}) };\n // Override with org overrides\n if (org?.syoth_overrides) {\n merged = { ...merged, ...org.syoth_overrides };\n }\n // Override with user overrides\n if (user?.syupth_overrides) {\n merged = { ...merged, ...user.syupth_overrides };\n }\n this.mergedTheme = merged;\n\n // Store original API values for reset functionality\n this.originalApiThemeValues = { ...merged };\n\n // Apply merged theme as CSS variables\n Object.entries(this.mergedTheme).forEach(([varName, value]) => {\n this.updateVar(varName, value as string);\n \n // If API returns font-size without -base, create the -base version for backward compatibility\n if (varName.includes('font-size') && !varName.includes('-base') && !varName.includes('responsive-scale')) {\n const baseVarName = varName + '-base';\n // Only create if it doesn't already exist\n if (!this.mergedTheme[baseVarName] && !this.mergedTheme[baseVarName.replace(/-/g, '_')]) {\n this.updateVar(baseVarName, value as string);\n }\n }\n });\n\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n const key = item.varName.replace(/-/g, '_');\n // Check both the exact varName and the key format\n // Also check for non-base version if looking for base (for backward compatibility)\n let foundValue = merged[item.varName] || merged[key];\n \n // For base font sizes, also check non-base version from API (backward compatibility)\n if (!foundValue && item.varName.includes('-base') && item.varName.includes('font-size')) {\n const nonBaseVarName = item.varName.replace('-base', '');\n const nonBaseKey = nonBaseVarName.replace(/-/g, '_');\n foundValue = merged[nonBaseVarName] || merged[nonBaseKey];\n }\n \n item.value = foundValue || item.value;\n\n // Parse numeric values for font sizes, line heights, and scale\n if (key.includes('font_size') || key.includes('line_height') || key.includes('responsive_scale')) {\n // Remove 'rem' if present to get numeric value\n const numericValue = typeof item.value === 'string' ? parseFloat(item.value.replace('rem', '')) : parseFloat(item.value);\n item.value = numericValue as unknown as string;\n }\n }\n }\n // Store a deep copy of the current values for reset\n this.originalThemeGroupValues = cloneDeep(this.themeGroups);\n },\n error: () => {\n // handle error if needed\n }\n });\n }\n\n // Update CSS variable in real time\n updateVar(varName: string, value: string) {\n // You can use either the utility function directly or the service method\n setCSSVariable(varName, value, this.platformId);\n // Alternative: this.themeService.updateCSSVariable(varName, value);\n }\n\n onThemeModelChange(value: string | number | string[]): void {\n this.selectedTheme = value as string;\n const selected = this.presetThemes.find(t => t.value === this.selectedTheme);\n if (selected) {\n this.onThemeChange({ value: this.selectedTheme, label: selected.label });\n }\n }\n\n onThemeChange(event: SelectOption) {\n this.selectedTheme = event.value as string;\n const selected = this.presetThemes.find(t => t.value === this.selectedTheme);\n if (selected && selected.theme && selected.theme.syth_properties) {\n // here we will check the theme selected by organization is same if yes then overide also for user preferences\n if (this.themeService.selectedTheme() === selected.theme._id) {\n this.loadAndApplyUserTheme();\n } else {\n // Store original API values for the selected theme\n this.originalApiThemeValues = cloneDeep(selected.theme.syth_properties);\n\n // Update all group values from the selected theme\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n const key = item.varName.replace(/-/g, '_');\n item.value = selected.theme.syth_properties[item.varName] ||\n selected.theme.syth_properties[key] ||\n item.value;\n\n this.updateVar(item.varName, item.value);\n\n if (key.includes('font_size') || key.includes('line_height') || key.includes('responsive_scale')) {\n // Remove 'rem' if present to get numeric value\n const numericValue = typeof item.value === 'string' ? parseFloat(item.value.replace('rem', '')) : parseFloat(item.value);\n item.value = numericValue as unknown as string;\n }\n }\n }\n // Store a deep copy of the current values for reset\n this.originalThemeGroupValues = cloneDeep(this.themeGroups);\n }\n }\n }\n\n onReset() {\n // Restore all values from the original API values\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n const key = item.varName.replace(/-/g, '_');\n // Get the original API value\n const originalValue = this.originalApiThemeValues[item.varName] ||\n this.originalApiThemeValues[key] ||\n item.value;\n\n // Update the item value\n item.value = originalValue;\n\n // Apply the CSS variable\n this.updateVar(item.varName, item.value);\n \n // Note: Font sizes now directly use -base variables, so no need to create -base from non-base\n\n if (key.includes('font_size') || key.includes('line_height') || key.includes('responsive_scale')) {\n item.value = parseFloat(item.value) as unknown as string;\n }\n }\n }\n\n // Update the originalThemeGroupValues to reflect the reset state\n this.originalThemeGroupValues = cloneDeep(this.themeGroups);\n }\n\n onSave() {\n // Collect all current values\n const themeVars: Theme = {\n\n };\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n themeVars[item.varName?.replaceAll('-', '_')] = item.value;\n }\n }\n\n const systemThemePreferences: MSystemThemeUserPreferencesRequest = {\n syupth_overrides: {\n ...themeVars\n },\n syupth_system_theme_id_syth: this.selectedTheme, // LATER: need to upadate LATER\n syupth_user_id_user: this.appState.currentUser()?._id || '', // LATER: need to get user id from user\n syupth_entity_id_syen: this.appState.getActiveEntityId() || '', // LATER: need to get entity id from user\n syth_theme_id: \"\" // need to upadate LATER\n };\n\n // TODO: Send themeVars to backend or emit event by designConfigRoutesUrl?.systemThemeUserPreferences\n this.themeService.saveSystemThemeUserPreferences(systemThemePreferences).subscribe({\n next: (res: SystemThemeUserPreferencesControllerRespoonse) => {\n console.log('Theme saved:', res);\n // Modern Angular v20 pattern: Update Signal through service method\n // Note: The theme service should provide a method to update the selected theme\n // For now, we'll just log the change since the service doesn't expose a setter\n console.log('Theme selected:', this.selectedTheme);\n },\n error: (error) => {\n console.error('Error saving theme:', error);\n }\n });\n }\n\n hasUnsavedChanges(): boolean {\n // chec selected theme is different\n if (this.themeService.selectedTheme() !== this.selectedTheme) {\n return true;\n }\n // check the theme groups are different\n return !isEqual(this.themeGroups, this.originalThemeGroupValues);\n }\n\n /**\n * Check if current values differ from the original API values\n * This is useful for determining if reset should be enabled\n */\n hasChangesFromOriginal(): boolean {\n for (const group of this.themeGroups) {\n for (const item of group.items) {\n const key = item.varName.replace(/-/g, '_');\n const originalValue = this.originalApiThemeValues[item.varName] ||\n this.originalApiThemeValues[key];\n\n if (originalValue !== undefined && item.value !== originalValue) {\n return true;\n }\n }\n }\n return false;\n }\n\n onColorChange(event: Event, color: ThemeColor) {\n const input = event.target as HTMLInputElement;\n color.value = input.value;\n this.updateVar(color.varName, color.value);\n }\n\n onTypographyChange(event: Event, setting: TypographySetting) {\n const input = event.target as HTMLInputElement;\n setting.value = input.value;\n \n // Handle different variable types\n if (setting.varName.includes('font-responsive-scale') || setting.varName.includes('responsive-scale')) {\n // Scale variables are unitless, keep as-is\n this.updateVar(setting.varName, setting.value);\n } else if (setting.varName.includes('font-size')) {\n // Font size base variables get 'rem' unit\n const value = setting.type === 'number' ? setting.value + 'rem' : setting.value;\n this.updateVar(setting.varName, value);\n } else if (setting.varName.includes('line-height')) {\n // Line heights are unitless\n this.updateVar(setting.varName, setting.value);\n } else {\n // Default: add 'rem' for number types\n const value = setting.type === 'number' ? setting.value + 'rem' : setting.value;\n this.updateVar(setting.varName, value);\n }\n }\n\n onLayoutChange(event: Event, setting: TypographySetting) {\n const input = event.target as HTMLInputElement;\n setting.value = input.value;\n // For layout dimensions, store base value and append 'px' unit\n const baseVarName = setting.varName + '-base';\n this.updateVar(baseVarName, setting.value);\n this.updateVar(setting.varName, setting.value + 'px');\n }\n\n onScaleChange(event: Event, setting: TypographySetting) {\n const input = event.target as HTMLInputElement;\n setting.value = input.value;\n // For responsive scale, set as unitless number\n this.updateVar(setting.varName, setting.value);\n }\n\n onDirectionToggle(event: Event) {\n this.isRTL = (event.target as HTMLInputElement).checked;\n document.documentElement.dir = this.isRTL ? 'rtl' : 'ltr';\n }\n}\n","<div class=\"tw-relative tw-h-full tw-bg-white tw-overflow-hidden tw-flex tw-flex-col\">\n <!-- STICKY HEADER SECTION -->\n <div class=\"tw-bg-white tw-sticky tw-top-0 tw-border-b tw-border-gray-200 tw-z-10 tw-flex-shrink-0\">\n <!-- DYNAMIC HEADING -->\n <div class=\"tw-flex tw-justify-between tw-items-center tw-p-2 tw-bg-white tw-border-b tw-border-gray-200\">\n <h6 class=\"tw-font-semibold tw-text-gray-800\">Preset Theme</h6>\n </div>\n </div>\n\n <!-- SCROLLABLE CONTENT AREA -->\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-scroll-smooth tw-p-2 tw-flex tw-flex-col tw-gap-5 tw-text-sm tw-pb-3 theme-scroll-container\">\n <!-- Preset Theme -->\n <section>\n <cide-ele-select id=\"theme-selector\" [ngModel]=\"selectedTheme\" (ngModelChange)=\"onThemeModelChange($event)\"\n [options]=\"presetThemes\" [size]=\"'sm'\"></cide-ele-select>\n </section>\n\n <!-- Direction Toggle -->\n <section>\n <div class=\"tw-flex tw-justify-between tw-items-center tw-mb-2\">\n <h2 class=\"tw-text-md tw-font-semibold tw-text-gray-800\">Text Direction</h2>\n <div class=\"tw-flex tw-items-center tw-gap-1\">\n <span class=\"tw-text-xs tw-text-gray-500\">LTR</span>\n <label for=\"direction-toggle\" class=\"tw-relative tw-inline-block tw-w-9 tw-h-5\">\n <input type=\"checkbox\" id=\"direction-toggle\" class=\"tw-opacity-0 tw-w-0 tw-h-0\" [(ngModel)]=\"isRTL\"\n (change)=\"onDirectionToggle($event)\">\n <span\n class=\"tw-absolute tw-cursor-pointer tw-top-0 tw-left-0 tw-right-0 tw-bottom-0 tw-bg-gray-300 tw-rounded-full tw-transition-colors checked:tw-bg-blue-500 before:tw-absolute before:tw-content-[''] before:tw-h-4 before:tw-w-4 before:tw-left-0.5 before:tw-bottom-0.5 before:tw-bg-white before:tw-rounded-full before:tw-transition-transform checked:before:tw-translate-x-4\"></span>\n </label>\n <span class=\"tw-text-xs tw-text-gray-500\">RTL</span>\n </div>\n </div>\n </section>\n\n <!-- Theme Property Groups (Brand, Text, Background, Font Sizes, Line Heights) -->\n <section *ngFor=\"let group of themeGroups\" class=\"theme-section\">\n <h2 class=\"tw-text-md tw-font-semibold tw-mb-2 tw-text-gray-800\">{{ group.label }}</h2>\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-2 tw-gap-x-4\">\n <div *ngFor=\"let item of group.items\"\n class=\"tw-flex tw-items-center tw-gap-2 tw-p-1 tw-rounded-lg tw-bg-gray-50\"\n [ngClass]=\"{'tw-flex-col tw-items-stretch': (group.label === 'Line Heights' || group.label === 'Layout Dimensions' || group.label === 'Responsive Scale')}\">\n <!-- Line Heights: label on top, input and unit on same line -->\n <ng-container *ngIf=\"group.label === 'Line Heights'\">\n <label [for]=\"item.varName\" class=\"tw-text-sm tw-font-medium tw-text-gray-700 tw-text-left\">{{ item.label\n }}</label>\n <div class=\"tw-flex tw-items-start\">\n <input [id]=\"item.varName\" type=\"number\" step=\"0.1\" [min]=\"item.min ?? null\" [max]=\"item.max ?? null\"\n [(ngModel)]=\"item.value\" (input)=\"onTypographyChange($event, item)\"\n class=\"tw-w-18 tw-text-right tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n <span class=\"tw-text-xs tw-text-gray-400\">unitless</span>\n </div>\n </ng-container>\n <!-- Layout Dimensions: label on top, input in middle, px unit at bottom -->\n <ng-container *ngIf=\"group.label === 'Layout Dimensions'\">\n <label [for]=\"item.varName\" class=\"tw-text-sm tw-font-medium tw-text-gray-700 tw-text-left\">{{ item.label\n }}</label>\n <div class=\"tw-flex tw-items-start\">\n <input [id]=\"item.varName\" type=\"number\" step=\"1\" [min]=\"item.min ?? null\" [max]=\"item.max ?? null\"\n [(ngModel)]=\"item.value\" (input)=\"onLayoutChange($event, item)\"\n class=\"tw-w-18 tw-text-right tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n <span class=\"tw-text-xs tw-text-gray-400\">px</span>\n </div>\n </ng-container>\n <!-- Responsive Scale: label on top, input in middle, unitless at bottom -->\n <ng-container *ngIf=\"group.label === 'Responsive Scale'\">\n <label [for]=\"item.varName\" class=\"tw-text-sm tw-font-medium tw-text-gray-700 tw-text-left\">{{ item.label\n }}</label>\n <div class=\"tw-flex tw-items-start\">\n <input [id]=\"item.varName\" type=\"number\" step=\"0.01\" [min]=\"item.min ?? null\" [max]=\"item.max ?? null\"\n [(ngModel)]=\"item.value\" (input)=\"onScaleChange($event, item)\"\n class=\"tw-w-18 tw-text-right tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n <span class=\"tw-text-xs tw-text-gray-400\">scale</span>\n </div>\n </ng-container>\n <!-- Other groups: keep previous layout -->\n <ng-container *ngIf=\"group.label !== 'Line Heights' && group.label !== 'Layout Dimensions' && group.label !== 'Responsive Scale'\">\n <!-- Color input for color variables -->\n <ng-container *ngIf=\"item.varName.includes('color')\">\n <input [id]=\"item.varName\" [attr.data-variable]=\"item.varName\" type=\"color\" [(ngModel)]=\"item.value\"\n (input)=\"onColorChange($event, item)\"\n class=\"tw-appearance-none tw-border-2 tw-border-gray-200 tw-rounded tw-w-8 tw-h-8 tw-p-0 tw-bg-none tw-shadow-none tw-cursor-pointer tw-transition-colors focus:tw-border-blue-500 color-input\">\n </ng-container>\n <!-- Number input for line heights -->\n <ng-container\n *ngIf=\"!item.varName.includes('color') && item.type === 'number' && group.label !== 'Font Sizes'\">\n <input [id]=\"item.varName\" type=\"number\" [step]=\"item.varName.includes('line-height') ? 0.1 : 0.001\"\n [min]=\"item.min ?? null\" [max]=\"item.max ?? null\" [(ngModel)]=\"item.value\"\n (input)=\"onTypographyChange($event, item)\"\n class=\"tw-w-16 tw-text-right tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n <span class=\"tw-text-xs tw-text-gray-400\" *ngIf=\"!item.varName.includes('line-height')\">rem</span>\n </ng-container>\n <!-- Text input fallback (if needed) -->\n <ng-container *ngIf=\"!item.varName.includes('color') && item.type !== 'number'\">\n <input [id]=\"item.varName\" type=\"text\" [(ngModel)]=\"item.value\" (input)=\"onTypographyChange($event, item)\"\n class=\"tw-w-24 tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-px-2 tw-py-1 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-blue-500 focus:tw-border-transparent theme-input\">\n </ng-container>\n <div class=\"tw-flex tw-flex-col tw-gap-0.5\">\n <label [for]=\"item.varName\" class=\"tw-text-sm tw-font-medium tw-text-gray-700\">{{ item.label }}</label>\n <span class=\"tw-text-xs tw-text-gray-500 tw-font-mono\">{{ item.value }}</span>\n </div>\n </ng-container>\n </div>\n </div>\n </section>\n </div>\n\n <!-- STICKY ACTION BUTTONS SECTION -->\n <div class=\"tw-bg-white tw-sticky tw-bottom-0 tw-border-t tw-border-gray-200 tw-z-10 tw-flex-shrink-0 tw-p-3 tw-shadow-lg sticky-action-buttons\">\n <div class=\"tw-flex tw-gap-2 tw-justify-end\">\n <button cideEleButton \n variant=\"outline\" \n size=\"sm\" \n (btnClick)=\"onReset()\" \n [disabled]=\"!hasChangesFromOriginal()\"\n class=\"tw-transition-all tw-duration-200 hover:tw-scale-105 action-button\">\n Reset to Original\n </button>\n <button cideEleButton \n variant=\"primary\" \n size=\"sm\" \n (btnClick)=\"onSave()\" \n [disabled]=\"!hasUnsavedChanges()\"\n class=\"tw-transition-all tw-duration-200 hover:tw-scale-105 action-button\">\n Save Changes\n </button>\n </div>\n </div>\n</div>"],"names":["i2"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as i1 from '@angular/common';
2
2
  import { CommonModule } from '@angular/common';
3
- import { C as CideLytSharedWrapperComponent, a as CideLytSidebarService, A as AppStateHelperService } from './cloud-ide-layout-cloud-ide-layout-DgwU-sCr.mjs';
3
+ import { C as CideLytSharedWrapperComponent, a as CideLytSidebarService, A as AppStateHelperService } from './cloud-ide-layout-cloud-ide-layout-HmeFdi-u.mjs';
4
4
  import * as i0 from '@angular/core';
5
5
  import { input, inject, Renderer2, ChangeDetectorRef, signal, computed, effect, ViewChild, Component } from '@angular/core';
6
6
  import { DomSanitizer } from '@angular/platform-browser';
@@ -344,4 +344,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
344
344
  }] } });
345
345
 
346
346
  export { CideLytHomeWrapperComponent };
347
- //# sourceMappingURL=cloud-ide-layout-home-wrapper.component-CH7LlO1x.mjs.map
347
+ //# sourceMappingURL=cloud-ide-layout-home-wrapper.component-DyFnB93U.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-ide-layout-home-wrapper.component-CH7LlO1x.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/layout/home/home-wrapper/home-wrapper.component.ts","../../../projects/cloud-ide-layout/src/lib/layout/home/home-wrapper/home-wrapper.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { CideLytSharedWrapperComponent, CideLytSharedWrapperSetupParam } from '../../shared/shared-wrapper/shared-wrapper.component';\nimport { Component, OnInit, ElementRef, ViewChild, AfterViewInit, Renderer2, inject, ChangeDetectorRef, Signal, signal, input, computed, effect } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { CideLytSidebarService } from '../../sidebar/sidebar.service';\nimport { menuResponseData } from 'cloud-ide-lms-model';\nimport { CideIconComponent, CideSpinnerComponent } from 'cloud-ide-element';\nimport { TooltipDirective } from 'cloud-ide-element';\nimport { CideLytRequestService } from '../../request/request.service';\nimport { AppStateHelperService } from '../../../services/app-state/app-state-helper.service';\nimport { Router } from '@angular/router';\nimport { DashboardCardsService } from '../../../services/dashboard-cards.service';\nimport { CoreDashboardCards } from 'cloud-ide-lms-model';\n\n// --- Interfaces for our data structures ---\ninterface CardItem {\n text?: string;\n title?: string;\n subtext?: string;\n details?: string;\n subject?: string;\n grade?: string;\n color?: string;\n name?: string;\n officeHours?: string;\n messageLink?: string;\n appointmentLink?: string;\n professor?: string;\n colorTheme?: string;\n date?: { month: string; day: string };\n themeColor?: string;\n topic?: string;\n forum?: string;\n lastPost?: string;\n iconSVG?: string;\n safeIconSVG?: SafeHtml;\n}\n\ninterface CardStat {\n label: string;\n value: string;\n gradient?: string;\n valueClass?: string;\n}\n\ninterface Card {\n id: string;\n title: string;\n type: string;\n colSpan: string;\n accentColor: string;\n urgentText?: string;\n insightTag?: string;\n items?: CardItem[];\n stats?: CardStat[];\n progress?: string;\n description?: string;\n link?: { text: string; href: string };\n}\n\ninterface ModulesSectionConfig {\n title: string;\n viewAllLinkText: string;\n viewAllLinkHref: string;\n showViewAllLink: boolean;\n}\n\n@Component({\n selector: 'cide-lyt-home-wrapper',\n imports: [CommonModule, CideIconComponent, TooltipDirective, CideSpinnerComponent],\n templateUrl: './home-wrapper.component.html',\n styleUrl: './home-wrapper.component.css',\n styles: [`\n :host {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n }\n `]\n})\nexport class CideLytHomeWrapperComponent extends CideLytSharedWrapperComponent implements OnInit, AfterViewInit {\n public override shared_wrapper_setup_param = input<Partial<CideLytSharedWrapperSetupParam>>({\n sypg_page_code: \"cide_lyt_home\"\n });\n\n private readonly sidebarService = inject(CideLytSidebarService);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly renderer = inject(Renderer2);\n private readonly cdr = inject(ChangeDetectorRef);\n protected override appState = inject(AppStateHelperService);\n protected override router = inject(Router);\n private readonly dashboardCardsService = inject(DashboardCardsService);\n\n private moduleStylePresets = [\n { accentColor: \"#8B5CF6\" }, // purple\n { accentColor: \"#EC4899\" }, // pink\n { accentColor: \"#14B8A6\" }, // teal\n { accentColor: \"#0EA5E9\" }, // sky\n { accentColor: \"#F59E42\" }, // orange\n { accentColor: \"#6366F1\" }, // indigo\n { accentColor: \"#22C55E\" }, // green\n { accentColor: \"#EF4444\" }, // red\n { accentColor: \"#F59E0B\" }, // amber\n { accentColor: \"#10B981\" }, // emerald\n { accentColor: \"#06B6D4\" }, // cyan\n { accentColor: \"#6B7280\" }, // gray\n { accentColor: \"#8B5CF6\" }, // violet (same as purple for fallback)\n { accentColor: \"#D946EF\" } // fuchsia\n ];\n\n\n @ViewChild('cardsContainerEl') cardsContainerElRef!: ElementRef<HTMLDivElement>;\n\n modulesSectionConfig: ModulesSectionConfig = {\n title: \"Subscribed Modules\",\n viewAllLinkText: \"View All Modules &rarr;\",\n viewAllLinkHref: \"#all-modules\",\n showViewAllLink: false\n };\n\n modulesData: (menuResponseData & { accentColor?: string; pillCount?: number })[] = [];\n draggedItem: HTMLElement | null = null;\n placeholder: HTMLElement | null = null;\n\n // Loading states\n isLoadingModules = signal<boolean>(true);\n isLoadingCards = signal<boolean>(true);\n\n // Computed signal for overall loading state\n isLoading = computed(() => this.isLoadingModules() || this.isLoadingCards());\n\n // Track which module is currently being opened (to show loader/prevent multiple clicks)\n isOpeningModule = signal<string | null>(null);\n\n // Dashboard cards data\n public cardsData: Card[] = [];\n\n // Track previous entity ID for change detection\n private previousEntityId: string | null = null;\n // Flag to prevent multiple simultaneous API calls\n private isModuleLoadInProgress = false;\n // Debounce timer for entity change\n private entityChangeDebounceTimer: any = null;\n\n constructor() {\n super();\n // Sanitize SVG icons in the hardcoded cardsData\n this.cardsData = this.cardsData.map(card => ({\n ...card,\n items: card.items?.map(item => ({\n ...item,\n safeIconSVG: item.iconSVG ? this.sanitizer.bypassSecurityTrustHtml(item.iconSVG) : undefined\n }))\n }));\n\n // React to active entity changes - reload modules when entity changes\n effect(() => {\n const activeEntity = this.appState.activeEntity();\n const currentEntityId = activeEntity?._id || null;\n\n // Skip on initial load (when previousEntityId is null)\n if (this.previousEntityId === null) {\n this.previousEntityId = currentEntityId;\n console.log('🏢 HOME: Entity change handler initialized with initial entity:', currentEntityId);\n return;\n }\n\n // Only reload if entity actually changed and no load is in progress\n if (this.previousEntityId !== currentEntityId && currentEntityId !== null && !this.isModuleLoadInProgress) {\n console.log('🏢 HOME: Entity changed from', this.previousEntityId, 'to', currentEntityId, '- reloading modules');\n this.previousEntityId = currentEntityId;\n\n // Clear any existing debounce timer\n if (this.entityChangeDebounceTimer) {\n clearTimeout(this.entityChangeDebounceTimer);\n }\n\n // Debounce the API call to prevent multiple rapid calls\n this.entityChangeDebounceTimer = setTimeout(() => {\n // Reload modules when entity changes (menu API call)\n this.loadModules();\n this.entityChangeDebounceTimer = null;\n }, 100); // 100ms debounce\n\n } else if (this.previousEntityId !== null && currentEntityId === null) {\n // Entity was cleared\n console.log('🏢 HOME: Entity cleared');\n this.previousEntityId = null;\n this.modulesData = [];\n this.isLoadingModules.set(false);\n } else if (this.isModuleLoadInProgress) {\n console.log('⏭️ HOME: Module load already in progress, skipping duplicate call');\n }\n });\n }\n\n override ngOnInit(): void {\n super.ngOnInit?.();\n // Set loading states to true initially\n this.isLoadingModules.set(true);\n this.isLoadingCards.set(true);\n\n this.loadModules();\n this.loadDashboardCards();\n }\n\n openModule(module: menuResponseData) {\n if (this.isOpeningModule()) return; // Prevent double clicks\n\n console.log(module, \"module\");\n\n // Set active module immediately (optimistic UI update)\n this.appState.setActiveModule(module);\n\n // If no ID, fallback to default navigation\n if (!module._id) {\n this.router.navigate([`/control-panel/${module.syme_path}`]);\n return;\n }\n\n this.isOpeningModule.set(module._id);\n\n // Fetch menus for this module to find the first navigable route\n this.sidebarService.getSidebarMenues({\n syme_id: module._id,\n sort: 'asc'\n }).subscribe({\n next: (res) => {\n const menus = res?.data || [];\n let targetPath = module.syme_path; // Default fallback\n\n // Helper to find the first valid path in the menu tree\n // We look for the first leaf node recursively\n const firstNavigableMenu = this.findFirstLeafMenu(menus);\n\n if (firstNavigableMenu) {\n console.log(`Redirecting to first menu item: ${firstNavigableMenu.syme_title} (${firstNavigableMenu.syme_path})`);\n targetPath = firstNavigableMenu.syme_path;\n } else {\n console.log('No specific menu items found, using default module path');\n }\n\n this.router.navigate([`/control-panel/${targetPath}`]).then(() => {\n this.isOpeningModule.set(null);\n });\n },\n error: (err) => {\n console.error(\"Error loading menus for navigation:\", err);\n // Fallback to default module path on error\n this.router.navigate([`/control-panel/${module.syme_path}`]).then(() => {\n this.isOpeningModule.set(null);\n });\n }\n });\n }\n\n private findFirstLeafMenu(menus: menuResponseData[]): menuResponseData | null {\n for (const menu of menus) {\n // If it has children, search deeper first\n if (menu.children && menu.children.length > 0) {\n const leaf = this.findFirstLeafMenu(menu.children);\n if (leaf) {\n return leaf;\n }\n } else {\n // It's a leaf node. Check if it has a valid path.\n if (menu.syme_path && menu.syme_path.trim() !== '') {\n return menu;\n }\n }\n }\n return null;\n }\n\n ngAfterViewInit(): void {\n this.setupDragAndDrop();\n }\n\n private loadModules(): void {\n // Prevent multiple simultaneous calls\n if (this.isModuleLoadInProgress) {\n console.log('⏭️ HOME: Module load already in progress, skipping duplicate call');\n return;\n }\n\n this.isModuleLoadInProgress = true;\n this.isLoadingModules.set(true);\n\n this.sidebarService?.getSidebarMenues({\n syme_type: \"module\",\n sort: 'asc',\n syme_title: \"\"\n })?.subscribe({\n next: (res) => {\n const fetchedApiModules = res?.data || [];\n this.modulesData = fetchedApiModules.map((item: menuResponseData, index: number) => {\n const stylePreset = this.moduleStylePresets[index % this.moduleStylePresets.length];\n const insightCount = item.syme_ping_count || 0;\n return {\n ...item,\n accentColor: stylePreset.accentColor, // UI-only property\n pillCount: insightCount, // UI-only property\n };\n });\n this.isLoadingModules.set(false);\n this.isModuleLoadInProgress = false;\n this.cdr.detectChanges();\n },\n error: (err) => {\n console.error('Error loading sidebar modules:', err);\n this.modulesData = [];\n this.isLoadingModules.set(false);\n this.isModuleLoadInProgress = false;\n this.cdr.detectChanges();\n }\n });\n }\n\n private loadDashboardCards(): void {\n this.isLoadingCards.set(true);\n this.dashboardCardsService.getDashboardCardsList({}).subscribe({\n next: (response) => {\n if (response.success && response.data) {\n // Filter only visible cards\n const visibleCards = response.data.filter(card => card.cdc_visible !== false && card.cdc_isactive !== false);\n\n // Convert database cards to display format\n this.cardsData = visibleCards.map((card) => {\n const colSpanMap: { [key: number]: string } = {\n 1: \"md:tw-col-span-1 xl:tw-col-span-1\",\n 2: \"md:tw-col-span-2 xl:tw-col-span-2\",\n 3: \"md:tw-col-span-3 xl:tw-col-span-3\",\n 4: \"md:tw-col-span-4 xl:tw-col-span-4\"\n };\n\n return {\n id: card._id || `card-${Date.now()}`,\n title: card.cdc_title || 'Untitled Card',\n type: card.cdc_type || 'custom',\n colSpan: colSpanMap[card.cdc_position?.colspan || 1] || \"md:tw-col-span-1 xl:tw-col-span-1\",\n accentColor: card.cdc_color || 'blue',\n description: card.cdc_description,\n // You can extend this to load actual data from the API endpoint\n items: [],\n stats: []\n } as Card;\n });\n\n // Sort by position\n this.cardsData.sort((a, b) => {\n const cardA = visibleCards.find(c => c._id === a.id);\n const cardB = visibleCards.find(c => c._id === b.id);\n const posA = cardA?.cdc_position || { row: 999, col: 999 };\n const posB = cardB?.cdc_position || { row: 999, col: 999 };\n const rowA = posA.row ?? 999;\n const rowB = posB.row ?? 999;\n const colA = posA.col ?? 999;\n const colB = posB.col ?? 999;\n if (rowA !== rowB) return rowA - rowB;\n return colA - colB;\n });\n\n this.isLoadingCards.set(false);\n this.cdr.detectChanges();\n } else {\n this.isLoadingCards.set(false);\n this.loadDefaultCards();\n }\n },\n error: (error) => {\n console.error('Error loading dashboard cards:', error);\n // Fallback to default cards if API fails\n this.isLoadingCards.set(false);\n this.loadDefaultCards();\n }\n });\n }\n\n private loadDefaultCards(): void {\n // Fallback default cards if database is empty or API fails\n this.cardsData = [\n { id: \"card1\", title: \"Welcome\", type: \"custom\", colSpan: \"md:tw-col-span-2 xl:tw-col-span-3\", accentColor: \"blue\", description: \"Welcome to your dashboard\" }\n ];\n this.cdr.detectChanges();\n }\n\n\n setupDragAndDrop(): void {\n const cardsContainer = this.cardsContainerElRef?.nativeElement;\n if (!cardsContainer) return;\n this.placeholder = this.renderer.createElement('div');\n this.renderer.addClass(this.placeholder!, 'drag-over-placeholder');\n this.renderer.listen(cardsContainer, 'dragstart', (e: DragEvent) => {\n const target = e.target as HTMLElement;\n if (target.classList.contains('dashboard-card')) {\n this.draggedItem = target;\n // Modern ES2022+ pattern: Use microtask for immediate execution\n Promise.resolve().then(() => this.renderer.addClass(target, 'dragging'));\n e.dataTransfer?.setData('text/plain', target.id || 'draggable-card');\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n }\n });\n this.renderer.listen(cardsContainer, 'dragend', () => {\n if (this.draggedItem) this.renderer.removeClass(this.draggedItem, 'dragging');\n if (this.placeholder?.parentNode) this.renderer.removeChild(this.placeholder.parentNode, this.placeholder);\n this.draggedItem = null;\n });\n this.renderer.listen(cardsContainer, 'dragover', (e: DragEvent) => {\n e.preventDefault();\n if (!this.draggedItem) return;\n const target = (e.target as HTMLElement).closest('.dashboard-card') as HTMLElement | null;\n if (target && target !== this.draggedItem) {\n const rect = target.getBoundingClientRect();\n const offsetY = e.clientY - rect.top;\n if (offsetY > rect.height / 2) {\n this.renderer.insertBefore(cardsContainer, this.placeholder!, target.nextSibling);\n } else {\n this.renderer.insertBefore(cardsContainer, this.placeholder!, target);\n }\n }\n });\n this.renderer.listen(cardsContainer, 'drop', (e: DragEvent) => {\n e.preventDefault();\n if (this.draggedItem && this.placeholder?.parentNode) {\n this.renderer.insertBefore(this.placeholder.parentNode, this.draggedItem, this.placeholder);\n }\n if (this.placeholder?.parentNode) this.renderer.removeChild(this.placeholder.parentNode, this.placeholder);\n if (this.draggedItem) this.renderer.removeClass(this.draggedItem, 'dragging');\n this.draggedItem = null;\n });\n }\n}\n","<!-- Fullscreen Loader Overlay -->\n@if (isLoading()) {\n<div class=\"tw-fixed tw-inset-0 tw-z-[9999] tw-backdrop-blur-sm tw-flex tw-items-center tw-justify-center\">\n <div class=\"tw-text-center\">\n <cide-ele-spinner size=\"sm\" type=\"spinner\"></cide-ele-spinner>\n <p class=\"tw-mt-4 tw-text-gray-600 dark:tw-text-gray-300 tw-text-sm tw-font-medium\">Loading dashboard...</p>\n </div>\n</div>\n}\n\n<div class=\"tw-p-3 sm:tw-p-6 md:tw-p-8 tw-w-full\" [class.tw-opacity-0]=\"isLoading()\"\n [class.tw-transition-opacity]=\"!isLoading()\">\n <header class=\"tw-mb-6 md:tw-mb-10\">\n <h1\n class=\"tw-text-2xl sm:tw-text-3xl md:tw-text-4xl tw-font-bold tw-text-transparent tw-bg-clip-text tw-bg-gradient-to-r tw-from-purple-600 tw-via-pink-500 tw-to-orange-500 tw-leading-tight\">\n Welcome, {{ appState.getUserName() || 'User' }}!\n </h1>\n <p class=\"tw-text-xs sm:tw-text-sm tw-text-gray-500 tw-mt-1\">Your central hub for all things college.</p>\n <p *ngIf=\"appState.getUserEmail()\" class=\"tw-text-[10px] sm:tw-text-xs tw-text-gray-400 tw-mt-1\">{{\n appState.getUserEmail() }}</p>\n </header>\n\n <div class=\"tw-mb-8 md:tw-mb-10\">\n <div class=\"tw-flex tw-justify-between tw-items-center tw-mb-5\">\n <h2 class=\"tw-text-sm sm:tw-text-base tw-font-bold tw-text-gray-700\">{{ modulesSectionConfig.title }}</h2>\n <div class=\"tw-flex tw-items-center tw-gap-3\">\n <a *ngIf=\"modulesSectionConfig.showViewAllLink\" [href]=\"modulesSectionConfig.viewAllLinkHref\"\n class=\"tw-text-sm tw-font-medium tw-text-purple-600 hover:tw-text-purple-800 hover:tw-underline tw-transition-colors\">\n {{ modulesSectionConfig.viewAllLinkText }}\n </a>\n </div>\n </div>\n <!-- Grid View -->\n <div class=\"tw-grid tw-grid-cols-2 sm:tw-grid-cols-2 lg:tw-grid-cols-3 xl:tw-grid-cols-4 tw-gap-2.5\">\n <a *ngFor=\"let module of modulesData\" (click)=\"openModule(module)\" (keydown.enter)=\"openModule(module)\"\n (keydown.space)=\"openModule(module)\"\n class=\"module-card tw-relative tw-overflow-hidden group tw-w-full tw-h-22 md:tw-h-28 tw-bg-white tw-border tw-border-gray-200/80 tw-rounded-xl tw-p-1.5 md:tw-p-3 tw-shadow-md hover:tw-shadow-xl tw-transition-all tw-duration-300 tw-ease-out tw-flex tw-items-center tw-space-x-2 md:tw-space-x-4\"\n [style.--accent-color]=\"module.accentColor\" tabindex=\"0\" role=\"button\"\n [attr.aria-label]=\"'Open module: ' + module.syme_title\">\n <div class=\"tw-relative tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 md:tw-w-16 md:tw-h-16 tw-rounded-lg tw-flex tw-items-center tw-justify-center tw-transition-all tw-duration-300 group-hover:tw-scale-105\"\n [style.backgroundColor]=\"module?.accentColor + '22'\">\n <cide-ele-icon class=\"mpro-icon-field\" type=\"none\">{{module?.syme_icon}}</cide-ele-icon>\n </div>\n <div *ngIf=\"(module?.pillCount || 0) > 0\" class=\"tw-absolute tw--top-1.5 tw--right-1.5\">\n <span\n class=\"tw-flex tw-h-5 tw-w-5 tw-items-center tw-justify-center tw-rounded-full tw-text-white tw-text-xs tw-font-bold tw-ring-2 tw-ring-white\"\n [style.backgroundColor]=\"module?.accentColor\">{{module?.pillCount}}</span>\n </div>\n </div>\n <div class=\"tw-flex tw-flex-col tw-flex-grow tw-min-w-0\">\n <h4 class=\"tw-font-bold tw-text-xs md:tw-text-sm tw-text-gray-800 tw-truncate line-clamp-1\"\n cideEleTooltip [cideEleTooltip]=\"module.syme_title\" [tooltipDelay]=\"300\"\n [tooltipPlacement]=\"'top'\">\n {{module?.syme_title}}\n </h4>\n <p\n class=\"tw-text-[10px] md:tw-text-xs tw-text-gray-400 tw-mt-0.5 tw-overflow-hidden tw-text-ellipsis tw-line-clamp-2 min-h-[1.5rem] md:min-h-[2.5rem] tw-leading-tight\">\n {{module?.syme_desc}}\n </p>\n </div>\n\n <!-- Loading Overlay -->\n <div *ngIf=\"isOpeningModule() === module._id\"\n class=\"tw-absolute tw-inset-0 tw-z-10 tw-bg-white/60 tw-backdrop-blur-[1px] tw-flex tw-items-center tw-justify-center tw-rounded-xl tw-transition-all tw-duration-200\">\n <cide-ele-spinner size=\"sm\" type=\"spinner\"></cide-ele-spinner>\n </div>\n </a>\n </div>\n </div>\n\n <main class=\"tw--mt-8 md:tw--mt-10\">\n <div #cardsContainerEl class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 xl:tw-grid-cols-3 tw-gap-5\">\n <div *ngFor=\"let card of cardsData\" draggable=\"true\" [id]=\"card.id\"\n class=\"dashboard-card tw-bg-white tw-border tw-border-gray-200/70 tw-rounded-xl tw-p-4 tw-shadow-lg hover:tw-shadow-xl hover:tw--translate-y-0.5 tw-transition-all tw-cursor-grab\"\n [ngClass]=\"card.colSpan || 'tw-col-span-1'\">\n\n <div *ngIf=\"card.type !== 'studyStreak' && card.type !== 'quickStats'\"\n class=\"tw-flex tw-justify-between tw-items-center tw-mb-3\">\n <h3 class=\"tw-text-base tw-font-bold\" [ngClass]=\"'tw-text-' + card.accentColor + '-700'\">\n {{card.title}}</h3>\n <span *ngIf=\"card.urgentText\"\n class=\"tw-text-xs tw-bg-red-100 tw-text-red-700 tw-px-2.5 tw-py-1 tw-rounded-full tw-font-semibold\">{{card.urgentText}}</span>\n <span *ngIf=\"card.insightTag\" class=\"tw-text-xs tw-px-2.5 tw-py-1 tw-rounded-full tw-font-semibold\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-100 tw-text-' + card.accentColor + '-700'\">{{card.insightTag}}</span>\n </div>\n\n <div class=\"card-content-area tw-space-y-3 tw-text-sm tw-pr-1\">\n <ng-container [ngSwitch]=\"card.type\">\n <ul *ngSwitchCase=\"'deadlines'\">\n <li *ngFor=\"let item of card.items\"\n class=\"tw-flex tw-justify-between tw-items-center tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <div>\n <p class=\"tw-text-gray-700 tw-font-medium\">{{item.text}}</p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.subtext}}</p>\n </div>\n </li>\n </ul>\n <ul *ngSwitchCase=\"'news'\">\n <li *ngFor=\"let item of card.items\" class=\"tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <p class=\"tw-font-medium tw-text-gray-800\">{{item.title}}</p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.details}}</p>\n </li>\n </ul>\n <ul *ngSwitchCase=\"'grades'\">\n <li *ngFor=\"let item of card.items\"\n class=\"tw-flex tw-justify-between tw-items-center tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <span class=\"tw-text-gray-700\">{{item.subject}}</span><span class=\"tw-font-bold\"\n [ngClass]=\"item.color\">{{item.grade}}</span>\n </li>\n </ul>\n <ul *ngSwitchCase=\"'professorConnect'\">\n <li *ngFor=\"let item of card.items\" class=\"tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <p class=\"tw-font-medium tw-text-gray-700\">{{item.name}}</p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.officeHours}}</p><a\n *ngIf=\"item.messageLink\" [href]=\"item.messageLink\"\n class=\"tw-text-xs hover:tw-underline\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-600'\">Send Message</a><a\n *ngIf=\"item.appointmentLink\" [href]=\"item.appointmentLink\"\n class=\"tw-text-xs hover:tw-underline tw-ml-2\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-600'\">Book Appointment</a>\n </li>\n </ul>\n <div *ngSwitchCase=\"'courses'\" class=\"tw-grid tw-grid-cols-1 sm:tw-grid-cols-2 tw-gap-2.5\"><a\n *ngFor=\"let item of card.items\" href=\"#\"\n class=\"tw-block tw-p-2.5 tw-rounded-lg tw-transition-all group tw-ring-1\"\n [ngClass]=\"'tw-bg-' + item.colorTheme + '-50/70 hover:tw-bg-' + item.colorTheme + '-100/80 tw-ring-' + item.colorTheme + '-200/70 hover:tw-ring-' + item.colorTheme + '-300'\">\n <p class=\"tw-font-semibold group-hover:tw-text-{{item.colorTheme}}-800\"\n [ngClass]=\"'tw-text-' + item.colorTheme + '-700'\">{{item.name}}</p>\n <p class=\"tw-text-xs group-hover:tw-text-{{item.colorTheme}}-600 tw-mt-0.5\"\n [ngClass]=\"'tw-text-' + item.colorTheme + '-500'\">{{item.professor}}</p>\n </a></div>\n <ul *ngSwitchCase=\"'events'\">\n <li *ngFor=\"let item of card.items\"\n class=\"tw-flex tw-items-start tw-space-x-2.5 tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <div class=\"tw-text-white tw-text-xs tw-font-bold tw-p-2 tw-rounded-md tw-flex tw-flex-col tw-items-center tw-justify-center tw-w-12 tw-h-12 tw-flex-shrink-0 tw-shadow\"\n [ngClass]=\"item.themeColor\"><span>{{item.date?.month}}</span><span\n class=\"tw-text-sm\">{{item.date?.day}}</span></div>\n <div>\n <p class=\"tw-text-gray-700 tw-font-medium\">{{item.title}}</p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.details}}</p>\n </div>\n </li>\n </ul>\n <div *ngSwitchCase=\"'studyStreak'\"\n class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-text-center tw-flex-grow tw-p-4\">\n <svg class=\"tw-w-12 tw-h-12 tw-mb-2\" [ngClass]=\"'tw-text-' + card.accentColor + '-500'\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M17.657 18.657A8 8 0 016.343 7.343S7 9 9 10c0-2 .5-5 2.986-7.014A8.003 8.003 0 0122 12c0 3-1 7-6.657 7.343A7.975 7.975 0 0117.657 18.657z\">\n </path>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9.879 16.121A3 3 0 1012.015 11L11 14H9c0 .768.293 1.536.879 2.121z\"></path>\n </svg>\n <h3 class=\"tw-text-base tw-font-bold tw-mb-1\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-600'\">{{card.title}}</h3>\n <p class=\"tw-text-xs tw-text-gray-500\">{{card.description}}</p>\n <div class=\"tw-mt-3 tw-w-full tw-bg-gray-200 tw-rounded-full tw-h-1.5\">\n <div class=\"tw-h-1.5 tw-rounded-full\" [ngClass]=\"'tw-bg-' + card.accentColor + '-500'\"\n [style.width]=\"card.progress\"></div>\n </div>\n </div>\n <div *ngSwitchCase=\"'quickStats'\" class=\"tw-space-y-3.5 tw-flex-grow\">\n <h2 class=\"tw-text-base tw-font-bold tw-mb-3 tw-border-b tw-border-gray-200/80 tw-pb-2\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-700'\">{{card.title}}</h2>\n <div *ngFor=\"let stat of card.stats\" class=\"tw-text-sm\">\n <div *ngIf=\"stat.gradient\" class=\"tw-text-sm\">\n <div class=\"tw-flex tw-justify-between tw-items-center tw-mb-0.5\">\n <p class=\"tw-text-gray-600 tw-font-medium\">{{stat.label}}</p>\n <p class=\"tw-text-xs tw-text-green-600 tw-font-semibold\">{{stat.value}}</p>\n </div>\n <div class=\"tw-w-full tw-bg-gray-200 tw-rounded-full tw-h-2\">\n <div class=\"tw-h-2 tw-rounded-full\" [ngClass]=\"stat.gradient\"\n [style.width]=\"stat.value\"></div>\n </div>\n </div>\n <div *ngIf=\"!stat.gradient\">\n <p class=\"tw-text-gray-600 tw-font-medium tw-mb-0.5\">{{stat.label}}</p>\n <p [ngClass]=\"stat.valueClass || ''\">{{stat.value}}</p>\n </div>\n </div>\n </div>\n <ul *ngSwitchCase=\"'discussions'\">\n <li *ngFor=\"let item of card.items\" class=\"tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <a href=\"#\" class=\"tw-block group\">\n <p class=\"tw-font-medium tw-text-gray-700\"\n [ngClass]=\"'group-hover:tw-text-' + card.accentColor + '-700'\">{{item.topic}}\n </p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.forum}} - Last post: {{item.lastPost}}\n </p>\n </a>\n </li>\n </ul>\n <ul *ngSwitchCase=\"'quickLinks'\">\n <li *ngFor=\"let item of card.items\"><a href=\"#\"\n class=\"tw-flex tw-items-center tw-p-2 tw-rounded-lg tw-text-gray-700 tw-transition-colors\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70 hover:tw-text-' + card.accentColor + '-700'\"><svg\n class=\"tw-w-4 tw-h-4 tw-mr-2\" [ngClass]=\"'tw-text-' + card.accentColor + '-500'\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n [innerHTML]=\"item.safeIconSVG\"></svg>{{item.text}}</a></li>\n </ul>\n </ng-container>\n </div>\n\n <a *ngIf=\"card.link\" [href]=\"card.link.href\"\n class=\"tw-mt-auto tw-pt-3 tw-text-xs tw-font-medium tw-w-full tw-text-left hover:tw-underline\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-600 hover:tw-text-' + card.accentColor + '-800'\">\n {{card.link.text}}\n </a>\n </div>\n </div>\n </main>\n</div>"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud-ide-layout-home-wrapper.component-DyFnB93U.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/layout/home/home-wrapper/home-wrapper.component.ts","../../../projects/cloud-ide-layout/src/lib/layout/home/home-wrapper/home-wrapper.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { CideLytSharedWrapperComponent, CideLytSharedWrapperSetupParam } from '../../shared/shared-wrapper/shared-wrapper.component';\nimport { Component, OnInit, ElementRef, ViewChild, AfterViewInit, Renderer2, inject, ChangeDetectorRef, Signal, signal, input, computed, effect } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { CideLytSidebarService } from '../../sidebar/sidebar.service';\nimport { menuResponseData } from 'cloud-ide-lms-model';\nimport { CideIconComponent, CideSpinnerComponent } from 'cloud-ide-element';\nimport { TooltipDirective } from 'cloud-ide-element';\nimport { CideLytRequestService } from '../../request/request.service';\nimport { AppStateHelperService } from '../../../services/app-state/app-state-helper.service';\nimport { Router } from '@angular/router';\nimport { DashboardCardsService } from '../../../services/dashboard-cards.service';\nimport { CoreDashboardCards } from 'cloud-ide-lms-model';\n\n// --- Interfaces for our data structures ---\ninterface CardItem {\n text?: string;\n title?: string;\n subtext?: string;\n details?: string;\n subject?: string;\n grade?: string;\n color?: string;\n name?: string;\n officeHours?: string;\n messageLink?: string;\n appointmentLink?: string;\n professor?: string;\n colorTheme?: string;\n date?: { month: string; day: string };\n themeColor?: string;\n topic?: string;\n forum?: string;\n lastPost?: string;\n iconSVG?: string;\n safeIconSVG?: SafeHtml;\n}\n\ninterface CardStat {\n label: string;\n value: string;\n gradient?: string;\n valueClass?: string;\n}\n\ninterface Card {\n id: string;\n title: string;\n type: string;\n colSpan: string;\n accentColor: string;\n urgentText?: string;\n insightTag?: string;\n items?: CardItem[];\n stats?: CardStat[];\n progress?: string;\n description?: string;\n link?: { text: string; href: string };\n}\n\ninterface ModulesSectionConfig {\n title: string;\n viewAllLinkText: string;\n viewAllLinkHref: string;\n showViewAllLink: boolean;\n}\n\n@Component({\n selector: 'cide-lyt-home-wrapper',\n imports: [CommonModule, CideIconComponent, TooltipDirective, CideSpinnerComponent],\n templateUrl: './home-wrapper.component.html',\n styleUrl: './home-wrapper.component.css',\n styles: [`\n :host {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n }\n `]\n})\nexport class CideLytHomeWrapperComponent extends CideLytSharedWrapperComponent implements OnInit, AfterViewInit {\n public override shared_wrapper_setup_param = input<Partial<CideLytSharedWrapperSetupParam>>({\n sypg_page_code: \"cide_lyt_home\"\n });\n\n private readonly sidebarService = inject(CideLytSidebarService);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly renderer = inject(Renderer2);\n private readonly cdr = inject(ChangeDetectorRef);\n protected override appState = inject(AppStateHelperService);\n protected override router = inject(Router);\n private readonly dashboardCardsService = inject(DashboardCardsService);\n\n private moduleStylePresets = [\n { accentColor: \"#8B5CF6\" }, // purple\n { accentColor: \"#EC4899\" }, // pink\n { accentColor: \"#14B8A6\" }, // teal\n { accentColor: \"#0EA5E9\" }, // sky\n { accentColor: \"#F59E42\" }, // orange\n { accentColor: \"#6366F1\" }, // indigo\n { accentColor: \"#22C55E\" }, // green\n { accentColor: \"#EF4444\" }, // red\n { accentColor: \"#F59E0B\" }, // amber\n { accentColor: \"#10B981\" }, // emerald\n { accentColor: \"#06B6D4\" }, // cyan\n { accentColor: \"#6B7280\" }, // gray\n { accentColor: \"#8B5CF6\" }, // violet (same as purple for fallback)\n { accentColor: \"#D946EF\" } // fuchsia\n ];\n\n\n @ViewChild('cardsContainerEl') cardsContainerElRef!: ElementRef<HTMLDivElement>;\n\n modulesSectionConfig: ModulesSectionConfig = {\n title: \"Subscribed Modules\",\n viewAllLinkText: \"View All Modules &rarr;\",\n viewAllLinkHref: \"#all-modules\",\n showViewAllLink: false\n };\n\n modulesData: (menuResponseData & { accentColor?: string; pillCount?: number })[] = [];\n draggedItem: HTMLElement | null = null;\n placeholder: HTMLElement | null = null;\n\n // Loading states\n isLoadingModules = signal<boolean>(true);\n isLoadingCards = signal<boolean>(true);\n\n // Computed signal for overall loading state\n isLoading = computed(() => this.isLoadingModules() || this.isLoadingCards());\n\n // Track which module is currently being opened (to show loader/prevent multiple clicks)\n isOpeningModule = signal<string | null>(null);\n\n // Dashboard cards data\n public cardsData: Card[] = [];\n\n // Track previous entity ID for change detection\n private previousEntityId: string | null = null;\n // Flag to prevent multiple simultaneous API calls\n private isModuleLoadInProgress = false;\n // Debounce timer for entity change\n private entityChangeDebounceTimer: any = null;\n\n constructor() {\n super();\n // Sanitize SVG icons in the hardcoded cardsData\n this.cardsData = this.cardsData.map(card => ({\n ...card,\n items: card.items?.map(item => ({\n ...item,\n safeIconSVG: item.iconSVG ? this.sanitizer.bypassSecurityTrustHtml(item.iconSVG) : undefined\n }))\n }));\n\n // React to active entity changes - reload modules when entity changes\n effect(() => {\n const activeEntity = this.appState.activeEntity();\n const currentEntityId = activeEntity?._id || null;\n\n // Skip on initial load (when previousEntityId is null)\n if (this.previousEntityId === null) {\n this.previousEntityId = currentEntityId;\n console.log('🏢 HOME: Entity change handler initialized with initial entity:', currentEntityId);\n return;\n }\n\n // Only reload if entity actually changed and no load is in progress\n if (this.previousEntityId !== currentEntityId && currentEntityId !== null && !this.isModuleLoadInProgress) {\n console.log('🏢 HOME: Entity changed from', this.previousEntityId, 'to', currentEntityId, '- reloading modules');\n this.previousEntityId = currentEntityId;\n\n // Clear any existing debounce timer\n if (this.entityChangeDebounceTimer) {\n clearTimeout(this.entityChangeDebounceTimer);\n }\n\n // Debounce the API call to prevent multiple rapid calls\n this.entityChangeDebounceTimer = setTimeout(() => {\n // Reload modules when entity changes (menu API call)\n this.loadModules();\n this.entityChangeDebounceTimer = null;\n }, 100); // 100ms debounce\n\n } else if (this.previousEntityId !== null && currentEntityId === null) {\n // Entity was cleared\n console.log('🏢 HOME: Entity cleared');\n this.previousEntityId = null;\n this.modulesData = [];\n this.isLoadingModules.set(false);\n } else if (this.isModuleLoadInProgress) {\n console.log('⏭️ HOME: Module load already in progress, skipping duplicate call');\n }\n });\n }\n\n override ngOnInit(): void {\n super.ngOnInit?.();\n // Set loading states to true initially\n this.isLoadingModules.set(true);\n this.isLoadingCards.set(true);\n\n this.loadModules();\n this.loadDashboardCards();\n }\n\n openModule(module: menuResponseData) {\n if (this.isOpeningModule()) return; // Prevent double clicks\n\n console.log(module, \"module\");\n\n // Set active module immediately (optimistic UI update)\n this.appState.setActiveModule(module);\n\n // If no ID, fallback to default navigation\n if (!module._id) {\n this.router.navigate([`/control-panel/${module.syme_path}`]);\n return;\n }\n\n this.isOpeningModule.set(module._id);\n\n // Fetch menus for this module to find the first navigable route\n this.sidebarService.getSidebarMenues({\n syme_id: module._id,\n sort: 'asc'\n }).subscribe({\n next: (res) => {\n const menus = res?.data || [];\n let targetPath = module.syme_path; // Default fallback\n\n // Helper to find the first valid path in the menu tree\n // We look for the first leaf node recursively\n const firstNavigableMenu = this.findFirstLeafMenu(menus);\n\n if (firstNavigableMenu) {\n console.log(`Redirecting to first menu item: ${firstNavigableMenu.syme_title} (${firstNavigableMenu.syme_path})`);\n targetPath = firstNavigableMenu.syme_path;\n } else {\n console.log('No specific menu items found, using default module path');\n }\n\n this.router.navigate([`/control-panel/${targetPath}`]).then(() => {\n this.isOpeningModule.set(null);\n });\n },\n error: (err) => {\n console.error(\"Error loading menus for navigation:\", err);\n // Fallback to default module path on error\n this.router.navigate([`/control-panel/${module.syme_path}`]).then(() => {\n this.isOpeningModule.set(null);\n });\n }\n });\n }\n\n private findFirstLeafMenu(menus: menuResponseData[]): menuResponseData | null {\n for (const menu of menus) {\n // If it has children, search deeper first\n if (menu.children && menu.children.length > 0) {\n const leaf = this.findFirstLeafMenu(menu.children);\n if (leaf) {\n return leaf;\n }\n } else {\n // It's a leaf node. Check if it has a valid path.\n if (menu.syme_path && menu.syme_path.trim() !== '') {\n return menu;\n }\n }\n }\n return null;\n }\n\n ngAfterViewInit(): void {\n this.setupDragAndDrop();\n }\n\n private loadModules(): void {\n // Prevent multiple simultaneous calls\n if (this.isModuleLoadInProgress) {\n console.log('⏭️ HOME: Module load already in progress, skipping duplicate call');\n return;\n }\n\n this.isModuleLoadInProgress = true;\n this.isLoadingModules.set(true);\n\n this.sidebarService?.getSidebarMenues({\n syme_type: \"module\",\n sort: 'asc',\n syme_title: \"\"\n })?.subscribe({\n next: (res) => {\n const fetchedApiModules = res?.data || [];\n this.modulesData = fetchedApiModules.map((item: menuResponseData, index: number) => {\n const stylePreset = this.moduleStylePresets[index % this.moduleStylePresets.length];\n const insightCount = item.syme_ping_count || 0;\n return {\n ...item,\n accentColor: stylePreset.accentColor, // UI-only property\n pillCount: insightCount, // UI-only property\n };\n });\n this.isLoadingModules.set(false);\n this.isModuleLoadInProgress = false;\n this.cdr.detectChanges();\n },\n error: (err) => {\n console.error('Error loading sidebar modules:', err);\n this.modulesData = [];\n this.isLoadingModules.set(false);\n this.isModuleLoadInProgress = false;\n this.cdr.detectChanges();\n }\n });\n }\n\n private loadDashboardCards(): void {\n this.isLoadingCards.set(true);\n this.dashboardCardsService.getDashboardCardsList({}).subscribe({\n next: (response) => {\n if (response.success && response.data) {\n // Filter only visible cards\n const visibleCards = response.data.filter(card => card.cdc_visible !== false && card.cdc_isactive !== false);\n\n // Convert database cards to display format\n this.cardsData = visibleCards.map((card) => {\n const colSpanMap: { [key: number]: string } = {\n 1: \"md:tw-col-span-1 xl:tw-col-span-1\",\n 2: \"md:tw-col-span-2 xl:tw-col-span-2\",\n 3: \"md:tw-col-span-3 xl:tw-col-span-3\",\n 4: \"md:tw-col-span-4 xl:tw-col-span-4\"\n };\n\n return {\n id: card._id || `card-${Date.now()}`,\n title: card.cdc_title || 'Untitled Card',\n type: card.cdc_type || 'custom',\n colSpan: colSpanMap[card.cdc_position?.colspan || 1] || \"md:tw-col-span-1 xl:tw-col-span-1\",\n accentColor: card.cdc_color || 'blue',\n description: card.cdc_description,\n // You can extend this to load actual data from the API endpoint\n items: [],\n stats: []\n } as Card;\n });\n\n // Sort by position\n this.cardsData.sort((a, b) => {\n const cardA = visibleCards.find(c => c._id === a.id);\n const cardB = visibleCards.find(c => c._id === b.id);\n const posA = cardA?.cdc_position || { row: 999, col: 999 };\n const posB = cardB?.cdc_position || { row: 999, col: 999 };\n const rowA = posA.row ?? 999;\n const rowB = posB.row ?? 999;\n const colA = posA.col ?? 999;\n const colB = posB.col ?? 999;\n if (rowA !== rowB) return rowA - rowB;\n return colA - colB;\n });\n\n this.isLoadingCards.set(false);\n this.cdr.detectChanges();\n } else {\n this.isLoadingCards.set(false);\n this.loadDefaultCards();\n }\n },\n error: (error) => {\n console.error('Error loading dashboard cards:', error);\n // Fallback to default cards if API fails\n this.isLoadingCards.set(false);\n this.loadDefaultCards();\n }\n });\n }\n\n private loadDefaultCards(): void {\n // Fallback default cards if database is empty or API fails\n this.cardsData = [\n { id: \"card1\", title: \"Welcome\", type: \"custom\", colSpan: \"md:tw-col-span-2 xl:tw-col-span-3\", accentColor: \"blue\", description: \"Welcome to your dashboard\" }\n ];\n this.cdr.detectChanges();\n }\n\n\n setupDragAndDrop(): void {\n const cardsContainer = this.cardsContainerElRef?.nativeElement;\n if (!cardsContainer) return;\n this.placeholder = this.renderer.createElement('div');\n this.renderer.addClass(this.placeholder!, 'drag-over-placeholder');\n this.renderer.listen(cardsContainer, 'dragstart', (e: DragEvent) => {\n const target = e.target as HTMLElement;\n if (target.classList.contains('dashboard-card')) {\n this.draggedItem = target;\n // Modern ES2022+ pattern: Use microtask for immediate execution\n Promise.resolve().then(() => this.renderer.addClass(target, 'dragging'));\n e.dataTransfer?.setData('text/plain', target.id || 'draggable-card');\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n }\n });\n this.renderer.listen(cardsContainer, 'dragend', () => {\n if (this.draggedItem) this.renderer.removeClass(this.draggedItem, 'dragging');\n if (this.placeholder?.parentNode) this.renderer.removeChild(this.placeholder.parentNode, this.placeholder);\n this.draggedItem = null;\n });\n this.renderer.listen(cardsContainer, 'dragover', (e: DragEvent) => {\n e.preventDefault();\n if (!this.draggedItem) return;\n const target = (e.target as HTMLElement).closest('.dashboard-card') as HTMLElement | null;\n if (target && target !== this.draggedItem) {\n const rect = target.getBoundingClientRect();\n const offsetY = e.clientY - rect.top;\n if (offsetY > rect.height / 2) {\n this.renderer.insertBefore(cardsContainer, this.placeholder!, target.nextSibling);\n } else {\n this.renderer.insertBefore(cardsContainer, this.placeholder!, target);\n }\n }\n });\n this.renderer.listen(cardsContainer, 'drop', (e: DragEvent) => {\n e.preventDefault();\n if (this.draggedItem && this.placeholder?.parentNode) {\n this.renderer.insertBefore(this.placeholder.parentNode, this.draggedItem, this.placeholder);\n }\n if (this.placeholder?.parentNode) this.renderer.removeChild(this.placeholder.parentNode, this.placeholder);\n if (this.draggedItem) this.renderer.removeClass(this.draggedItem, 'dragging');\n this.draggedItem = null;\n });\n }\n}\n","<!-- Fullscreen Loader Overlay -->\n@if (isLoading()) {\n<div class=\"tw-fixed tw-inset-0 tw-z-[9999] tw-backdrop-blur-sm tw-flex tw-items-center tw-justify-center\">\n <div class=\"tw-text-center\">\n <cide-ele-spinner size=\"sm\" type=\"spinner\"></cide-ele-spinner>\n <p class=\"tw-mt-4 tw-text-gray-600 dark:tw-text-gray-300 tw-text-sm tw-font-medium\">Loading dashboard...</p>\n </div>\n</div>\n}\n\n<div class=\"tw-p-3 sm:tw-p-6 md:tw-p-8 tw-w-full\" [class.tw-opacity-0]=\"isLoading()\"\n [class.tw-transition-opacity]=\"!isLoading()\">\n <header class=\"tw-mb-6 md:tw-mb-10\">\n <h1\n class=\"tw-text-2xl sm:tw-text-3xl md:tw-text-4xl tw-font-bold tw-text-transparent tw-bg-clip-text tw-bg-gradient-to-r tw-from-purple-600 tw-via-pink-500 tw-to-orange-500 tw-leading-tight\">\n Welcome, {{ appState.getUserName() || 'User' }}!\n </h1>\n <p class=\"tw-text-xs sm:tw-text-sm tw-text-gray-500 tw-mt-1\">Your central hub for all things college.</p>\n <p *ngIf=\"appState.getUserEmail()\" class=\"tw-text-[10px] sm:tw-text-xs tw-text-gray-400 tw-mt-1\">{{\n appState.getUserEmail() }}</p>\n </header>\n\n <div class=\"tw-mb-8 md:tw-mb-10\">\n <div class=\"tw-flex tw-justify-between tw-items-center tw-mb-5\">\n <h2 class=\"tw-text-sm sm:tw-text-base tw-font-bold tw-text-gray-700\">{{ modulesSectionConfig.title }}</h2>\n <div class=\"tw-flex tw-items-center tw-gap-3\">\n <a *ngIf=\"modulesSectionConfig.showViewAllLink\" [href]=\"modulesSectionConfig.viewAllLinkHref\"\n class=\"tw-text-sm tw-font-medium tw-text-purple-600 hover:tw-text-purple-800 hover:tw-underline tw-transition-colors\">\n {{ modulesSectionConfig.viewAllLinkText }}\n </a>\n </div>\n </div>\n <!-- Grid View -->\n <div class=\"tw-grid tw-grid-cols-2 sm:tw-grid-cols-2 lg:tw-grid-cols-3 xl:tw-grid-cols-4 tw-gap-2.5\">\n <a *ngFor=\"let module of modulesData\" (click)=\"openModule(module)\" (keydown.enter)=\"openModule(module)\"\n (keydown.space)=\"openModule(module)\"\n class=\"module-card tw-relative tw-overflow-hidden group tw-w-full tw-h-22 md:tw-h-28 tw-bg-white tw-border tw-border-gray-200/80 tw-rounded-xl tw-p-1.5 md:tw-p-3 tw-shadow-md hover:tw-shadow-xl tw-transition-all tw-duration-300 tw-ease-out tw-flex tw-items-center tw-space-x-2 md:tw-space-x-4\"\n [style.--accent-color]=\"module.accentColor\" tabindex=\"0\" role=\"button\"\n [attr.aria-label]=\"'Open module: ' + module.syme_title\">\n <div class=\"tw-relative tw-flex-shrink-0\">\n <div class=\"tw-w-10 tw-h-10 md:tw-w-16 md:tw-h-16 tw-rounded-lg tw-flex tw-items-center tw-justify-center tw-transition-all tw-duration-300 group-hover:tw-scale-105\"\n [style.backgroundColor]=\"module?.accentColor + '22'\">\n <cide-ele-icon class=\"mpro-icon-field\" type=\"none\">{{module?.syme_icon}}</cide-ele-icon>\n </div>\n <div *ngIf=\"(module?.pillCount || 0) > 0\" class=\"tw-absolute tw--top-1.5 tw--right-1.5\">\n <span\n class=\"tw-flex tw-h-5 tw-w-5 tw-items-center tw-justify-center tw-rounded-full tw-text-white tw-text-xs tw-font-bold tw-ring-2 tw-ring-white\"\n [style.backgroundColor]=\"module?.accentColor\">{{module?.pillCount}}</span>\n </div>\n </div>\n <div class=\"tw-flex tw-flex-col tw-flex-grow tw-min-w-0\">\n <h4 class=\"tw-font-bold tw-text-xs md:tw-text-sm tw-text-gray-800 tw-truncate line-clamp-1\"\n cideEleTooltip [cideEleTooltip]=\"module.syme_title\" [tooltipDelay]=\"300\"\n [tooltipPlacement]=\"'top'\">\n {{module?.syme_title}}\n </h4>\n <p\n class=\"tw-text-[10px] md:tw-text-xs tw-text-gray-400 tw-mt-0.5 tw-overflow-hidden tw-text-ellipsis tw-line-clamp-2 min-h-[1.5rem] md:min-h-[2.5rem] tw-leading-tight\">\n {{module?.syme_desc}}\n </p>\n </div>\n\n <!-- Loading Overlay -->\n <div *ngIf=\"isOpeningModule() === module._id\"\n class=\"tw-absolute tw-inset-0 tw-z-10 tw-bg-white/60 tw-backdrop-blur-[1px] tw-flex tw-items-center tw-justify-center tw-rounded-xl tw-transition-all tw-duration-200\">\n <cide-ele-spinner size=\"sm\" type=\"spinner\"></cide-ele-spinner>\n </div>\n </a>\n </div>\n </div>\n\n <main class=\"tw--mt-8 md:tw--mt-10\">\n <div #cardsContainerEl class=\"tw-grid tw-grid-cols-1 md:tw-grid-cols-2 xl:tw-grid-cols-3 tw-gap-5\">\n <div *ngFor=\"let card of cardsData\" draggable=\"true\" [id]=\"card.id\"\n class=\"dashboard-card tw-bg-white tw-border tw-border-gray-200/70 tw-rounded-xl tw-p-4 tw-shadow-lg hover:tw-shadow-xl hover:tw--translate-y-0.5 tw-transition-all tw-cursor-grab\"\n [ngClass]=\"card.colSpan || 'tw-col-span-1'\">\n\n <div *ngIf=\"card.type !== 'studyStreak' && card.type !== 'quickStats'\"\n class=\"tw-flex tw-justify-between tw-items-center tw-mb-3\">\n <h3 class=\"tw-text-base tw-font-bold\" [ngClass]=\"'tw-text-' + card.accentColor + '-700'\">\n {{card.title}}</h3>\n <span *ngIf=\"card.urgentText\"\n class=\"tw-text-xs tw-bg-red-100 tw-text-red-700 tw-px-2.5 tw-py-1 tw-rounded-full tw-font-semibold\">{{card.urgentText}}</span>\n <span *ngIf=\"card.insightTag\" class=\"tw-text-xs tw-px-2.5 tw-py-1 tw-rounded-full tw-font-semibold\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-100 tw-text-' + card.accentColor + '-700'\">{{card.insightTag}}</span>\n </div>\n\n <div class=\"card-content-area tw-space-y-3 tw-text-sm tw-pr-1\">\n <ng-container [ngSwitch]=\"card.type\">\n <ul *ngSwitchCase=\"'deadlines'\">\n <li *ngFor=\"let item of card.items\"\n class=\"tw-flex tw-justify-between tw-items-center tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <div>\n <p class=\"tw-text-gray-700 tw-font-medium\">{{item.text}}</p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.subtext}}</p>\n </div>\n </li>\n </ul>\n <ul *ngSwitchCase=\"'news'\">\n <li *ngFor=\"let item of card.items\" class=\"tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <p class=\"tw-font-medium tw-text-gray-800\">{{item.title}}</p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.details}}</p>\n </li>\n </ul>\n <ul *ngSwitchCase=\"'grades'\">\n <li *ngFor=\"let item of card.items\"\n class=\"tw-flex tw-justify-between tw-items-center tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <span class=\"tw-text-gray-700\">{{item.subject}}</span><span class=\"tw-font-bold\"\n [ngClass]=\"item.color\">{{item.grade}}</span>\n </li>\n </ul>\n <ul *ngSwitchCase=\"'professorConnect'\">\n <li *ngFor=\"let item of card.items\" class=\"tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <p class=\"tw-font-medium tw-text-gray-700\">{{item.name}}</p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.officeHours}}</p><a\n *ngIf=\"item.messageLink\" [href]=\"item.messageLink\"\n class=\"tw-text-xs hover:tw-underline\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-600'\">Send Message</a><a\n *ngIf=\"item.appointmentLink\" [href]=\"item.appointmentLink\"\n class=\"tw-text-xs hover:tw-underline tw-ml-2\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-600'\">Book Appointment</a>\n </li>\n </ul>\n <div *ngSwitchCase=\"'courses'\" class=\"tw-grid tw-grid-cols-1 sm:tw-grid-cols-2 tw-gap-2.5\"><a\n *ngFor=\"let item of card.items\" href=\"#\"\n class=\"tw-block tw-p-2.5 tw-rounded-lg tw-transition-all group tw-ring-1\"\n [ngClass]=\"'tw-bg-' + item.colorTheme + '-50/70 hover:tw-bg-' + item.colorTheme + '-100/80 tw-ring-' + item.colorTheme + '-200/70 hover:tw-ring-' + item.colorTheme + '-300'\">\n <p class=\"tw-font-semibold group-hover:tw-text-{{item.colorTheme}}-800\"\n [ngClass]=\"'tw-text-' + item.colorTheme + '-700'\">{{item.name}}</p>\n <p class=\"tw-text-xs group-hover:tw-text-{{item.colorTheme}}-600 tw-mt-0.5\"\n [ngClass]=\"'tw-text-' + item.colorTheme + '-500'\">{{item.professor}}</p>\n </a></div>\n <ul *ngSwitchCase=\"'events'\">\n <li *ngFor=\"let item of card.items\"\n class=\"tw-flex tw-items-start tw-space-x-2.5 tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <div class=\"tw-text-white tw-text-xs tw-font-bold tw-p-2 tw-rounded-md tw-flex tw-flex-col tw-items-center tw-justify-center tw-w-12 tw-h-12 tw-flex-shrink-0 tw-shadow\"\n [ngClass]=\"item.themeColor\"><span>{{item.date?.month}}</span><span\n class=\"tw-text-sm\">{{item.date?.day}}</span></div>\n <div>\n <p class=\"tw-text-gray-700 tw-font-medium\">{{item.title}}</p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.details}}</p>\n </div>\n </li>\n </ul>\n <div *ngSwitchCase=\"'studyStreak'\"\n class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-text-center tw-flex-grow tw-p-4\">\n <svg class=\"tw-w-12 tw-h-12 tw-mb-2\" [ngClass]=\"'tw-text-' + card.accentColor + '-500'\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M17.657 18.657A8 8 0 016.343 7.343S7 9 9 10c0-2 .5-5 2.986-7.014A8.003 8.003 0 0122 12c0 3-1 7-6.657 7.343A7.975 7.975 0 0117.657 18.657z\">\n </path>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M9.879 16.121A3 3 0 1012.015 11L11 14H9c0 .768.293 1.536.879 2.121z\"></path>\n </svg>\n <h3 class=\"tw-text-base tw-font-bold tw-mb-1\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-600'\">{{card.title}}</h3>\n <p class=\"tw-text-xs tw-text-gray-500\">{{card.description}}</p>\n <div class=\"tw-mt-3 tw-w-full tw-bg-gray-200 tw-rounded-full tw-h-1.5\">\n <div class=\"tw-h-1.5 tw-rounded-full\" [ngClass]=\"'tw-bg-' + card.accentColor + '-500'\"\n [style.width]=\"card.progress\"></div>\n </div>\n </div>\n <div *ngSwitchCase=\"'quickStats'\" class=\"tw-space-y-3.5 tw-flex-grow\">\n <h2 class=\"tw-text-base tw-font-bold tw-mb-3 tw-border-b tw-border-gray-200/80 tw-pb-2\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-700'\">{{card.title}}</h2>\n <div *ngFor=\"let stat of card.stats\" class=\"tw-text-sm\">\n <div *ngIf=\"stat.gradient\" class=\"tw-text-sm\">\n <div class=\"tw-flex tw-justify-between tw-items-center tw-mb-0.5\">\n <p class=\"tw-text-gray-600 tw-font-medium\">{{stat.label}}</p>\n <p class=\"tw-text-xs tw-text-green-600 tw-font-semibold\">{{stat.value}}</p>\n </div>\n <div class=\"tw-w-full tw-bg-gray-200 tw-rounded-full tw-h-2\">\n <div class=\"tw-h-2 tw-rounded-full\" [ngClass]=\"stat.gradient\"\n [style.width]=\"stat.value\"></div>\n </div>\n </div>\n <div *ngIf=\"!stat.gradient\">\n <p class=\"tw-text-gray-600 tw-font-medium tw-mb-0.5\">{{stat.label}}</p>\n <p [ngClass]=\"stat.valueClass || ''\">{{stat.value}}</p>\n </div>\n </div>\n </div>\n <ul *ngSwitchCase=\"'discussions'\">\n <li *ngFor=\"let item of card.items\" class=\"tw-p-2.5 tw-rounded-lg\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70'\">\n <a href=\"#\" class=\"tw-block group\">\n <p class=\"tw-font-medium tw-text-gray-700\"\n [ngClass]=\"'group-hover:tw-text-' + card.accentColor + '-700'\">{{item.topic}}\n </p>\n <p class=\"tw-text-xs tw-text-gray-500\">{{item.forum}} - Last post: {{item.lastPost}}\n </p>\n </a>\n </li>\n </ul>\n <ul *ngSwitchCase=\"'quickLinks'\">\n <li *ngFor=\"let item of card.items\"><a href=\"#\"\n class=\"tw-flex tw-items-center tw-p-2 tw-rounded-lg tw-text-gray-700 tw-transition-colors\"\n [ngClass]=\"'tw-bg-' + card.accentColor + '-50/60 hover:tw-bg-' + card.accentColor + '-100/70 hover:tw-text-' + card.accentColor + '-700'\"><svg\n class=\"tw-w-4 tw-h-4 tw-mr-2\" [ngClass]=\"'tw-text-' + card.accentColor + '-500'\"\n fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"\n [innerHTML]=\"item.safeIconSVG\"></svg>{{item.text}}</a></li>\n </ul>\n </ng-container>\n </div>\n\n <a *ngIf=\"card.link\" [href]=\"card.link.href\"\n class=\"tw-mt-auto tw-pt-3 tw-text-xs tw-font-medium tw-w-full tw-text-left hover:tw-underline\"\n [ngClass]=\"'tw-text-' + card.accentColor + '-600 hover:tw-text-' + card.accentColor + '-800'\">\n {{card.link.text}}\n </a>\n </div>\n </div>\n </main>\n</div>"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { cidePath, hostManagerRoutesUrl, coreRoutesUrl } from 'cloud-ide-lms-mod
9
9
  import { of } from 'rxjs';
10
10
  import { map } from 'rxjs/operators';
11
11
  import { CideInputComponent, CideEleButtonComponent, CideTextareaComponent } from 'cloud-ide-element';
12
- import { b as CideLytSidedrawerService, A as AppStateHelperService } from './cloud-ide-layout-cloud-ide-layout-DgwU-sCr.mjs';
12
+ import { b as CideLytSidedrawerService, A as AppStateHelperService } from './cloud-ide-layout-cloud-ide-layout-HmeFdi-u.mjs';
13
13
 
14
14
  class CideLytDrawerNotesService {
15
15
  // Modern Angular v20 dependency injection pattern
@@ -253,4 +253,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
253
253
  }] });
254
254
 
255
255
  export { CideLytSidedrawerNotesComponent };
256
- //# sourceMappingURL=cloud-ide-layout-sidedrawer-notes.component-DVj6eU3V.mjs.map
256
+ //# sourceMappingURL=cloud-ide-layout-sidedrawer-notes.component-Sb7czuvE.mjs.map