cloud-ide-layout 1.0.109 → 1.0.111

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 (14) hide show
  1. package/fesm2022/{cloud-ide-layout-cloud-ide-layout-DKLoBtjT.mjs → cloud-ide-layout-cloud-ide-layout-BbcIno6W.mjs} +125 -31
  2. package/fesm2022/cloud-ide-layout-cloud-ide-layout-BbcIno6W.mjs.map +1 -0
  3. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BnbifwOg.mjs → cloud-ide-layout-drawer-theme.component-CAocxERw.mjs} +2 -2
  4. package/fesm2022/{cloud-ide-layout-drawer-theme.component-BnbifwOg.mjs.map → cloud-ide-layout-drawer-theme.component-CAocxERw.mjs.map} +1 -1
  5. package/fesm2022/{cloud-ide-layout-floating-entity-selection.component-BWt2jNzs.mjs → cloud-ide-layout-floating-entity-selection.component-DMS4hfOP.mjs} +2 -2
  6. package/fesm2022/{cloud-ide-layout-floating-entity-selection.component-BWt2jNzs.mjs.map → cloud-ide-layout-floating-entity-selection.component-DMS4hfOP.mjs.map} +1 -1
  7. package/fesm2022/{cloud-ide-layout-home-wrapper.component-DBEz2uEN.mjs → cloud-ide-layout-home-wrapper.component-D3FEDXRo.mjs} +2 -2
  8. package/fesm2022/{cloud-ide-layout-home-wrapper.component-DBEz2uEN.mjs.map → cloud-ide-layout-home-wrapper.component-D3FEDXRo.mjs.map} +1 -1
  9. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-CLgErxyC.mjs → cloud-ide-layout-sidedrawer-notes.component-DYbvtr2t.mjs} +2 -2
  10. package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-CLgErxyC.mjs.map → cloud-ide-layout-sidedrawer-notes.component-DYbvtr2t.mjs.map} +1 -1
  11. package/fesm2022/cloud-ide-layout.mjs +1 -1
  12. package/index.d.ts +5 -1
  13. package/package.json +1 -1
  14. package/fesm2022/cloud-ide-layout-cloud-ide-layout-DKLoBtjT.mjs.map +0 -1
@@ -7,7 +7,7 @@ import { map, filter, tap, catchError, shareReplay, take, distinctUntilChanged }
7
7
  import * as i2$1 from '@angular/router';
8
8
  import { Router, NavigationEnd, RouteReuseStrategy, RouterModule } from '@angular/router';
9
9
  import { Title, DomSanitizer } from '@angular/platform-browser';
10
- import { CideEleFileManagerService, CideElementsService, CideEleFloatingContainerService, NotificationService, CideIconComponent, CideEleButtonComponent, CideInputComponent, CideSelectComponent, CideThemeService, WebSocketNotificationService, NotificationApiService, CideEleDropdownComponent, CideEleFileImageDirective, CideEleResizerDirective, TooltipDirective, CideSpinnerComponent, CideEleSkeletonLoaderComponent, KeyboardShortcutService, CideEleFloatingContainerManagerComponent, CideEleGlobalNotificationsComponent, CideEleBreadcrumbComponent } from 'cloud-ide-element';
10
+ import { CideEleFileManagerService, CideElementsService, CideEleFloatingContainerService, NotificationService, CideIconComponent, CideEleButtonComponent, CideInputComponent, CideSelectComponent, CideThemeService, WebSocketNotificationService, NotificationApiService, CideEleDropdownComponent, CideEleFileImageDirective, CideEleResizerDirective, TooltipDirective, CideSpinnerComponent, CideEleSkeletonLoaderComponent, KeyboardShortcutService, FloatingContainerShortcutsService, CideEleFloatingContainerManagerComponent, CideEleGlobalNotificationsComponent, CideEleBreadcrumbComponent } from 'cloud-ide-element';
11
11
  import * as i1 from '@angular/common';
