cloud-ide-layout 1.0.136 → 1.0.137

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 (16) hide show
  1. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-CkYksc6R.mjs → cloud-ide-layout-cloud-ide-layout-CgeT5vL1.mjs} +20 -6
  2. package/fesm2022/cloud-ide-layout-cloud-ide-layout-CgeT5vL1.mjs.map +1 -0
  3. package/fesm2022/{cloud-ide-layout-dashboard-manager.component-BDqOLP6_.mjs → cloud-ide-layout-dashboard-manager.component-CqO9uo-w.mjs} +2 -2
  4. package/fesm2022/{cloud-ide-layout-dashboard-manager.component-BDqOLP6_.mjs.map → cloud-ide-layout-dashboard-manager.component-CqO9uo-w.mjs.map} +1 -1
  5. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BEu-E1nX.mjs → cloud-ide-layout-drawer-theme.component-D_SWxq_j.mjs} +2 -2
  6. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BEu-E1nX.mjs.map → cloud-ide-layout-drawer-theme.component-D_SWxq_j.mjs.map} +1 -1
  7. package/fesm2022/{cloud-ide-layout-floating-entity-selection.component-C6ZUJZN9.mjs → cloud-ide-layout-floating-entity-selection.component-CkjnmmDp.mjs} +2 -2
  8. package/fesm2022/{cloud-ide-layout-floating-entity-selection.component-C6ZUJZN9.mjs.map → cloud-ide-layout-floating-entity-selection.component-CkjnmmDp.mjs.map} +1 -1
  9. package/fesm2022/{cloud-ide-layout-home-wrapper.component-Cvyafnc-.mjs → cloud-ide-layout-home-wrapper.component-Bfq_l3Zx.mjs} +2 -2
  10. package/fesm2022/{cloud-ide-layout-home-wrapper.component-Cvyafnc-.mjs.map → cloud-ide-layout-home-wrapper.component-Bfq_l3Zx.mjs.map} +1 -1
  11. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-CtZeOFiG.mjs → cloud-ide-layout-sidedrawer-notes.component-efN19_PK.mjs} +2 -2
  12. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-CtZeOFiG.mjs.map → cloud-ide-layout-sidedrawer-notes.component-efN19_PK.mjs.map} +1 -1
  13. package/fesm2022/cloud-ide-layout.mjs +1 -1
  14. package/index.d.ts +4 -0
  15. package/package.json +1 -1
  16. package/fesm2022/cloud-ide-layout-cloud-ide-layout-CkYksc6R.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-ide-layout-home-wrapper.component-Cvyafnc-.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 } 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 constructor(private requestService: CideLytRequestService) {\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\n @ViewChild('modulesContainer') modulesContainerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('scrollPrevModuleBtn') scrollPrevModuleBtnRef!: ElementRef<HTMLButtonElement>;\n @ViewChild('scrollNextModuleBtn') scrollNextModuleBtnRef!: ElementRef<HTMLButtonElement>;\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: true\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 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 console.log(module, \"module\");\n // Set the active module in app state - this will trigger sidebar updates\n this.appState.setActiveModule(module);\n\n // Navigate to the module route\n // this.requestService.addTab(module.syme_title, `/control-panel/${module.syme_path}`);\n this.router.navigate([`/control-panel/${module.syme_path}`]);\n }\n\n ngAfterViewInit(): void {\n this.setupModuleScroller();\n this.setupDragAndDrop();\n }\n\n private loadModules(): void {\n this.isLoadingModules.set(true);\n this.sidebarService?.getSidebarMenues({ syme_type: \"module\", sort: 'asc', syme_title: \"\" })?.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.cdr.detectChanges();\n },\n error: (err) => {\n console.error('Error loading sidebar modules:', err);\n this.modulesData = [];\n this.isLoadingModules.set(false);\n this.cdr.detectChanges();\n }\n });\n }\n\n cardsData: Card[] = [];\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 setupModuleScroller(): void {\n const modulesContainer = this.modulesContainerRef?.nativeElement;\n const scrollPrevBtn = this.scrollPrevModuleBtnRef?.nativeElement;\n const scrollNextBtn = this.scrollNextModuleBtnRef?.nativeElement;\n if (modulesContainer && scrollPrevBtn && scrollNextBtn) {\n const scrollAmount = 256;\n const updateArrowStates = () => {\n if (!modulesContainer) return;\n scrollPrevBtn.disabled = modulesContainer.scrollLeft <= 0;\n scrollNextBtn.disabled = modulesContainer.scrollLeft + modulesContainer.clientWidth >= modulesContainer.scrollWidth - 1;\n };\n this.renderer.listen(scrollPrevBtn, 'click', () => modulesContainer.scrollBy({ left: -scrollAmount, behavior: 'smooth' }));\n this.renderer.listen(scrollNextBtn, 'click', () => modulesContainer.scrollBy({ left: scrollAmount, behavior: 'smooth' }));\n this.renderer.listen(modulesContainer, 'scroll', updateArrowStates);\n new ResizeObserver(updateArrowStates).observe(modulesContainer);\n setTimeout(updateArrowStates, 100);\n // Remove preventDefault for wheel/touchmove to allow mouse/touch scrolling\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-4 sm:tw-p-6 md:tw-p-8 tw-max-w-full tw-mx-auto\" [class.tw-opacity-0]=\"isLoading()\" [class.tw-transition-opacity]=\"!isLoading()\">\n <header class=\"tw-mb-8 md:tw-mb-10\">\n <h1\n class=\"tw-text-3xl sm: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\">\n Welcome, {{ appState.getUserName() || 'User' }}!\n </h1>\n <p class=\"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-xs tw-text-gray-400 tw-mt-1\">{{ 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-xl tw-font-bold tw-text-gray-700\">{{ modulesSectionConfig.title }}</h2>\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 class=\"tw-relative group/modules tw-max-w-full\">\n <button #scrollPrevModuleBtn aria-label=\"Scroll previous modules\"\n class=\"tw-absolute tw--left-4 tw-z-50 tw-p-2 tw-bg-white/90 tw-bg-opacity-90 tw-backdrop-blur-sm tw-rounded-full tw-shadow-lg hover:tw-bg-gray-100 tw-transition-all tw-opacity-100 md:group-hover/modules:tw-opacity-100 disabled:tw-opacity-30 disabled:tw-cursor-not-allowed tw-pointer-events-auto\"\n style=\"top: 2.875rem;\">\n <svg class=\"tw-w-5 tw-h-5 tw-text-gray-700\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"></path>\n </svg>\n </button>\n\n <div #modulesContainer\n class=\"tw-flex tw-space-x-4 tw-pb-6 tw-overflow-x-auto tw-overflow-y-visible tw-scroll-smooth tw-snap-x tw-snap-mandatory hide-scrollbar\"\n style=\"touch-action: none; pointer-events: auto;\">\n <a *ngFor=\"let module of modulesData\" \n (click)=\"openModule(module)\"\n (keydown.enter)=\"openModule(module)\"\n (keydown.space)=\"openModule(module)\"\n class=\"module-card tw-relative tw-overflow-hidden group tw-flex-shrink-0 tw-w-60 tw-h-28 tw-bg-white tw-border tw-border-gray-200/80 tw-rounded-xl 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-4 tw-snap-start\"\n [style.--accent-color]=\"module.accentColor\" \n tabindex=\"0\"\n 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-16 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 <!-- icon rendering here if needed -->\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-semibold tw-text-xs tw-text-gray-800 tw-truncate line-clamp-1\" cideEleTooltip\n [cideEleTooltip]=\"module.syme_title\" [tooltipDelay]=\"300\" [tooltipPlacement]=\"'top'\">\n {{module?.syme_title}}\n </h4>\n <p\n class=\"tw-text-xs tw-text-gray-400 tw-mt-0.5 tw-overflow-hidden tw-text-ellipsis tw-line-clamp-2 tw-text-justify min-h-[2.5rem]\">\n {{module?.syme_desc}}\n </p>\n </div>\n </a>\n </div>\n\n <button #scrollNextModuleBtn aria-label=\"Scroll next modules\"\n class=\"tw-absolute tw--right-4 tw-z-50 tw-p-2 tw-bg-white/90 tw-bg-opacity-90 tw-backdrop-blur-sm tw-rounded-full tw-shadow-lg hover:tw-bg-gray-100 tw-transition-all tw-opacity-100 md:group-hover/modules:tw-opacity-100 disabled:tw-opacity-30 disabled:tw-cursor-not-allowed tw-pointer-events-auto\"\n style=\"top: 2.875rem;\">\n <svg class=\"tw-w-5 tw-h-5 tw-text-gray-700\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n </button>\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-md tw-font-semibold\" [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-md tw-font-semibold 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-md tw-font-semibold 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":["i1.CideLytRequestService"],"mappings":"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"}
1
+ {"version":3,"file":"cloud-ide-layout-home-wrapper.component-Bfq_l3Zx.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 } 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 constructor(private requestService: CideLytRequestService) {\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\n @ViewChild('modulesContainer') modulesContainerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('scrollPrevModuleBtn') scrollPrevModuleBtnRef!: ElementRef<HTMLButtonElement>;\n @ViewChild('scrollNextModuleBtn') scrollNextModuleBtnRef!: ElementRef<HTMLButtonElement>;\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: true\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 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 console.log(module, \"module\");\n // Set the active module in app state - this will trigger sidebar updates\n this.appState.setActiveModule(module);\n\n // Navigate to the module route\n // this.requestService.addTab(module.syme_title, `/control-panel/${module.syme_path}`);\n this.router.navigate([`/control-panel/${module.syme_path}`]);\n }\n\n ngAfterViewInit(): void {\n this.setupModuleScroller();\n this.setupDragAndDrop();\n }\n\n private loadModules(): void {\n this.isLoadingModules.set(true);\n this.sidebarService?.getSidebarMenues({ syme_type: \"module\", sort: 'asc', syme_title: \"\" })?.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.cdr.detectChanges();\n },\n error: (err) => {\n console.error('Error loading sidebar modules:', err);\n this.modulesData = [];\n this.isLoadingModules.set(false);\n this.cdr.detectChanges();\n }\n });\n }\n\n cardsData: Card[] = [];\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 setupModuleScroller(): void {\n const modulesContainer = this.modulesContainerRef?.nativeElement;\n const scrollPrevBtn = this.scrollPrevModuleBtnRef?.nativeElement;\n const scrollNextBtn = this.scrollNextModuleBtnRef?.nativeElement;\n if (modulesContainer && scrollPrevBtn && scrollNextBtn) {\n const scrollAmount = 256;\n const updateArrowStates = () => {\n if (!modulesContainer) return;\n scrollPrevBtn.disabled = modulesContainer.scrollLeft <= 0;\n scrollNextBtn.disabled = modulesContainer.scrollLeft + modulesContainer.clientWidth >= modulesContainer.scrollWidth - 1;\n };\n this.renderer.listen(scrollPrevBtn, 'click', () => modulesContainer.scrollBy({ left: -scrollAmount, behavior: 'smooth' }));\n this.renderer.listen(scrollNextBtn, 'click', () => modulesContainer.scrollBy({ left: scrollAmount, behavior: 'smooth' }));\n this.renderer.listen(modulesContainer, 'scroll', updateArrowStates);\n new ResizeObserver(updateArrowStates).observe(modulesContainer);\n setTimeout(updateArrowStates, 100);\n // Remove preventDefault for wheel/touchmove to allow mouse/touch scrolling\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-4 sm:tw-p-6 md:tw-p-8 tw-max-w-full tw-mx-auto\" [class.tw-opacity-0]=\"isLoading()\" [class.tw-transition-opacity]=\"!isLoading()\">\n <header class=\"tw-mb-8 md:tw-mb-10\">\n <h1\n class=\"tw-text-3xl sm: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\">\n Welcome, {{ appState.getUserName() || 'User' }}!\n </h1>\n <p class=\"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-xs tw-text-gray-400 tw-mt-1\">{{ 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-xl tw-font-bold tw-text-gray-700\">{{ modulesSectionConfig.title }}</h2>\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 class=\"tw-relative group/modules tw-max-w-full\">\n <button #scrollPrevModuleBtn aria-label=\"Scroll previous modules\"\n class=\"tw-absolute tw--left-4 tw-z-50 tw-p-2 tw-bg-white/90 tw-bg-opacity-90 tw-backdrop-blur-sm tw-rounded-full tw-shadow-lg hover:tw-bg-gray-100 tw-transition-all tw-opacity-100 md:group-hover/modules:tw-opacity-100 disabled:tw-opacity-30 disabled:tw-cursor-not-allowed tw-pointer-events-auto\"\n style=\"top: 2.875rem;\">\n <svg class=\"tw-w-5 tw-h-5 tw-text-gray-700\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"></path>\n </svg>\n </button>\n\n <div #modulesContainer\n class=\"tw-flex tw-space-x-4 tw-pb-6 tw-overflow-x-auto tw-overflow-y-visible tw-scroll-smooth tw-snap-x tw-snap-mandatory hide-scrollbar\"\n style=\"touch-action: none; pointer-events: auto;\">\n <a *ngFor=\"let module of modulesData\" \n (click)=\"openModule(module)\"\n (keydown.enter)=\"openModule(module)\"\n (keydown.space)=\"openModule(module)\"\n class=\"module-card tw-relative tw-overflow-hidden group tw-flex-shrink-0 tw-w-60 tw-h-28 tw-bg-white tw-border tw-border-gray-200/80 tw-rounded-xl 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-4 tw-snap-start\"\n [style.--accent-color]=\"module.accentColor\" \n tabindex=\"0\"\n 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-16 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 <!-- icon rendering here if needed -->\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-semibold tw-text-xs tw-text-gray-800 tw-truncate line-clamp-1\" cideEleTooltip\n [cideEleTooltip]=\"module.syme_title\" [tooltipDelay]=\"300\" [tooltipPlacement]=\"'top'\">\n {{module?.syme_title}}\n </h4>\n <p\n class=\"tw-text-xs tw-text-gray-400 tw-mt-0.5 tw-overflow-hidden tw-text-ellipsis tw-line-clamp-2 tw-text-justify min-h-[2.5rem]\">\n {{module?.syme_desc}}\n </p>\n </div>\n </a>\n </div>\n\n <button #scrollNextModuleBtn aria-label=\"Scroll next modules\"\n class=\"tw-absolute tw--right-4 tw-z-50 tw-p-2 tw-bg-white/90 tw-bg-opacity-90 tw-backdrop-blur-sm tw-rounded-full tw-shadow-lg hover:tw-bg-gray-100 tw-transition-all tw-opacity-100 md:group-hover/modules:tw-opacity-100 disabled:tw-opacity-30 disabled:tw-cursor-not-allowed tw-pointer-events-auto\"\n style=\"top: 2.875rem;\">\n <svg class=\"tw-w-5 tw-h-5 tw-text-gray-700\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n </button>\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-md tw-font-semibold\" [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-md tw-font-semibold 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-md tw-font-semibold 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":["i1.CideLytRequestService"],"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 { c as CideLytSidedrawerService, A as AppStateHelperService } from './cloud-ide-layout-cloud-ide-layout-CkYksc6R.mjs';
12
+ import { c as CideLytSidedrawerService, A as AppStateHelperService } from './cloud-ide-layout-cloud-ide-layout-CgeT5vL1.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.1.7", ngImpor
253
253
  }] });
