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.
- package/fesm2022/{cloud-ide-layout-cloud-ide-layout-DKLoBtjT.mjs → cloud-ide-layout-cloud-ide-layout-BbcIno6W.mjs} +125 -31
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-BbcIno6W.mjs.map +1 -0
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-BnbifwOg.mjs → cloud-ide-layout-drawer-theme.component-CAocxERw.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-BnbifwOg.mjs.map → cloud-ide-layout-drawer-theme.component-CAocxERw.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-floating-entity-selection.component-BWt2jNzs.mjs → cloud-ide-layout-floating-entity-selection.component-DMS4hfOP.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-floating-entity-selection.component-BWt2jNzs.mjs.map → cloud-ide-layout-floating-entity-selection.component-DMS4hfOP.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-DBEz2uEN.mjs → cloud-ide-layout-home-wrapper.component-D3FEDXRo.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-DBEz2uEN.mjs.map → cloud-ide-layout-home-wrapper.component-D3FEDXRo.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-CLgErxyC.mjs → cloud-ide-layout-sidedrawer-notes.component-DYbvtr2t.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-CLgErxyC.mjs.map → cloud-ide-layout-sidedrawer-notes.component-DYbvtr2t.mjs.map} +1 -1
- package/fesm2022/cloud-ide-layout.mjs +1 -1
- package/index.d.ts +5 -1
- package/package.json +1 -1
- 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-
|
|
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
|
-
|
|
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
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
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-
|
|
4697
|
-
this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-
|
|
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-
|
|
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-
|
|
7590
|
+
//# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-BbcIno6W.mjs.map
|