12
12
  import { CommonModule, NgClass, NgFor, NgIf, isPlatformBrowser } from '@angular/common';
13
13
  import { FINANCIAL_YEAR_SERVICE_TOKEN, ACADEMIC_YEAR_SERVICE_TOKEN, AUTH_SERVICE_TOKEN, authGuard, ENTITY_SERVICE_TOKEN } from 'cloud-ide-shared';
@@ -1268,7 +1268,7 @@ class CideLytFloatingEntitySelectionService {
1268
1268
  }
1269
1269
  try {
1270
1270
  // Use relative import to avoid circular dependency
1271
- const module = await import('./cloud-ide-layout-floating-entity-selection.component-BWt2jNzs.mjs');
1271
+ const module = await import('./cloud-ide-layout-floating-entity-selection.component-DMS4hfOP.mjs');
1272
1272
  if (module.CideLytFloatingEntitySelectionComponent) {
1273
1273
  this.containerService.registerComponent('entity-selection-header', module.CideLytFloatingEntitySelectionComponent);
1274
1274
  console.log('✅ Entity selection component registered successfully');
@@ -1442,36 +1442,65 @@ class NotificationSettingsService {
1442
1442
  // Create audio context for sound generation
1443
1443
  // Handle browser autoplay policy - resume if suspended
1444
1444
  const AudioContextClass = window.AudioContext || window.webkitAudioContext;
1445
- const audioContext = new AudioContextClass();
1445
+ let audioContext;
1446
+ // Try to get existing audio context or create new one
1447
+ if (!this._audioContext) {
1448
+ audioContext = new AudioContextClass();
1449
+ this._audioContext = audioContext;
1450
+ }
1451
+ else {
1452
+ audioContext = this._audioContext;
1453
+ }
1454
+ // Resume audio context if suspended (required for browser autoplay policy)
1446
1455
  if (audioContext.state === 'suspended') {
1447
- audioContext.resume();
1448
- }
1449
- const volume = settings.soundVolume / 100;
1450
- const currentTime = audioContext.currentTime;
1451
- // Configure based on sound type
1452
- switch (settings.soundType) {
1453
- case 'gentle':
1454
- this.playTone(audioContext, 800, 600, 0.15, volume, 'sine');
1455
- break;
1456
- case 'alert':
1457
- this.playTone(audioContext, 1000, 800, 0.2, volume, 'square');
1458
- break;
1459
- case 'chime':
1460
- // Play a chord (C-E-G)
1461
- this.playTone(audioContext, 523.25, 523.25, 0.3, volume * 0.7, 'sine', 0); // C5
1462
- this.playTone(audioContext, 659.25, 659.25, 0.3, volume * 0.7, 'sine', 0.05); // E5
1463
- this.playTone(audioContext, 783.99, 783.99, 0.3, volume * 0.7, 'sine', 0.1); // G5
1464
- break;
1465
- case 'default':
1466
- default:
1467
- this.playTone(audioContext, 800, 600, 0.15, volume, 'sine');
1468
- break;
1456
+ audioContext.resume().then(() => {
1457
+ this.playSoundWithContext(audioContext, settings);
1458
+ }).catch((error) => {
1459
+ console.warn('Failed to resume audio context:', error);
1460
+ // Try creating a new context as fallback
1461
+ try {
1462
+ const newContext = new AudioContextClass();
1463
+ this.playSoundWithContext(newContext, settings);
1464
+ }
1465
+ catch (fallbackError) {
1466
+ console.warn('Failed to create fallback audio context:', fallbackError);
1467
+ }
1468
+ });
1469
+ }
1470
+ else {
1471
+ // Context is already running, play sound immediately
1472
+ this.playSoundWithContext(audioContext, settings);
1469
1473
  }
1470
1474
  }
1471
1475
  catch (error) {
1472
1476
  console.warn('Failed to play notification sound:', error);
1473
1477
  }
1474
1478
  }
1479
+ /**
1480
+ * Play sound with the given audio context
1481
+ */
1482
+ playSoundWithContext(audioContext, settings) {
1483
+ const volume = settings.soundVolume / 100;
1484
+ // Configure based on sound type
1485
+ switch (settings.soundType) {
1486
+ case 'gentle':
1487
+ this.playTone(audioContext, 800, 600, 0.15, volume, 'sine');
1488
+ break;
1489
+ case 'alert':
1490
+ this.playTone(audioContext, 1000, 800, 0.2, volume, 'square');
1491
+ break;
1492
+ case 'chime':
1493
+ // Play a chord (C-E-G)
1494
+ this.playTone(audioContext, 523.25, 523.25, 0.3, volume * 0.7, 'sine', 0); // C5
1495
+ this.playTone(audioContext, 659.25, 659.25, 0.3, volume * 0.7, 'sine', 0.05); // E5
1496
+ this.playTone(audioContext, 783.99, 783.99, 0.3, volume * 0.7, 'sine', 0.1); // G5
1497
+ break;
1498
+ case 'default':
1499
+ default:
1500
+ this.playTone(audioContext, 800, 600, 0.15, volume, 'sine');
1501
+ break;
1502
+ }
1503
+ }
1475
1504
  /**
1476
1505
  * Play a single tone
1477
1506
  */
@@ -2052,6 +2081,9 @@ class CideLytHeaderWrapperComponent {
2052
2081
  unreadCount = computed(() => this.wsNotificationService?.unreadNotificationsCount() || 0, ...(ngDevMode ? [{ debugName: "unreadCount" }] : []));
2053
2082
  isNotificationDropdownOpen = signal(false, ...(ngDevMode ? [{ debugName: "isNotificationDropdownOpen" }] : []));
2054
2083
  notificationItems = signal([], ...(ngDevMode ? [{ debugName: "notificationItems" }] : []));
2084
+ // Track previously seen notification IDs to detect new ones
2085
+ previousNotificationIds = new Set();
2086
+ isInitialLoad = true; // Track if this is the first load
2055
2087
  // Animation and undo state
2056
2088
  animatingNotifications = signal(new Set(), ...(ngDevMode ? [{ debugName: "animatingNotifications" }] : []));
2057
2089
  recentlyRemovedNotifications = signal(new Map(), ...(ngDevMode ? [{ debugName: "recentlyRemovedNotifications" }] : []));
@@ -2187,6 +2219,9 @@ class CideLytHeaderWrapperComponent {
2187
2219
  });
2188
2220
  }