254
254
 
255
255
  export { CideLytSidedrawerNotesComponent };
256
- //# sourceMappingURL=cloud-ide-layout-sidedrawer-notes.component-CtZeOFiG.mjs.map
256
+ //# sourceMappingURL=cloud-ide-layout-sidedrawer-notes.component-efN19_PK.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-ide-layout-sidedrawer-notes.component-CtZeOFiG.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.ts","../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/cide-lyt-drawer-base.class.ts","../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.ts","../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.html"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { ICoreSypn, IPageNotesManagerCreateUpdateControllerRespoonse, IPageNotesManagerListControllerRespoonse, cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideLytDrawerNotesService {\r\n // Modern Angular v20 dependency injection pattern\r\n private http = inject(HttpClient);\r\n\r\n constructor() {\r\n // Modern Angular v20 pattern: Use constructor for initialization only\r\n }\r\n\r\n getNotes(): Observable<ICoreSypn[]> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.systemPageNotesManager\r\n ]);\r\n return this.http.get<IPageNotesManagerListControllerRespoonse>(url).pipe(map((res) => res.data || []));\r\n }\r\n\r\n addNote(note: ICoreSypn): Observable<unknown> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.systemPageNotesManager\r\n ]);\r\n return this.http.post<IPageNotesManagerCreateUpdateControllerRespoonse>(url, note).pipe(map((res) => res.data));\r\n }\r\n\r\n updateNote(note: ICoreSypn): Observable<unknown> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.systemPageNotesManager\r\n ]);\r\n return this.http.post<IPageNotesManagerCreateUpdateControllerRespoonse>(url, note).pipe(map((res) => res.data));\r\n }\r\n\r\n deleteNote(noteId: string): Observable<unknown> {\r\n // Mock implementation: simulate deleting a note.\r\n console.log('Deleting note with ID:', noteId);\r\n return of({ success: true });\r\n }\r\n\r\n // Additional methods for updating and deleting notes could be added here.\r\n // You might also include error handling or more complex data manipulation.\r\n}","import { Directive, OnInit, inject } from '@angular/core';\r\nimport { CideLytSidedrawerService } from './sidedrawer.service';\r\n\r\n@Directive()\r\nexport abstract class CideLytDrawerBase implements OnInit {\r\n private _pageId: string | null = null;\r\n private _themeId: string | null = null;\r\n protected sidedrawerService = inject(CideLytSidedrawerService);\r\n\r\n ngOnInit(): void {\r\n // Automatically initialize context from the service\r\n const pageId = this.sidedrawerService.pageId;\r\n const themeId = this.sidedrawerService.themeId;\r\n if (pageId && themeId) {\r\n this.setContext(pageId, themeId);\r\n }\r\n this.afterContextInit();\r\n }\r\n\r\n // Child classes can override this for additional setup\r\n protected afterContextInit(): void {}\r\n\r\n setContext(pageId: string, themeId: string) {\r\n this._pageId = pageId;\r\n this._themeId = themeId;\r\n }\r\n\r\n get pageId(): string | null {\r\n return this._pageId;\r\n }\r\n\r\n get themeId(): string | null {\r\n return this._themeId;\r\n }\r\n\r\n protected getStorageKey(suffix: string): string {\r\n return `drawer_${suffix}_${this._pageId || 'unknown'}`;\r\n }\r\n} ","import { CommonModule } from '@angular/common';\r\nimport { Component, OnInit, inject, signal } from '@angular/core';\r\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { CideLytDrawerNotesService } from './sidedrawer-notes.service';\r\nimport { ICoreSypn } from 'cloud-ide-lms-model';\r\nimport { CideInputComponent } from 'cloud-ide-element';\r\nimport { CideEleButtonComponent } from 'cloud-ide-element';\r\nimport { CideTextareaComponent } from 'cloud-ide-element';\r\nimport { AppStateHelperService } from '../../../services/app-state/app-state-helper.service';\r\nimport { CideLytDrawerBase } from '../cide-lyt-drawer-base.class';\r\n\r\nexport interface NewNoteModel {\r\n title: string;\r\n description: string;\r\n isPageSpecific: boolean;\r\n isUserSpecific: boolean;\r\n isEntitySpecific: boolean;\r\n isThemeSpecific: boolean;\r\n}\r\n\r\nexport interface NotesComponentState {\r\n newNoteModel: NewNoteModel;\r\n isFormVisible: boolean;\r\n scrollTop: number;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-lyt-sidedrawer-notes',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, CideInputComponent, CideEleButtonComponent, CideTextareaComponent],\r\n templateUrl: './sidedrawer-notes.component.html',\r\n styleUrl: './sidedrawer-notes.component.css'\r\n})\r\nexport class CideLytSidedrawerNotesComponent extends CideLytDrawerBase implements OnInit {\r\n private notesSignal = signal<ICoreSypn[]>([]);\r\n notes = this.notesSignal.asReadonly();\r\n isFormVisible = false;\r\n isEditing = false;\r\n editingNoteId: string | null = null;\r\n hoveredNoteIndex: number | null = null;\r\n noteForm!: FormGroup;\r\n private notesService = inject(CideLytDrawerNotesService);\r\n private fb = inject(FormBuilder);\r\n private appState = inject(AppStateHelperService);\r\n\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.initForm();\r\n this.notesService.getNotes().subscribe({\r\n next: (notes) => {\r\n this.notesSignal.set(notes);\r\n },\r\n error: (error) => {\r\n console.error('Error loading notes:', error);\r\n }\r\n });\r\n }\r\n\r\n protected override afterContextInit(): void {\r\n // Any additional setup after context is ready can go here\r\n }\r\n\r\n private initForm(): void {\r\n this.noteForm = this.fb.group({\r\n sypn_title: [''],\r\n sypn_desc: [''],\r\n sypn_is_page_specific: [true],\r\n sypn_is_user_specific: [true],\r\n sypn_is_entity_specific: [false],\r\n sypn_is_theme_specific: [false]\r\n });\r\n }\r\n\r\n showAddForm(): void {\r\n this.isFormVisible = true;\r\n }\r\n\r\n hideAddForm(): void {\r\n this.isFormVisible = false;\r\n this.isEditing = false;\r\n this.editingNoteId = null;\r\n }\r\n\r\n startEdit(note: ICoreSypn): void {\r\n this.isEditing = true;\r\n this.editingNoteId = note._id || '';\r\n this.noteForm.patchValue({\r\n sypn_title: note.sypn_title || '',\r\n sypn_desc: note.sypn_desc || '',\r\n sypn_is_page_specific: note.sypn_is_page_specific || false,\r\n sypn_is_user_specific: note.sypn_is_user_specific || false,\r\n sypn_is_entity_specific: note.sypn_is_entity_specific || false,\r\n sypn_is_theme_specific: note.sypn_is_theme_specific || false\r\n });\r\n this.isFormVisible = true;\r\n }\r\n\r\n cancelEdit(): void {\r\n this.isEditing = false;\r\n this.editingNoteId = null;\r\n this.resetForm();\r\n this.isFormVisible = false;\r\n }\r\n\r\n onNoteHover(index: number): void {\r\n this.hoveredNoteIndex = index;\r\n }\r\n\r\n onNoteLeave(): void {\r\n this.hoveredNoteIndex = null;\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.noteForm.invalid || !this.noteForm.get('sypn_title')?.value?.trim()) {\r\n return;\r\n }\r\n const formValue = this.noteForm.value;\r\n if (this.isEditing && this.editingNoteId) {\r\n console.log('formValue', this.appState.currentUser());\r\n const noteToUpdate: ICoreSypn = {\r\n _id: this.editingNoteId,\r\n sypn_title: formValue.sypn_title,\r\n sypn_desc: formValue.sypn_desc,\r\n sypn_page_id_sypg: this.pageId || \"\",\r\n sypn_user_id_user: this.appState.currentUser()?._id || \"\",\r\n sypn_entity_id_sype: this.appState.getActiveEntityId() || \"\",\r\n sypn_page_them_id_sytm: this.themeId || \"\",\r\n sypn_is_page_specific: formValue.sypn_is_page_specific,\r\n sypn_is_user_specific: formValue.sypn_is_user_specific,\r\n sypn_is_entity_specific: formValue.sypn_is_entity_specific,\r\n sypn_is_theme_specific: formValue.sypn_is_theme_specific,\r\n };\r\n this.notesService.updateNote(noteToUpdate).subscribe({\r\n next: () => {\r\n const currentNotes = this.notesSignal();\r\n const updatedNotes = currentNotes.map((note: ICoreSypn) =>\r\n note._id === this.editingNoteId ? noteToUpdate : note\r\n );\r\n this.notesSignal.set(updatedNotes);\r\n this.resetForm();\r\n this.isFormVisible = false;\r\n this.isEditing = false;\r\n this.editingNoteId = null;\r\n },\r\n error: (err: unknown) => console.error('Failed to update note', err)\r\n });\r\n } else {\r\n const noteToAdd: ICoreSypn = {\r\n sypn_title: formValue.sypn_title,\r\n sypn_desc: formValue.sypn_desc,\r\n sypn_page_id_sypg: this.pageId || \"\",\r\n sypn_user_id_user: this.appState.currentUser()?._id || \"\",\r\n sypn_entity_id_sype: this.appState.getActiveEntityId() || \"\",\r\n sypn_page_them_id_sytm: this.themeId || \"\",\r\n sypn_is_page_specific: formValue.sypn_is_page_specific,\r\n sypn_is_user_specific: formValue.sypn_is_user_specific,\r\n sypn_is_entity_specific: formValue.sypn_is_entity_specific,\r\n sypn_is_theme_specific: formValue.sypn_is_theme_specific,\r\n };\r\n this.notesService.addNote(noteToAdd).subscribe({\r\n next: (response: unknown) => {\r\n const responseData = response as { _id?: string; id?: string };\r\n const newNoteWithId: ICoreSypn = {\r\n ...noteToAdd,\r\n _id: responseData._id || responseData.id || Date.now().toString()\r\n };\r\n const currentNotes = this.notesSignal();\r\n this.notesSignal.set([newNoteWithId, ...currentNotes]);\r\n this.resetForm();\r\n this.isFormVisible = false;\r\n },\r\n error: (err: unknown) => console.error('Failed to add note', err)\r\n });\r\n }\r\n }\r\n\r\n private resetForm(): void {\r\n this.noteForm.reset({\r\n sypn_title: '',\r\n sypn_desc: '',\r\n sypn_is_page_specific: true,\r\n sypn_is_user_specific: true,\r\n sypn_is_entity_specific: false,\r\n sypn_is_theme_specific: false\r\n });\r\n }\r\n\r\n public getState() {\r\n return {\r\n newNoteModel: { ...(this.noteForm?.value ? this.noteForm?.value : {}) },\r\n isFormVisible: this.isFormVisible,\r\n };\r\n }\r\n\r\n public setState(state: NotesComponentState) {\r\n if (state) {\r\n this.noteForm.patchValue(state.newNoteModel);\r\n this.isFormVisible = state.isFormVisible;\r\n }\r\n }\r\n}","<div class=\"tw-relative tw-h-full tw-bg-white tw-overflow-hidden tw-flex tw-flex-col\">\r\n <!-- FIXED HEADER SECTION (ABSOLUTE POSITIONED) -->\r\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200\">\r\n <!-- DYNAMIC HEADING -->\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-p-2 tw-bg-white tw-border-b tw-border-gray-200\">\r\n <h6 class=\"tw-font-semibold tw-text-gray-800\">\r\n {{ isFormVisible ? (isEditing ? 'Edit Note' : 'Add a New Note') : 'Notes' }}\r\n </h6>\r\n <button *ngIf=\"!isFormVisible\" (click)=\"showAddForm()\" cideEleButton variant=\"primary\"\r\n class=\"tw-p-2 !tw-w-7 !tw-px-0 !tw-rounded-full tw-animate-pulse\" title=\"Add New Note\">\r\n <!-- Using inline SVG for the plus icon for simplicity -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- ADD NOTE FORM (ANIMATED WRAPPER) -->\r\n <div class=\"tw-transition-all tw-duration-300 tw-ease-in-out tw-animate-fade-in\" [class.tw-opacity-100]=\"isFormVisible\"\r\n [class.tw-opacity-0]=\"!isFormVisible\" [class.tw-max-h-0]=\"!isFormVisible\">\r\n <form [formGroup]=\"noteForm\" (ngSubmit)=\"onSubmit()\" class=\"tw-p-3 tw-space-y-4\" *ngIf=\"isFormVisible\">\r\n <!-- Title Input -->\r\n <cide-ele-input name=\"sypn_title\" formControlName=\"sypn_title\" placeholder=\"Note Title\" label=\"Note Title\"\r\n [required]=\"true\" [type]=\"'text'\" class=\"tw-w-full tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-input>\r\n\r\n <!-- Description Textarea -->\r\n <cide-ele-textarea placeholder=\"What's on your mind? (Optional)\" id=\"sypn_desc\" formControlName=\"sypn_desc\"\r\n rows=\"4\" label=\"Description\" class=\"tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-textarea>\r\n\r\n <!-- Toggle Switches -->\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_page_specific\" label=\"Page Specific\"\r\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\r\n\r\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_user_specific\" label=\"User Specific\"\r\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\r\n\r\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_entity_specific\" label=\"Entity Specific\"\r\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\r\n\r\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_theme_specific\" label=\"Theme Specific\"\r\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"tw-flex tw-space-x-3 tw-pt-4\">\r\n <button cideEleButton size=\"xs\" variant=\"primary\" type=\"submit\" [disabled]=\"noteForm.invalid\">\r\n {{ isEditing ? 'Update Note' : 'Add Note' }}\r\n </button>\r\n <button cideEleButton size=\"xs\" variant=\"secondary\" type=\"button\"\r\n (click)=\"isEditing ? cancelEdit() : hideAddForm()\">\r\n {{ isEditing ? 'Cancel Edit' : 'Cancel' }}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- SCROLLABLE NOTES SECTION (BELOW FIXED HEADER) -->\r\n <div class=\"tw-overflow-y-auto tw-scroll-smooth notes-scroll-container\">\r\n <!-- Modern Angular v20 pattern: Use Signals directly -->\r\n <div class=\"\" *ngIf=\"notes() as notes; else loading\">\r\n <!-- Show notes if the array is not empty -->\r\n <div *ngIf=\"notes.length > 0; else noNotes\">\r\n <div *ngFor=\"let note of notes; let i = index\"\r\n class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-p-4 tw-shadow-sm hover:tw-shadow-md tw-transition-all tw-duration-300 tw-ease-in-out tw-relative tw-transform hover:tw-translate-y-[-2px] hover:tw-shadow-lg\"\r\n (mouseenter)=\"onNoteHover(i)\" (mouseleave)=\"onNoteLeave()\">\r\n <!-- Edit Button (visible on hover) -->\r\n <button (click)=\"startEdit(note)\" [class.tw-opacity-100]=\"hoveredNoteIndex === i\"\r\n [class.tw-opacity-0]=\"hoveredNoteIndex !== i\"\r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-transition-all tw-duration-200 tw-p-1 tw-rounded tw-bg-gray-100 hover:tw-bg-gray-200 hover:tw-scale-110 tw-z-10\"\r\n title=\"Edit Note\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\r\n <path d=\"m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <h6 class=\"tw-font-medium tw-text-gray-900 tw-mb-2 tw-pr-8\">{{ note.sypn_title }}</h6>\r\n <p class=\"tw-text-gray-600 tw-text-sm tw-mb-3\">{{ note.sypn_desc }}</p>\r\n <div class=\"tw-flex tw-flex-wrap tw-gap-2\">\r\n <span *ngIf=\"note.sypn_is_page_specific\"\r\n class=\"tw-px-2 tw-py-1 tw-bg-blue-100 tw-text-blue-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-blue-200\">Page Specific</span>\r\n <span *ngIf=\"note.sypn_is_user_specific\"\r\n class=\"tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-green-200\">User Specific</span>\r\n <span *ngIf=\"note.sypn_is_entity_specific\"\r\n class=\"tw-px-2 tw-py-1 tw-bg-purple-100 tw-text-purple-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-purple-200\">Entity\r\n Specific</span>\r\n <span *ngIf=\"note.sypn_is_theme_specific\"\r\n class=\"tw-px-2 tw-py-1 tw-bg-orange-100 tw-text-orange-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-orange-200\">Theme\r\n Specific</span>\r\n </div>\r\n <!-- <p class=\"note-date\">{{ note.createdAt | date:'short' }}</p> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Template to show when there are no notes -->\r\n <ng-template #noNotes>\r\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8 tw-text-center\">\r\n <div class=\"tw-w-12 tw-h-12 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mb-4 tw-animate-bounce\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"tw-text-gray-400\">\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\r\n <polyline points=\"14,2 14,8 20,8\"></polyline>\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line>\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\r\n <polyline points=\"10,9 9,9 8,9\"></polyline>\r\n </svg>\r\n </div>\r\n <p class=\"tw-text-gray-500 tw-mb-2\">No notes found.</p>\r\n <p class=\"tw-text-sm tw-text-gray-400\">Click the '+' to add one!</p>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Template to show while notes are loading -->\r\n <ng-template #loading>\r\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8\">\r\n <div class=\"tw-w-8 tw-h-8 tw-border-4 tw-border-blue-200 tw-border-t-blue-600 tw-rounded-full tw-animate-spin tw-mb-4\"></div>\r\n <p class=\"tw-text-gray-500 tw-text-sm\">Loading notes...</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>"],"names":["i2"],"mappings":"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"}
1
+ {"version":3,"file":"cloud-ide-layout-sidedrawer-notes.component-efN19_PK.mjs","sources":["../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.service.ts","../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/cide-lyt-drawer-base.class.ts","../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.ts","../../../projects/cloud-ide-layout/src/lib/layout/sidedrawer/sidedrawer-notes/sidedrawer-notes.component.html"],"sourcesContent":["import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { ICoreSypn, IPageNotesManagerCreateUpdateControllerRespoonse, IPageNotesManagerListControllerRespoonse, cidePath, coreRoutesUrl, hostManagerRoutesUrl } from 'cloud-ide-lms-model';\r\nimport { Observable, of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideLytDrawerNotesService {\r\n // Modern Angular v20 dependency injection pattern\r\n private http = inject(HttpClient);\r\n\r\n constructor() {\r\n // Modern Angular v20 pattern: Use constructor for initialization only\r\n }\r\n\r\n getNotes(): Observable<ICoreSypn[]> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.systemPageNotesManager\r\n ]);\r\n return this.http.get<IPageNotesManagerListControllerRespoonse>(url).pipe(map((res) => res.data || []));\r\n }\r\n\r\n addNote(note: ICoreSypn): Observable<unknown> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.systemPageNotesManager\r\n ]);\r\n return this.http.post<IPageNotesManagerCreateUpdateControllerRespoonse>(url, note).pipe(map((res) => res.data));\r\n }\r\n\r\n updateNote(note: ICoreSypn): Observable<unknown> {\r\n const url = cidePath.join([\r\n hostManagerRoutesUrl.cideSuiteHost,\r\n coreRoutesUrl.module,\r\n coreRoutesUrl.systemPageNotesManager\r\n ]);\r\n return this.http.post<IPageNotesManagerCreateUpdateControllerRespoonse>(url, note).pipe(map((res) => res.data));\r\n }\r\n\r\n deleteNote(noteId: string): Observable<unknown> {\r\n // Mock implementation: simulate deleting a note.\r\n console.log('Deleting note with ID:', noteId);\r\n return of({ success: true });\r\n }\r\n\r\n // Additional methods for updating and deleting notes could be added here.\r\n // You might also include error handling or more complex data manipulation.\r\n}","import { Directive, OnInit, inject } from '@angular/core';\r\nimport { CideLytSidedrawerService } from './sidedrawer.service';\r\n\r\n@Directive()\r\nexport abstract class CideLytDrawerBase implements OnInit {\r\n private _pageId: string | null = null;\r\n private _themeId: string | null = null;\r\n protected sidedrawerService = inject(CideLytSidedrawerService);\r\n\r\n ngOnInit(): void {\r\n // Automatically initialize context from the service\r\n const pageId = this.sidedrawerService.pageId;\r\n const themeId = this.sidedrawerService.themeId;\r\n if (pageId && themeId) {\r\n this.setContext(pageId, themeId);\r\n }\r\n this.afterContextInit();\r\n }\r\n\r\n // Child classes can override this for additional setup\r\n protected afterContextInit(): void {}\r\n\r\n setContext(pageId: string, themeId: string) {\r\n this._pageId = pageId;\r\n this._themeId = themeId;\r\n }\r\n\r\n get pageId(): string | null {\r\n return this._pageId;\r\n }\r\n\r\n get themeId(): string | null {\r\n return this._themeId;\r\n }\r\n\r\n protected getStorageKey(suffix: string): string {\r\n return `drawer_${suffix}_${this._pageId || 'unknown'}`;\r\n }\r\n} ","import { CommonModule } from '@angular/common';\r\nimport { Component, OnInit, inject, signal } from '@angular/core';\r\nimport { ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { CideLytDrawerNotesService } from './sidedrawer-notes.service';\r\nimport { ICoreSypn } from 'cloud-ide-lms-model';\r\nimport { CideInputComponent } from 'cloud-ide-element';\r\nimport { CideEleButtonComponent } from 'cloud-ide-element';\r\nimport { CideTextareaComponent } from 'cloud-ide-element';\r\nimport { AppStateHelperService } from '../../../services/app-state/app-state-helper.service';\r\nimport { CideLytDrawerBase } from '../cide-lyt-drawer-base.class';\r\n\r\nexport interface NewNoteModel {\r\n title: string;\r\n description: string;\r\n isPageSpecific: boolean;\r\n isUserSpecific: boolean;\r\n isEntitySpecific: boolean;\r\n isThemeSpecific: boolean;\r\n}\r\n\r\nexport interface NotesComponentState {\r\n newNoteModel: NewNoteModel;\r\n isFormVisible: boolean;\r\n scrollTop: number;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-lyt-sidedrawer-notes',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, CideInputComponent, CideEleButtonComponent, CideTextareaComponent],\r\n templateUrl: './sidedrawer-notes.component.html',\r\n styleUrl: './sidedrawer-notes.component.css'\r\n})\r\nexport class CideLytSidedrawerNotesComponent extends CideLytDrawerBase implements OnInit {\r\n private notesSignal = signal<ICoreSypn[]>([]);\r\n notes = this.notesSignal.asReadonly();\r\n isFormVisible = false;\r\n isEditing = false;\r\n editingNoteId: string | null = null;\r\n hoveredNoteIndex: number | null = null;\r\n noteForm!: FormGroup;\r\n private notesService = inject(CideLytDrawerNotesService);\r\n private fb = inject(FormBuilder);\r\n private appState = inject(AppStateHelperService);\r\n\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.initForm();\r\n this.notesService.getNotes().subscribe({\r\n next: (notes) => {\r\n this.notesSignal.set(notes);\r\n },\r\n error: (error) => {\r\n console.error('Error loading notes:', error);\r\n }\r\n });\r\n }\r\n\r\n protected override afterContextInit(): void {\r\n // Any additional setup after context is ready can go here\r\n }\r\n\r\n private initForm(): void {\r\n this.noteForm = this.fb.group({\r\n sypn_title: [''],\r\n sypn_desc: [''],\r\n sypn_is_page_specific: [true],\r\n sypn_is_user_specific: [true],\r\n sypn_is_entity_specific: [false],\r\n sypn_is_theme_specific: [false]\r\n });\r\n }\r\n\r\n showAddForm(): void {\r\n this.isFormVisible = true;\r\n }\r\n\r\n hideAddForm(): void {\r\n this.isFormVisible = false;\r\n this.isEditing = false;\r\n this.editingNoteId = null;\r\n }\r\n\r\n startEdit(note: ICoreSypn): void {\r\n this.isEditing = true;\r\n this.editingNoteId = note._id || '';\r\n this.noteForm.patchValue({\r\n sypn_title: note.sypn_title || '',\r\n sypn_desc: note.sypn_desc || '',\r\n sypn_is_page_specific: note.sypn_is_page_specific || false,\r\n sypn_is_user_specific: note.sypn_is_user_specific || false,\r\n sypn_is_entity_specific: note.sypn_is_entity_specific || false,\r\n sypn_is_theme_specific: note.sypn_is_theme_specific || false\r\n });\r\n this.isFormVisible = true;\r\n }\r\n\r\n cancelEdit(): void {\r\n this.isEditing = false;\r\n this.editingNoteId = null;\r\n this.resetForm();\r\n this.isFormVisible = false;\r\n }\r\n\r\n onNoteHover(index: number): void {\r\n this.hoveredNoteIndex = index;\r\n }\r\n\r\n onNoteLeave(): void {\r\n this.hoveredNoteIndex = null;\r\n }\r\n\r\n onSubmit(): void {\r\n if (this.noteForm.invalid || !this.noteForm.get('sypn_title')?.value?.trim()) {\r\n return;\r\n }\r\n const formValue = this.noteForm.value;\r\n if (this.isEditing && this.editingNoteId) {\r\n console.log('formValue', this.appState.currentUser());\r\n const noteToUpdate: ICoreSypn = {\r\n _id: this.editingNoteId,\r\n sypn_title: formValue.sypn_title,\r\n sypn_desc: formValue.sypn_desc,\r\n sypn_page_id_sypg: this.pageId || \"\",\r\n sypn_user_id_user: this.appState.currentUser()?._id || \"\",\r\n sypn_entity_id_sype: this.appState.getActiveEntityId() || \"\",\r\n sypn_page_them_id_sytm: this.themeId || \"\",\r\n sypn_is_page_specific: formValue.sypn_is_page_specific,\r\n sypn_is_user_specific: formValue.sypn_is_user_specific,\r\n sypn_is_entity_specific: formValue.sypn_is_entity_specific,\r\n sypn_is_theme_specific: formValue.sypn_is_theme_specific,\r\n };\r\n this.notesService.updateNote(noteToUpdate).subscribe({\r\n next: () => {\r\n const currentNotes = this.notesSignal();\r\n const updatedNotes = currentNotes.map((note: ICoreSypn) =>\r\n note._id === this.editingNoteId ? noteToUpdate : note\r\n );\r\n this.notesSignal.set(updatedNotes);\r\n this.resetForm();\r\n this.isFormVisible = false;\r\n this.isEditing = false;\r\n this.editingNoteId = null;\r\n },\r\n error: (err: unknown) => console.error('Failed to update note', err)\r\n });\r\n } else {\r\n const noteToAdd: ICoreSypn = {\r\n sypn_title: formValue.sypn_title,\r\n sypn_desc: formValue.sypn_desc,\r\n sypn_page_id_sypg: this.pageId || \"\",\r\n sypn_user_id_user: this.appState.currentUser()?._id || \"\",\r\n sypn_entity_id_sype: this.appState.getActiveEntityId() || \"\",\r\n sypn_page_them_id_sytm: this.themeId || \"\",\r\n sypn_is_page_specific: formValue.sypn_is_page_specific,\r\n sypn_is_user_specific: formValue.sypn_is_user_specific,\r\n sypn_is_entity_specific: formValue.sypn_is_entity_specific,\r\n sypn_is_theme_specific: formValue.sypn_is_theme_specific,\r\n };\r\n this.notesService.addNote(noteToAdd).subscribe({\r\n next: (response: unknown) => {\r\n const responseData = response as { _id?: string; id?: string };\r\n const newNoteWithId: ICoreSypn = {\r\n ...noteToAdd,\r\n _id: responseData._id || responseData.id || Date.now().toString()\r\n };\r\n const currentNotes = this.notesSignal();\r\n this.notesSignal.set([newNoteWithId, ...currentNotes]);\r\n this.resetForm();\r\n this.isFormVisible = false;\r\n },\r\n error: (err: unknown) => console.error('Failed to add note', err)\r\n });\r\n }\r\n }\r\n\r\n private resetForm(): void {\r\n this.noteForm.reset({\r\n sypn_title: '',\r\n sypn_desc: '',\r\n sypn_is_page_specific: true,\r\n sypn_is_user_specific: true,\r\n sypn_is_entity_specific: false,\r\n sypn_is_theme_specific: false\r\n });\r\n }\r\n\r\n public getState() {\r\n return {\r\n newNoteModel: { ...(this.noteForm?.value ? this.noteForm?.value : {}) },\r\n isFormVisible: this.isFormVisible,\r\n };\r\n }\r\n\r\n public setState(state: NotesComponentState) {\r\n if (state) {\r\n this.noteForm.patchValue(state.newNoteModel);\r\n this.isFormVisible = state.isFormVisible;\r\n }\r\n }\r\n}","<div class=\"tw-relative tw-h-full tw-bg-white tw-overflow-hidden tw-flex tw-flex-col\">\r\n <!-- FIXED HEADER SECTION (ABSOLUTE POSITIONED) -->\r\n <div class=\"tw-bg-white tw-border-b tw-border-gray-200\">\r\n <!-- DYNAMIC HEADING -->\r\n <div class=\"tw-flex tw-justify-between tw-items-center tw-p-2 tw-bg-white tw-border-b tw-border-gray-200\">\r\n <h6 class=\"tw-font-semibold tw-text-gray-800\">\r\n {{ isFormVisible ? (isEditing ? 'Edit Note' : 'Add a New Note') : 'Notes' }}\r\n </h6>\r\n <button *ngIf=\"!isFormVisible\" (click)=\"showAddForm()\" cideEleButton variant=\"primary\"\r\n class=\"tw-p-2 !tw-w-7 !tw-px-0 !tw-rounded-full tw-animate-pulse\" title=\"Add New Note\">\r\n <!-- Using inline SVG for the plus icon for simplicity -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line>\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- ADD NOTE FORM (ANIMATED WRAPPER) -->\r\n <div class=\"tw-transition-all tw-duration-300 tw-ease-in-out tw-animate-fade-in\" [class.tw-opacity-100]=\"isFormVisible\"\r\n [class.tw-opacity-0]=\"!isFormVisible\" [class.tw-max-h-0]=\"!isFormVisible\">\r\n <form [formGroup]=\"noteForm\" (ngSubmit)=\"onSubmit()\" class=\"tw-p-3 tw-space-y-4\" *ngIf=\"isFormVisible\">\r\n <!-- Title Input -->\r\n <cide-ele-input name=\"sypn_title\" formControlName=\"sypn_title\" placeholder=\"Note Title\" label=\"Note Title\"\r\n [required]=\"true\" [type]=\"'text'\" class=\"tw-w-full tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-input>\r\n\r\n <!-- Description Textarea -->\r\n <cide-ele-textarea placeholder=\"What's on your mind? (Optional)\" id=\"sypn_desc\" formControlName=\"sypn_desc\"\r\n rows=\"4\" label=\"Description\" class=\"tw-transition-all tw-duration-200 focus:tw-scale-[1.02]\"></cide-ele-textarea>\r\n\r\n <!-- Toggle Switches -->\r\n <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_page_specific\" label=\"Page Specific\"\r\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\r\n\r\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_user_specific\" label=\"User Specific\"\r\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\r\n\r\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_entity_specific\" label=\"Entity Specific\"\r\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\r\n\r\n <cide-ele-input [type]=\"'checkbox'\" formControlName=\"sypn_is_theme_specific\" label=\"Theme Specific\"\r\n class=\"tw-flex tw-items-center tw-space-x-2\"></cide-ele-input>\r\n </div>\r\n\r\n <!-- Action Buttons -->\r\n <div class=\"tw-flex tw-space-x-3 tw-pt-4\">\r\n <button cideEleButton size=\"xs\" variant=\"primary\" type=\"submit\" [disabled]=\"noteForm.invalid\">\r\n {{ isEditing ? 'Update Note' : 'Add Note' }}\r\n </button>\r\n <button cideEleButton size=\"xs\" variant=\"secondary\" type=\"button\"\r\n (click)=\"isEditing ? cancelEdit() : hideAddForm()\">\r\n {{ isEditing ? 'Cancel Edit' : 'Cancel' }}\r\n </button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <!-- SCROLLABLE NOTES SECTION (BELOW FIXED HEADER) -->\r\n <div class=\"tw-overflow-y-auto tw-scroll-smooth notes-scroll-container\">\r\n <!-- Modern Angular v20 pattern: Use Signals directly -->\r\n <div class=\"\" *ngIf=\"notes() as notes; else loading\">\r\n <!-- Show notes if the array is not empty -->\r\n <div *ngIf=\"notes.length > 0; else noNotes\">\r\n <div *ngFor=\"let note of notes; let i = index\"\r\n class=\"tw-bg-white tw-border-b tw-border-gray-200 tw-p-4 tw-shadow-sm hover:tw-shadow-md tw-transition-all tw-duration-300 tw-ease-in-out tw-relative tw-transform hover:tw-translate-y-[-2px] hover:tw-shadow-lg\"\r\n (mouseenter)=\"onNoteHover(i)\" (mouseleave)=\"onNoteLeave()\">\r\n <!-- Edit Button (visible on hover) -->\r\n <button (click)=\"startEdit(note)\" [class.tw-opacity-100]=\"hoveredNoteIndex === i\"\r\n [class.tw-opacity-0]=\"hoveredNoteIndex !== i\"\r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-transition-all tw-duration-200 tw-p-1 tw-rounded tw-bg-gray-100 hover:tw-bg-gray-200 hover:tw-scale-110 tw-z-10\"\r\n title=\"Edit Note\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path>\r\n <path d=\"m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path>\r\n </svg>\r\n </button>\r\n\r\n <h6 class=\"tw-font-medium tw-text-gray-900 tw-mb-2 tw-pr-8\">{{ note.sypn_title }}</h6>\r\n <p class=\"tw-text-gray-600 tw-text-sm tw-mb-3\">{{ note.sypn_desc }}</p>\r\n <div class=\"tw-flex tw-flex-wrap tw-gap-2\">\r\n <span *ngIf=\"note.sypn_is_page_specific\"\r\n class=\"tw-px-2 tw-py-1 tw-bg-blue-100 tw-text-blue-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-blue-200\">Page Specific</span>\r\n <span *ngIf=\"note.sypn_is_user_specific\"\r\n class=\"tw-px-2 tw-py-1 tw-bg-green-100 tw-text-green-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-green-200\">User Specific</span>\r\n <span *ngIf=\"note.sypn_is_entity_specific\"\r\n class=\"tw-px-2 tw-py-1 tw-bg-purple-100 tw-text-purple-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-purple-200\">Entity\r\n Specific</span>\r\n <span *ngIf=\"note.sypn_is_theme_specific\"\r\n class=\"tw-px-2 tw-py-1 tw-bg-orange-100 tw-text-orange-800 tw-text-xs tw-rounded-full tw-transition-all tw-duration-200 hover:tw-scale-105 hover:tw-bg-orange-200\">Theme\r\n Specific</span>\r\n </div>\r\n <!-- <p class=\"note-date\">{{ note.createdAt | date:'short' }}</p> -->\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Template to show when there are no notes -->\r\n <ng-template #noNotes>\r\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8 tw-text-center\">\r\n <div class=\"tw-w-12 tw-h-12 tw-bg-gray-100 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-mb-4 tw-animate-bounce\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\r\n class=\"tw-text-gray-400\">\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\r\n <polyline points=\"14,2 14,8 20,8\"></polyline>\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line>\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\r\n <polyline points=\"10,9 9,9 8,9\"></polyline>\r\n </svg>\r\n </div>\r\n <p class=\"tw-text-gray-500 tw-mb-2\">No notes found.</p>\r\n <p class=\"tw-text-sm tw-text-gray-400\">Click the '+' to add one!</p>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Template to show while notes are loading -->\r\n <ng-template #loading>\r\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-8\">\r\n <div class=\"tw-w-8 tw-h-8 tw-border-4 tw-border-blue-200 tw-border-t-blue-600 tw-rounded-full tw-animate-spin tw-mb-4\"></div>\r\n <p class=\"tw-text-gray-500 tw-text-sm\">Loading notes...</p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n</div>"],"names":["i2"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { A as AppStateHelperService, e as AppStateService, n as CacheManagerService, o as CideLytFileManagerService, q as CideLytFloatingEntityRightsSharingComponent, r as CideLytFloatingEntityRightsSharingService, h as CideLytSharedService, C as CideLytSharedWrapperComponent, d as CideLytThemeService, m as CideLytUserStatusService, g as CloudIdeLayoutComponent, f as CloudIdeLayoutService, i as ComponentContextService, k as CustomRouteReuseStrategy, E as ENVIRONMENT_CONFIG, N as NotificationSettingsService, R as RightsService, j as layoutControlPannelChildRoutes, l as layoutRoutes, p as processThemeVariable, s as setCSSVariable, t as themeFactory } from './cloud-ide-layout-cloud-ide-layout-CkYksc6R.mjs';
1
+ export { A as AppStateHelperService, e as AppStateService, n as CacheManagerService, o as CideLytFileManagerService, q as CideLytFloatingEntityRightsSharingComponent, r as CideLytFloatingEntityRightsSharingService, h as CideLytSharedService, C as CideLytSharedWrapperComponent, d as CideLytThemeService, m as CideLytUserStatusService, g as CloudIdeLayoutComponent, f as CloudIdeLayoutService, i as ComponentContextService, k as CustomRouteReuseStrategy, E as ENVIRONMENT_CONFIG, N as NotificationSettingsService, R as RightsService, j as layoutControlPannelChildRoutes, l as layoutRoutes, p as processThemeVariable, s as setCSSVariable, t as themeFactory } from './cloud-ide-layout-cloud-ide-layout-CgeT5vL1.mjs';
2
2
  //# sourceMappingURL=cloud-ide-layout.mjs.map
package/index.d.ts CHANGED
@@ -234,12 +234,16 @@ interface CachedPageData {
234
234
  declare class CideLytSharedService {
235
235
  private pageDataCacheSignal;
236
236
  private loadingStateSignal;
237
+ private pageDataSignal;
237
238
  readonly pageDataCache: _angular_core.Signal<{
238
239
  [key: string]: CachedPageData;
239
240
  }>;
240
241
  readonly loadingStates: _angular_core.Signal<{
241
242
  [key: string]: boolean;
242
243
  }>;
244
+ readonly pageDataStore: _angular_core.Signal<{
245
+ [key: string]: designConfigControllerResponse;
246
+ }>;
243
247
  readonly cacheInfo: _angular_core.Signal<{
244
248
  totalCached: number;
245
249
  validCached: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloud-ide-layout",
3
- "version": "1.0.136",
3
+ "version": "1.0.137",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.1.0",
6
6
  "@angular/core": "^20.1.0",