2189
2221
  ngOnInit() {
2222
+ // Initialize audio context early to avoid browser autoplay restrictions
2223
+ // This must be done on user interaction, so we'll do it on first user click
2224
+ this.initializeAudioContext();
2190
2225
  // Subscribe to theme service for reactive theme updates
2191
2226
  this.themeService.getEffectiveTheme$()
2192
2227
  .pipe(takeUntilDestroyed(this.destroyRef))
@@ -2320,6 +2355,23 @@ class CideLytHeaderWrapperComponent {
2320
2355
  }
2321
2356
  // Sort by timestamp (newest first)
2322
2357
  filteredNotifications.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
2358
+ // Detect new notifications and play sound
2359
+ if (!this.isInitialLoad) {
2360
+ const currentNotificationIds = new Set(filteredNotifications.map(n => n.id));
2361
+ const newNotifications = filteredNotifications.filter(n => !this.previousNotificationIds.has(n.id));
2362
+ if (newNotifications.length > 0) {
2363
+ console.log(`[Notifications] ${newNotifications.length} new notification(s) detected, playing sound...`);
2364
+ // Play sound for new notifications
2365
+ this.playNotificationSound();
2366
+ }
2367
+ // Update previous notification IDs
2368
+ this.previousNotificationIds = currentNotificationIds;
2369
+ }
2370
+ else {
2371
+ // First load - just track IDs, don't play sound
2372
+ this.previousNotificationIds = new Set(filteredNotifications.map(n => n.id));
2373
+ this.isInitialLoad = false;
2374
+ }
2323
2375
  console.log('[Notifications] Total notifications to display:', filteredNotifications.length);
2324
2376
  this.notifications.set(filteredNotifications);
2325
2377
  this.updateNotificationDropdown();
@@ -3245,6 +3297,44 @@ class CideLytHeaderWrapperComponent {
3245
3297
  }
3246
3298
  }
3247
3299
  }
3300
+ /**
3301
+ * Initialize audio context early to avoid browser autoplay restrictions
3302
+ */
3303
+ initializeAudioContext() {
3304
+ // Initialize audio context on first user interaction
3305
+ const initAudio = () => {
3306
+ try {
3307
+ const AudioContextClass = window.AudioContext || window.webkitAudioContext;
3308
+ if (AudioContextClass && !window._notificationAudioContext) {
3309
+ const audioContext = new AudioContextClass();
3310
+ // Resume to unlock audio (required for autoplay policy)
3311
+ if (audioContext.state === 'suspended') {
3312
+ audioContext.resume().then(() => {
3313
+ console.log('[Notifications] Audio context initialized and resumed');
3314
+ }).catch((error) => {
3315
+ console.warn('[Notifications] Failed to initialize audio context:', error);
3316
+ });
3317
+ }
3318
+ window._notificationAudioContext = audioContext;
3319
+ }
3320
+ }
3321
+ catch (error) {
3322
+ console.warn('[Notifications] Failed to initialize audio context:', error);
3323
+ }
3324
+ };
3325
+ // Try to initialize on any user interaction
3326
+ const events = ['click', 'touchstart', 'keydown'];
3327
+ const initOnce = () => {
3328
+ initAudio();
3329
+ // Remove listeners after first initialization
3330
+ events.forEach(event => {
3331
+ document.removeEventListener(event, initOnce);
3332
+ });
3333
+ };
3334
+ events.forEach(event => {
3335
+ document.addEventListener(event, initOnce, { once: true, passive: true });
3336
+ });
3337
+ }
3248
3338
  /**
3249
3339
  * Play notification sound based on user settings
3250
3340
  */
@@ -4693,8 +4783,8 @@ class CideLytSidedrawerWrapperComponent {
4693
4783
  }
4694
4784
  ngOnInit() {
4695
4785
  // Initialize the component map (You'd likely populate this from a config or service)
4696
- this.componentMap['drowar_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-CLgErxyC.mjs').then(m => m.CideLytSidedrawerNotesComponent);
4697
- this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-BnbifwOg.mjs').then(m => m.CideLytDrawerThemeComponent);
4786
+ this.componentMap['drowar_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-DYbvtr2t.mjs').then(m => m.CideLytSidedrawerNotesComponent);
4787
+ this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-CAocxERw.mjs').then(m => m.CideLytDrawerThemeComponent);
4698
4788
  }
4699
4789
  async loadComponent(configFor) {
4700
4790
  console.log('🔍 SIDEDRAWER - Loading component:', configFor, 'Current tab:', this.currentTabId);
@@ -4865,6 +4955,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
4865
4955
  class ShortcutsPanelComponent {
4866
4956
  keyboardShortcutService = inject(KeyboardShortcutService);
4867
4957
  sanitizer = inject(DomSanitizer);
4958
+ // Inject FloatingContainerShortcutsService to ensure it's initialized and shortcuts are registered
4959
+ floatingContainerShortcutsService = inject(FloatingContainerShortcutsService);
4868
4960
  refreshInterval;
4869
4961
  shortcuts = signal([], ...(ngDevMode ? [{ debugName: "shortcuts" }] : []));
4870
4962
  searchQuery = signal('', ...(ngDevMode ? [{ debugName: "searchQuery" }] : []));
@@ -4887,6 +4979,8 @@ class ShortcutsPanelComponent {
4887
4979
  return Array.from(cats).sort();
4888
4980
  }, ...(ngDevMode ? [{ debugName: "categories" }] : []));
4889
4981
  ngOnInit() {
4982
+ // FloatingContainerShortcutsService is now injected, so it's initialized
4983
+ // Load shortcuts immediately
4890
4984
  this.loadShortcuts();
4891
4985
  // Reload shortcuts periodically to catch dynamically registered shortcuts
4892
4986
  // This ensures floating container shortcuts and custom shortcuts are shown
@@ -5353,7 +5447,7 @@ class SettingsContainerComponent {
5353
5447
  }
5354
5448
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: SettingsContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5355
5449
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: SettingsContainerComponent, isStandalone: true, selector: "cide-lyt-settings-container", ngImport: i0, template: `
5356
- <div class="tw-flex tw-h-full tw-bg-white dark:tw-bg-gray-900">
5450
+ <div class="tw-flex tw-h-full tw-bg-white dark:tw-bg-gray-900 tw-text-gray-900 dark:tw-text-gray-100">
5357
5451
  <!-- Left Sidebar Navigation -->
5358
5452
  <div class="tw-w-64 tw-border-r tw-border-gray-200 dark:tw-border-gray-700 tw-bg-gray-50 dark:tw-bg-gray-800 tw-flex tw-flex-col">
5359
5453
  <!-- Header -->
@@ -5447,7 +5541,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
5447
5541
  NotificationSettingsComponent,
5448
5542
  ShortcutsPanelComponent
5449
5543
  ], template: `
5450
- <div class="tw-flex tw-h-full tw-bg-white dark:tw-bg-gray-900">
5544
+ <div class="tw-flex tw-h-full tw-bg-white dark:tw-bg-gray-900 tw-text-gray-900 dark:tw-text-gray-100">
5451
5545
  <!-- Left Sidebar Navigation -->
5452
5546
  <div class="tw-w-64 tw-border-r tw-border-gray-200 dark:tw-border-gray-700 tw-bg-gray-50 dark:tw-bg-gray-800 tw-flex tw-flex-col">
5453
5547
  <!-- Header -->
@@ -5926,7 +6020,7 @@ const layoutControlPannelChildRoutes = [{
5926
6020
  },
5927
6021
  {
5928
6022
  path: "home",
5929
- loadComponent: () => import('./cloud-ide-layout-home-wrapper.component-DBEz2uEN.mjs').then(c => c.CideLytHomeWrapperComponent),
6023
+ loadComponent: () => import('./cloud-ide-layout-home-wrapper.component-D3FEDXRo.mjs').then(c => c.CideLytHomeWrapperComponent),
5930
6024
  canActivate: [authGuard],
5931
6025
  data: {
5932
6026
  sypg_page_code: "cide_lyt_home" // Used by RequestService to fetch tab properties
@@ -7493,4 +7587,4 @@ var floatingEntityRightsSharing_component = /*#__PURE__*/Object.freeze({
7493
7587
  */
7494
7588
 
7495
7589
  export { AppStateHelperService as A, CideLytSharedWrapperComponent as C, ENVIRONMENT_CONFIG as E, NotificationSettingsService as N, CideLytSidebarService as a, CideLytRequestService as b, CideLytSidedrawerService as c, CideLytThemeService as d, AppStateService as e, CloudIdeLayoutService as f, CloudIdeLayoutComponent as g, CideLytSharedService as h, layoutControlPannelChildRoutes as i, CustomRouteReuseStrategy as j, CideLytUserStatusService as k, layoutRoutes as l, CacheManagerService as m, CideLytFileManagerService as n, CideLytFloatingEntityRightsSharingComponent as o, processThemeVariable as p, CideLytFloatingEntityRightsSharingService as q, setCSSVariable as s, themeFactory as t };
7496
- //# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-DKLoBtjT.mjs.map
7590
+ //# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-BbcIno6W.mjs.map