cloud-ide-layout 1.0.24 → 1.0.26

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, signal, computed, effect, Component, ElementRef, HostListener, ViewContainerRef, ViewChild, ViewChildren, InjectionToken, PLATFORM_ID, DestroyRef, Input, Directive } from '@angular/core';
2
+ import { Injectable, inject, signal, computed, effect, Component, ElementRef, HostListener, ViewContainerRef, ViewChild, ViewChildren, InjectionToken, PLATFORM_ID, EventEmitter, Output, Input } from '@angular/core';
3
3
  import { HttpClient } from '@angular/common/http';
4
4
  import { cidePath, hostManagerRoutesUrl, coreRoutesUrl, commonRoutesUrl, designConfigRoutesUrl } from 'cloud-ide-lms-model';
5
5
  import { Observable, throwError, of, BehaviorSubject, interval, take as take$1 } from 'rxjs';
@@ -7,13 +7,14 @@ import { map, filter, tap, catchError, shareReplay, take, distinctUntilChanged }
7
7
  import * as i2 from '@angular/router';
8
8
  import { Router, NavigationEnd, RouteReuseStrategy, RouterModule } from '@angular/router';
9
9
  import { Title } from '@angular/platform-browser';
10
- import { CideEleFileManagerService, CideElementsService, CideInputComponent, CideIconComponent, CideEleDropdownComponent, CideEleResizerDirective, TooltipDirective, CideSpinnerComponent, CideEleSkeletonLoaderComponent } from 'cloud-ide-element';
10
+ import { CideEleFileManagerService, CideElementsService, CideInputComponent, CideIconComponent, CideEleDropdownComponent, CideEleResizerDirective, TooltipDirective, CideSpinnerComponent, CideEleSkeletonLoaderComponent, CideEleFloatingContainerManagerComponent, CideEleGlobalNotificationsComponent, CideEleButtonComponent, CideEleFloatingContainerService } 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 { CloudIdeAuthService, authGuard } from 'cloud-ide-auth';
14
14
  import { trigger, state, transition, style, animate } from '@angular/animations';
15
15
  import { merge } from 'lodash';
16
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
16
+ import * as i2$1 from '@angular/forms';
17
+ import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
17
18
 
18
19
  class CloudIdeLayoutService {
19
20
  constructor() { }
@@ -2652,8 +2653,8 @@ class CideLytSidedrawerWrapperComponent {
2652
2653
  }
2653
2654
  ngOnInit() {
2654
2655
  // Initialize the component map (You'd likely populate this from a config or service)
2655
- this.componentMap['drowar_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-GT7A-85i.mjs').then(m => m.CideLytSidedrawerNotesComponent);
2656
- this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-B4u9LnTe.mjs').then(m => m.CideLytDrawerThemeComponent);
2656
+ this.componentMap['drowar_notes'] = () => import('./cloud-ide-layout-sidedrawer-notes.component-meLfK8As.mjs').then(m => m.CideLytSidedrawerNotesComponent);
2657
+ this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-CdUqFP29.mjs').then(m => m.CideLytDrawerThemeComponent);
2657
2658
  }
2658
2659
  async loadComponent(configFor) {
2659
2660
  console.log('🔍 SIDEDRAWER - Loading component:', configFor, 'Current tab:', this.currentTabId);
@@ -2997,15 +2998,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
2997
2998
 
2998
2999
  class CloudIdeLayoutComponent {
2999
3000
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CloudIdeLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3000
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CloudIdeLayoutComponent, isStandalone: true, selector: "cide-lyt-wrapper", ngImport: i0, template: `
3001
- <cide-lyt-layout-wrapper></cide-lyt-layout-wrapper>
3002
- `, isInline: true, styles: [""], dependencies: [{ kind: "component", type: CideLytLayoutWrapperComponent, selector: "cide-lyt-layout-wrapper" }] });
3001
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CloudIdeLayoutComponent, isStandalone: true, selector: "cide-lyt-wrapper", ngImport: i0, template: `
3002
+ <cide-lyt-layout-wrapper></cide-lyt-layout-wrapper>
3003
+
3004
+ <!-- Floating Container Manager -->
3005
+ <cide-ele-floating-container-manager></cide-ele-floating-container-manager>
3006
+
3007
+ <!-- Global Notifications and Confirmation Dialogs -->
3008
+ <cide-ele-global-notifications></cide-ele-global-notifications>
3009
+ `, isInline: true, styles: [""], dependencies: [{ kind: "component", type: CideLytLayoutWrapperComponent, selector: "cide-lyt-layout-wrapper" }, { kind: "component", type: CideEleFloatingContainerManagerComponent, selector: "cide-ele-floating-container-manager" }, { kind: "component", type: CideEleGlobalNotificationsComponent, selector: "cide-ele-global-notifications" }] });
3003
3010
  }
3004
3011
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CloudIdeLayoutComponent, decorators: [{
3005
3012
  type: Component,
3006
- args: [{ selector: 'cide-lyt-wrapper', standalone: true, template: `
3007
- <cide-lyt-layout-wrapper></cide-lyt-layout-wrapper>
3008
- `, imports: [CideLytLayoutWrapperComponent] }]
3013
+ args: [{ selector: 'cide-lyt-wrapper', standalone: true, template: `
3014
+ <cide-lyt-layout-wrapper></cide-lyt-layout-wrapper>
3015
+
3016
+ <!-- Floating Container Manager -->
3017
+ <cide-ele-floating-container-manager></cide-ele-floating-container-manager>
3018
+
3019
+ <!-- Global Notifications and Confirmation Dialogs -->
3020
+ <cide-ele-global-notifications></cide-ele-global-notifications>
3021
+ `, imports: [
3022
+ CideLytLayoutWrapperComponent,
3023
+ CideEleFloatingContainerManagerComponent,
3024
+ CideEleGlobalNotificationsComponent
3025
+ ] }]
3009
3026
  }] });
3010
3027
 
3011
3028
  var cloudIdeLayout_component = /*#__PURE__*/Object.freeze({
@@ -3025,7 +3042,7 @@ const layoutControlPannelChildRoutes = [{
3025
3042
  },
3026
3043
  {
3027
3044
  path: "home",
3028
- loadComponent: () => import('./cloud-ide-layout-home-wrapper.component-DEec7PZk.mjs').then(c => c.CideLytHomeWrapperComponent),
3045
+ loadComponent: () => import('./cloud-ide-layout-home-wrapper.component-DegRTEPv.mjs').then(c => c.CideLytHomeWrapperComponent),
3029
3046
  canActivate: [authGuard],
3030
3047
  data: {
3031
3048
  reuseTab: true, // For CustomRouteReuseStrategy
@@ -3282,557 +3299,635 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
3282
3299
  }]
3283
3300
  }] });
3284
3301
 
3285
- class CideLytFloatingUploadService {
3286
- destroyRef = inject(DestroyRef);
3287
- // Private signals for state management
3288
- _uploadQueue = signal([], ...(ngDevMode ? [{ debugName: "_uploadQueue" }] : []));
3289
- _isUploading = signal(false, ...(ngDevMode ? [{ debugName: "_isUploading" }] : []));
3290
- _uploadProgress = signal(0, ...(ngDevMode ? [{ debugName: "_uploadProgress" }] : []));
3291
- _isVisible = signal(false, ...(ngDevMode ? [{ debugName: "_isVisible" }] : []));
3292
- _currentUserId = signal('', ...(ngDevMode ? [{ debugName: "_currentUserId" }] : []));
3293
- // Public readonly signals
3294
- uploadQueue = this._uploadQueue.asReadonly();
3295
- isUploading = this._isUploading.asReadonly();
3296
- uploadProgress = this._uploadProgress.asReadonly();
3297
- isVisible = this._isVisible.asReadonly();
3298
- currentUserId = this._currentUserId.asReadonly();
3299
- // Computed values
3300
- hasUploads = computed(() => this._uploadQueue().length > 0, ...(ngDevMode ? [{ debugName: "hasUploads" }] : []));
3301
- pendingUploads = computed(() => this._uploadQueue().filter(upload => upload.status === 'pending'), ...(ngDevMode ? [{ debugName: "pendingUploads" }] : []));
3302
- activeUploads = computed(() => this._uploadQueue().filter(upload => upload.status === 'uploading'), ...(ngDevMode ? [{ debugName: "activeUploads" }] : []));
3303
- completedUploads = computed(() => this._uploadQueue().filter(upload => upload.status === 'completed'), ...(ngDevMode ? [{ debugName: "completedUploads" }] : []));
3304
- failedUploads = computed(() => this._uploadQueue().filter(upload => upload.status === 'error'), ...(ngDevMode ? [{ debugName: "failedUploads" }] : []));
3305
- // BehaviorSubjects for external subscriptions
3306
- uploadQueueSubject = new BehaviorSubject([]);
3307
- isUploadingSubject = new BehaviorSubject(false);
3308
- uploadProgressSubject = new BehaviorSubject(0);
3309
- isVisibleSubject = new BehaviorSubject(false);
3310
- currentUserIdSubject = new BehaviorSubject('');
3311
- // Public observables
3312
- uploadQueue$ = this.uploadQueueSubject.asObservable();
3313
- isUploading$ = this.isUploadingSubject.asObservable();
3314
- uploadProgress$ = this.uploadProgressSubject.asObservable();
3315
- isVisible$ = this.isVisibleSubject.asObservable();
3316
- currentUserId$ = this.currentUserIdSubject.asObservable();
3317
- constructor() {
3318
- console.log('🚀 [FloatingUploadService] Service initialized');
3319
- }
3320
- /**
3321
- * Set the current user ID
3322
- */
3323
- setCurrentUserId(userId) {
3324
- console.log('👤 [FloatingUploadService] Setting user ID:', userId);
3325
- this._currentUserId.set(userId);
3326
- this.currentUserIdSubject.next(userId);
3327
- }
3328
- /**
3329
- * Add files to upload queue
3330
- */
3331
- addFilesToQueue(files) {
3332
- console.log('📁 [FloatingUploadService] Adding files to queue:', files.length);
3333
- const newUploads = files.map(file => ({
3334
- fileId: this.generateFileId(),
3335
- fileName: file.name,
3336
- progress: 0,
3337
- status: 'pending'
3338
- }));
3339
- const currentQueue = this._uploadQueue();
3340
- const updatedQueue = [...currentQueue, ...newUploads];
3341
- this._uploadQueue.set(updatedQueue);
3342
- this.uploadQueueSubject.next(updatedQueue);
3343
- this.updateVisibility();
3344
- }
3345
- /**
3346
- * Update upload status
3347
- */
3348
- updateUploadStatus(fileId, status, progress, error, uploadedFile) {
3349
- console.log('🔄 [FloatingUploadService] Updating upload status:', fileId, status, progress);
3350
- const currentQueue = this._uploadQueue();
3351
- const updatedQueue = currentQueue.map(upload => upload.fileId === fileId
3352
- ? { ...upload, status, progress, error, uploadedFile }
3353
- : upload);
3354
- this._uploadQueue.set(updatedQueue);
3355
- this.uploadQueueSubject.next(updatedQueue);
3356
- this.updateUploadingState();
3357
- this.updateVisibility();
3358
- }
3359
- /**
3360
- * Cancel upload
3361
- */
3362
- cancelUpload(fileId) {
3363
- console.log('🚫 [FloatingUploadService] Cancelling upload:', fileId);
3364
- this.updateUploadStatus(fileId, 'cancelled', 0);
3365
- }
3366
- /**
3367
- * Remove upload from queue
3368
- */
3369
- removeUpload(fileId) {
3370
- console.log('🗑️ [FloatingUploadService] Removing upload:', fileId);
3371
- const currentQueue = this._uploadQueue();
3372
- const updatedQueue = currentQueue.filter(upload => upload.fileId !== fileId);
3373
- this._uploadQueue.set(updatedQueue);
3374
- this.uploadQueueSubject.next(updatedQueue);
3375
- this.updateUploadingState();
3376
- this.updateVisibility();
3377
- }
3378
- /**
3379
- * Clear all uploads
3380
- */
3381
- clearAllUploads() {
3382
- console.log('🧹 [FloatingUploadService] Clearing all uploads');
3383
- this._uploadQueue.set([]);
3384
- this.uploadQueueSubject.next([]);
3385
- this._isUploading.set(false);
3386
- this.isUploadingSubject.next(false);
3387
- this._uploadProgress.set(0);
3388
- this.uploadProgressSubject.next(0);
3389
- this._isVisible.set(false);
3390
- this.isVisibleSubject.next(false);
3391
- }
3392
- /**
3393
- * Clear completed uploads
3394
- */
3395
- clearCompletedUploads() {
3396
- console.log('✅ [FloatingUploadService] Clearing completed uploads');
3397
- const currentQueue = this._uploadQueue();
3398
- const updatedQueue = currentQueue.filter(upload => upload.status !== 'completed');
3399
- this._uploadQueue.set(updatedQueue);
3400
- this.uploadQueueSubject.next(updatedQueue);
3401
- this.updateUploadingState();
3402
- this.updateVisibility();
3403
- }
3404
- /**
3405
- * Handle all uploads complete
3406
- */
3407
- handleAllUploadsComplete(event) {
3408
- console.log('🎉 [FloatingUploadService] All uploads complete:', event);
3409
- // Update all pending/uploading files to completed
3410
- const currentQueue = this._uploadQueue();
3411
- const updatedQueue = currentQueue.map(upload => {
3412
- if (upload.status === 'pending' || upload.status === 'uploading') {
3413
- return { ...upload, status: 'completed', progress: 100 };
3414
- }
3415
- return upload;
3302
+ class CideLytFloatingEntityRightsSharingComponent {
3303
+ data;
3304
+ close = new EventEmitter();
3305
+ save = new EventEmitter();
3306
+ fb = inject(FormBuilder);
3307
+ // Tabs
3308
+ selectedTab = signal('user', ...(ngDevMode ? [{ debugName: "selectedTab" }] : []));
3309
+ // State signals
3310
+ entities = signal([], ...(ngDevMode ? [{ debugName: "entities" }] : []));
3311
+ selectedEntityId = signal('', ...(ngDevMode ? [{ debugName: "selectedEntityId" }] : []));
3312
+ entitiesLoading = signal(false, ...(ngDevMode ? [{ debugName: "entitiesLoading" }] : []));
3313
+ accessPassLoading = signal(false, ...(ngDevMode ? [{ debugName: "accessPassLoading" }] : []));
3314
+ saving = signal(false, ...(ngDevMode ? [{ debugName: "saving" }] : []));
3315
+ // Hierarchy state (mock)
3316
+ hierarchy = signal([], ...(ngDevMode ? [{ debugName: "hierarchy" }] : []));
3317
+ hierarchyLoading = signal(false, ...(ngDevMode ? [{ debugName: "hierarchyLoading" }] : []));
3318
+ // Form
3319
+ rightsForm;
3320
+ ngOnInit() {
3321
+ this.initializeForm();
3322
+ this.loadEntities();
3323
+ this.loadHierarchy();
3324
+ }
3325
+ selectTab(tab) {
3326
+ this.selectedTab.set(tab);
3327
+ }
3328
+ initializeForm() {
3329
+ this.rightsForm = this.fb.group({
3330
+ can_view: [false],
3331
+ can_edit: [false],
3332
+ is_owner: [false],
3333
+ syepm_isactive: [true]
3416
3334
  });
3417
- this._uploadQueue.set(updatedQueue);
3418
- this.uploadQueueSubject.next(updatedQueue);
3419
- this.updateUploadingState();
3420
- }
3421
- /**
3422
- * Show the floating uploader
3423
- */
3424
- show() {
3425
- console.log('👁️ [FloatingUploadService] Showing floating uploader');
3426
- this._isVisible.set(true);
3427
- this.isVisibleSubject.next(true);
3428
- }
3429
- /**
3430
- * Hide the floating uploader
3431
- */
3432
- hide() {
3433
- console.log('🙈 [FloatingUploadService] Hiding floating uploader');
3434
- this._isVisible.set(false);
3435
- this.isVisibleSubject.next(false);
3436
3335
  }
3437
- /**
3438
- * Update uploading state based on queue
3439
- */
3440
- updateUploadingState() {
3441
- const activeUploads = this.activeUploads();
3442
- const isUploading = activeUploads.length > 0;
3443
- this._isUploading.set(isUploading);
3444
- this.isUploadingSubject.next(isUploading);
3445
- if (isUploading) {
3446
- const totalProgress = activeUploads.reduce((sum, upload) => sum + upload.progress, 0);
3447
- const averageProgress = Math.round(totalProgress / activeUploads.length);
3448
- this._uploadProgress.set(averageProgress);
3449
- this.uploadProgressSubject.next(averageProgress);
3336
+ async loadEntities() {
3337
+ this.entitiesLoading.set(true);
3338
+ try {
3339
+ // Mock data for now
3340
+ const mockEntities = [
3341
+ {
3342
+ _id: 'owner-entity',
3343
+ syen_name: 'Owner Entity',
3344
+ syen_entity_code: 'E001',
3345
+ syen_isactive: true
3346
+ },
3347
+ {
3348
+ _id: 'entity-1',
3349
+ syen_name: 'Entity 1',
3350
+ syen_entity_code: 'E002',
3351
+ syen_isactive: true
3352
+ },
3353
+ {
3354
+ _id: 'entity-2',
3355
+ syen_name: 'Entity 2',
3356
+ syen_entity_code: 'E003',
3357
+ syen_isactive: true
3358
+ }
3359
+ ];
3360
+ this.entities.set(mockEntities);
3450
3361
  }
3451
- else {
3452
- this._uploadProgress.set(0);
3453
- this.uploadProgressSubject.next(0);
3362
+ catch (error) {
3363
+ console.error('Error loading entities:', error);
3364
+ }
3365
+ finally {
3366
+ this.entitiesLoading.set(false);
3454
3367
  }
3455
3368
  }
3456
- /**
3457
- * Update visibility based on upload state
3458
- */
3459
- updateVisibility() {
3460
- const hasActiveUploads = this.activeUploads().length > 0;
3461
- const hasPendingUploads = this.pendingUploads().length > 0;
3462
- const hasCompletedUploads = this.completedUploads().length > 0;
3463
- const hasFailedUploads = this.failedUploads().length > 0;
3464
- // Show if there are active, pending, or recent completed/failed uploads
3465
- const shouldShow = hasActiveUploads || hasPendingUploads || hasCompletedUploads || hasFailedUploads;
3466
- if (shouldShow && !this._isVisible()) {
3467
- this.show();
3369
+ async loadHierarchy() {
3370
+ this.hierarchyLoading.set(true);
3371
+ try {
3372
+ // Mock hierarchy uses same type for simplicity
3373
+ const mockHierarchy = [
3374
+ { _id: 'root', syen_name: 'Root Entity', syen_entity_code: 'R001', syen_isactive: true },
3375
+ { _id: 'child-1', syen_name: 'Department A', syen_entity_code: 'D-A', syen_isactive: true },
3376
+ { _id: 'child-2', syen_name: 'Department B', syen_entity_code: 'D-B', syen_isactive: true }
3377
+ ];
3378
+ this.hierarchy.set(mockHierarchy);
3468
3379
  }
3469
- else if (!shouldShow && this._isVisible()) {
3470
- this.hide();
3380
+ catch (err) {
3381
+ console.error('Error loading hierarchy:', err);
3382
+ }
3383
+ finally {
3384
+ this.hierarchyLoading.set(false);
3471
3385
  }
3472
3386
  }
3473
- /**
3474
- * Generate unique file ID
3475
- */
3476
- generateFileId() {
3477
- return `upload_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
3478
- }
3479
- /**
3480
- * Get upload by ID
3481
- */
3482
- getUploadById(fileId) {
3483
- return this._uploadQueue().find(upload => upload.fileId === fileId);
3484
- }
3485
- /**
3486
- * Get upload statistics
3487
- */
3488
- getUploadStats() {
3489
- const queue = this._uploadQueue();
3490
- return {
3491
- total: queue.length,
3492
- pending: queue.filter(u => u.status === 'pending').length,
3493
- uploading: queue.filter(u => u.status === 'uploading').length,
3494
- completed: queue.filter(u => u.status === 'completed').length,
3495
- failed: queue.filter(u => u.status === 'error').length,
3496
- cancelled: queue.filter(u => u.status === 'cancelled').length
3497
- };
3498
- }
3499
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingUploadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3500
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingUploadService, providedIn: 'root' });
3501
- }
3502
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingUploadService, decorators: [{
3503
- type: Injectable,
3504
- args: [{
3505
- providedIn: 'root'
3506
- }]
3507
- }], ctorParameters: () => [] });
3508
-
3509
- class CideLytFloatingFileUploaderComponent {
3510
- destroyRef = inject(DestroyRef);
3511
- floatingUploadService = inject(CideLytFloatingUploadService);
3512
- // Signals for reactive state
3513
- isVisible = signal(false, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
3514
- isMinimized = signal(false, ...(ngDevMode ? [{ debugName: "isMinimized" }] : []));
3515
- uploadQueue = signal([], ...(ngDevMode ? [{ debugName: "uploadQueue" }] : []));
3516
- isUploading = signal(false, ...(ngDevMode ? [{ debugName: "isUploading" }] : []));
3517
- uploadProgress = signal(0, ...(ngDevMode ? [{ debugName: "uploadProgress" }] : []));
3518
- currentUserId = signal('', ...(ngDevMode ? [{ debugName: "currentUserId" }] : []));
3519
- // Computed values
3520
- hasUploads = computed(() => this.uploadQueue().length > 0, ...(ngDevMode ? [{ debugName: "hasUploads" }] : []));
3521
- pendingUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'pending'), ...(ngDevMode ? [{ debugName: "pendingUploads" }] : []));
3522
- activeUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'uploading'), ...(ngDevMode ? [{ debugName: "activeUploads" }] : []));
3523
- completedUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'completed'), ...(ngDevMode ? [{ debugName: "completedUploads" }] : []));
3524
- failedUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'error'), ...(ngDevMode ? [{ debugName: "failedUploads" }] : []));
3525
- // Animation states
3526
- isAnimating = signal(false, ...(ngDevMode ? [{ debugName: "isAnimating" }] : []));
3527
- constructor() {
3528
- console.log('🚀 [FloatingFileUploader] Component initialized');
3529
- }
3530
- ngOnInit() {
3531
- // Subscribe to upload service state changes
3532
- this.floatingUploadService.uploadQueue$
3533
- .pipe(takeUntilDestroyed(this.destroyRef))
3534
- .subscribe(queue => {
3535
- this.uploadQueue.set(queue);
3536
- this.updateVisibility();
3537
- });
3538
- this.floatingUploadService.isUploading$
3539
- .pipe(takeUntilDestroyed(this.destroyRef))
3540
- .subscribe(isUploading => {
3541
- this.isUploading.set(isUploading);
3542
- });
3543
- this.floatingUploadService.uploadProgress$
3544
- .pipe(takeUntilDestroyed(this.destroyRef))
3545
- .subscribe(progress => {
3546
- this.uploadProgress.set(progress);
3547
- });
3548
- this.floatingUploadService.isVisible$
3549
- .pipe(takeUntilDestroyed(this.destroyRef))
3550
- .subscribe(visible => {
3551
- this.isVisible.set(visible);
3552
- });
3553
- this.floatingUploadService.currentUserId$
3554
- .pipe(takeUntilDestroyed(this.destroyRef))
3555
- .subscribe(userId => {
3556
- this.currentUserId.set(userId);
3557
- });
3558
- }
3559
- ngOnDestroy() {
3560
- console.log('🧹 [FloatingFileUploader] Component destroyed');
3387
+ selectEntity(entityId) {
3388
+ this.selectedEntityId.set(entityId);
3389
+ this.loadAccessPassData();
3561
3390
  }
3562
- /**
3563
- * Update visibility based on upload state
3564
- */
3565
- updateVisibility() {
3566
- const hasActiveUploads = this.activeUploads().length > 0;
3567
- const hasPendingUploads = this.pendingUploads().length > 0;
3568
- const hasCompletedUploads = this.completedUploads().length > 0;
3569
- const hasFailedUploads = this.failedUploads().length > 0;
3570
- // Show if there are active, pending, or recent completed/failed uploads
3571
- const shouldShow = hasActiveUploads || hasPendingUploads || hasCompletedUploads || hasFailedUploads;
3572
- if (shouldShow && !this.isVisible()) {
3573
- this.showWithAnimation();
3391
+ async loadAccessPassData() {
3392
+ if (!this.selectedEntityId())
3393
+ return;
3394
+ this.accessPassLoading.set(true);
3395
+ try {
3396
+ // Mock data for now
3397
+ await new Promise(resolve => setTimeout(resolve, 500));
3398
+ // Set form values based on mock data
3399
+ this.rightsForm.patchValue({
3400
+ can_view: true,
3401
+ can_edit: false,
3402
+ is_owner: this.selectedEntityId() === 'owner-entity',
3403
+ syepm_isactive: true
3404
+ });
3574
3405
  }
3575
- else if (!shouldShow && this.isVisible()) {
3576
- this.hideWithAnimation();
3406
+ catch (error) {
3407
+ console.error('Error loading access pass data:', error);
3577
3408
  }
3578
- }
3579
- /**
3580
- * Show with animation
3581
- */
3582
- showWithAnimation() {
3583
- this.isAnimating.set(true);
3584
- this.isVisible.set(true);
3585
- // Remove animation class after animation completes
3586
- setTimeout(() => {
3587
- this.isAnimating.set(false);
3588
- }, 300);
3589
- }
3590
- /**
3591
- * Hide with animation
3592
- */
3593
- hideWithAnimation() {
3594
- this.isAnimating.set(true);
3595
- // Wait for animation to complete before hiding
3596
- setTimeout(() => {
3597
- this.isVisible.set(false);
3598
- this.isAnimating.set(false);
3599
- }, 300);
3600
- }
3601
- /**
3602
- * Toggle minimize state
3603
- */
3604
- toggleMinimize() {
3605
- this.isMinimized.set(!this.isMinimized());
3606
- }
3607
- /**
3608
- * Close the floating uploader
3609
- */
3610
- close() {
3611
- this.floatingUploadService.clearAllUploads();
3612
- this.hideWithAnimation();
3613
- }
3614
- /**
3615
- * Handle file upload completion
3616
- */
3617
- onUploadComplete(event) {
3618
- console.log('✅ [FloatingFileUploader] Upload completed:', event);
3619
- this.floatingUploadService.updateUploadStatus(event.fileId, 'completed', 100, undefined, event.uploadedFile);
3620
- }
3621
- /**
3622
- * Handle upload error
3623
- */
3624
- onUploadError(event) {
3625
- console.error('❌ [FloatingFileUploader] Upload error:', event);
3626
- this.floatingUploadService.updateUploadStatus(event.fileId, 'error', 0, event.error);
3627
- }
3628
- /**
3629
- * Handle upload cancellation
3630
- */
3631
- onUploadCancelled(fileId) {
3632
- console.log('🚫 [FloatingFileUploader] Upload cancelled:', fileId);
3633
- this.floatingUploadService.cancelUpload(fileId);
3634
- }
3635
- /**
3636
- * Handle all uploads complete
3637
- */
3638
- onAllUploadsComplete(event) {
3639
- console.log('🎉 [FloatingFileUploader] All uploads complete:', event);
3640
- this.floatingUploadService.handleAllUploadsComplete(event);
3641
- }
3642
- /**
3643
- * Get status icon
3644
- */
3645
- getStatusIcon(status) {
3646
- switch (status) {
3647
- case 'pending': return 'schedule';
3648
- case 'uploading': return 'cloud_upload';
3649
- case 'completed': return 'check_circle';
3650
- case 'error': return 'error';
3651
- case 'cancelled': return 'cancel';
3652
- default: return 'help';
3409
+ finally {
3410
+ this.accessPassLoading.set(false);
3653
3411
  }
3654
3412
  }
3655
- /**
3656
- * Get status class
3657
- */
3658
- getStatusClass(status) {
3659
- switch (status) {
3660
- case 'pending': return 'status-pending';
3661
- case 'uploading': return 'status-uploading';
3662
- case 'completed': return 'status-completed';
3663
- case 'error': return 'status-error';
3664
- case 'cancelled': return 'status-cancelled';
3665
- default: return 'status-unknown';
3413
+ async saveRights() {
3414
+ if (this.rightsForm.invalid)
3415
+ return;
3416
+ this.saving.set(true);
3417
+ try {
3418
+ const formValue = this.rightsForm.value;
3419
+ console.log('Saving rights:', formValue);
3420
+ // TODO: Replace with actual API call
3421
+ await new Promise(resolve => setTimeout(resolve, 1000));
3422
+ console.log('Rights saved successfully');
3423
+ this.save.emit(formValue);
3666
3424
  }
3667
- }
3425
+ catch (error) {
3426
+ console.error('Error saving rights:', error);
3427
+ }
3428
+ finally {
3429
+ this.saving.set(false);
3430
+ }
3431
+ }
3432
+ onCancel() {
3433
+ this.close.emit();
3434
+ }
3435
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingEntityRightsSharingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3436
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideLytFloatingEntityRightsSharingComponent, isStandalone: true, selector: "cide-lyt-floating-entity-rights-sharing", inputs: { data: "data" }, outputs: { close: "close", save: "save" }, ngImport: i0, template: `
3437
+ <!-- Entity Rights Sharing Content -->
3438
+ <div class="tw-p-4 tw-overflow-y-auto tw-max-h-[calc(80vh-120px)] tw-scrollbar-thin tw-scrollbar-thumb-gray-300 tw-scrollbar-track-transparent tw-select-none">
3439
+ <!-- Tabs / Pills -->
3440
+ <div class="tw-mb-3 tw-flex tw-items-center tw-gap-2">
3441
+ <button type="button"
3442
+ class="tw-text-xs tw-font-medium tw-rounded-full tw-px-3 tw-py-1 tw-transition-colors"
3443
+ [class.tw-bg-blue-600]="selectedTab() === 'user'"
3444
+ [class.tw-text-white]="selectedTab() === 'user'"
3445
+ [class.tw-bg-gray-100]="selectedTab() !== 'user'"
3446
+ [class.tw-text-gray-700]="selectedTab() !== 'user'"
3447
+ (click)="selectTab('user')">
3448
+ User Linked
3449
+ </button>
3450
+ <button type="button"
3451
+ class="tw-text-xs tw-font-medium tw-rounded-full tw-px-3 tw-py-1 tw-transition-colors"
3452
+ [class.tw-bg-blue-600]="selectedTab() === 'hierarchy'"
3453
+ [class.tw-text-white]="selectedTab() === 'hierarchy'"
3454
+ [class.tw-bg-gray-100]="selectedTab() !== 'hierarchy'"
3455
+ [class.tw-text-gray-700]="selectedTab() !== 'hierarchy'"
3456
+ (click)="selectTab('hierarchy')">
3457
+ Entity Hierarchy
3458
+ </button>
3459
+ </div>
3460
+
3461
+ <!-- User Linked Entities -->
3462
+ @if (selectedTab() === 'user') {
3463
+ <div class="tw-mb-4">
3464
+
3465
+ @if (entitiesLoading()) {
3466
+ <div class="tw-flex tw-items-center tw-justify-center tw-py-6">
3467
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3468
+ <span class="tw-ml-3 tw-text-gray-600 tw-text-sm">Loading entities...</span>
3469
+ </div>
3470
+ } @else if (entities().length === 0) {
3471
+ <div class="tw-text-center tw-py-6">
3472
+ <div class="tw-w-10 tw-h-10 tw-bg-gray-100 tw-rounded-xl tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-2">
3473
+ <cide-ele-icon class="tw-w-5 tw-h-5 tw-text-gray-400">business</cide-ele-icon>
3474
+ </div>
3475
+ <p class="tw-text-gray-500 tw-text-sm">No entities available</p>
3476
+ </div>
3477
+ } @else {
3478
+ <div class="tw-space-y-2">
3479
+ @defer (when entities().length > 0) {
3480
+ @for (entity of entities(); track entity._id || entity.syen_name) {
3481
+ <div class="tw-bg-white tw-bg-opacity-80 tw-backdrop-blur-sm tw-border tw-border-gray-200 tw-border-opacity-50 tw-rounded-xl tw-p-3 tw-cursor-pointer tw-transition-all tw-duration-200 hover:tw-shadow-md hover:tw-border-blue-300 hover:tw-border-opacity-50 hover:tw-scale-[1.01] tw-group tw-select-none"
3482
+ [class.tw-border-blue-500]="selectedEntityId() === entity._id"
3483
+ [class.tw-bg-blue-50]="selectedEntityId() === entity._id"
3484
+ (click)="selectEntity(entity._id || '')">
3485
+ <div class="tw-flex tw-items-start tw-space-x-3">
3486
+ <div class="tw-w-6 tw-h-6 tw-bg-gray-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center tw-flex-shrink-0">
3487
+ <cide-ele-icon class="tw-text-gray-600">person</cide-ele-icon>
3488
+ </div>
3489
+ <div class="tw-flex-1 tw-min-w-0">
3490
+ <div class="tw-flex tw-items-center tw-space-x-2 tw-mb-1">
3491
+ <h4 class="tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate">{{ entity.syen_name }}</h4>
3492
+ @if (entity._id === 'owner-entity') {
3493
+ <div class="tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800 tw-space-x-1">
3494
+ <cide-ele-icon>admin_panel_settings</cide-ele-icon>
3495
+ <span>Owner</span>
3496
+ </div>
3497
+ }
3498
+ </div>
3499
+ <div class="tw-flex tw-items-center tw-space-x-3">
3500
+ <div class="tw-flex tw-items-center tw-space-x-1">
3501
+ <cide-ele-icon class="tw-text-gray-400">visibility</cide-ele-icon>
3502
+ <span class="tw-text-xs tw-text-gray-500">View</span>
3503
+ </div>
3504
+ <div class="tw-flex tw-items-center tw-space-x-1">
3505
+ <cide-ele-icon class="tw-text-gray-400">edit</cide-ele-icon>
3506
+ <span class="tw-text-xs tw-text-gray-500">Edit</span>
3507
+ </div>
3508
+ </div>
3509
+ </div>
3510
+ @if (selectedEntityId() === entity._id) {
3511
+ <div class="tw-w-4 tw-h-4 tw-bg-green-500 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-flex-shrink-0">
3512
+ <cide-ele-icon class="tw-text-white">done</cide-ele-icon>
3513
+ </div>
3514
+ }
3515
+ </div>
3516
+ </div>
3517
+ }
3518
+ } @placeholder {
3519
+ <div class="tw-flex tw-items-center tw-justify-center tw-py-4">
3520
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3521
+ <span class="tw-ml-2 tw-text-sm tw-text-gray-600">Loading entities...</span>
3522
+ </div>
3523
+ }
3524
+ </div>
3525
+ }
3526
+ </div>
3527
+ }
3528
+
3529
+ <!-- Entity Hierarchy -->
3530
+ @if (selectedTab() === 'hierarchy') {
3531
+ <div class="tw-mb-4">
3532
+ @if (hierarchyLoading()) {
3533
+ <div class="tw-flex tw-items-center tw-justify-center tw-py-6">
3534
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3535
+ <span class="tw-ml-3 tw-text-gray-600 tw-text-sm">Loading hierarchy...</span>
3536
+ </div>
3537
+ } @else {
3538
+ <div class="tw-space-y-2">
3539
+ @for (node of hierarchy(); track node._id) {
3540
+ <div class="tw-bg-white tw-border tw-border-gray-200 tw-rounded-xl tw-p-3">
3541
+ <div class="tw-flex tw-items-center tw-justify-between">
3542
+ <div class="tw-flex tw-items-center tw-gap-2">
3543
+ <cide-ele-icon class="tw-text-gray-500">account_tree</cide-ele-icon>
3544
+ <span class="tw-text-sm tw-font-medium tw-text-gray-800">{{ node.syen_name }}</span>
3545
+ </div>
3546
+ <span class="tw-text-xs tw-text-gray-500">Code: {{ node.syen_entity_code }}</span>
3547
+ </div>
3548
+ </div>
3549
+ }
3550
+ </div>
3551
+ }
3552
+ </div>
3553
+ }
3554
+
3555
+ <!-- Rights Management -->
3556
+ @if (selectedEntityId()) {
3557
+ <div class="tw-bg-white tw-bg-opacity-80 tw-backdrop-blur-sm tw-border tw-border-gray-200 tw-border-opacity-50 tw-rounded-xl tw-p-3 tw-shadow-sm">
3558
+ <div class="tw-flex tw-items-center tw-space-x-2 tw-mb-3">
3559
+ <cide-ele-icon class="tw-text-green-600">security</cide-ele-icon>
3560
+ <h3 class="tw-text-sm tw-font-semibold tw-text-gray-900">Manage Rights</h3>
3561
+ </div>
3562
+
3563
+ @if (accessPassLoading()) {
3564
+ <div class="tw-flex tw-items-center tw-justify-center tw-min-h-[80px]">
3565
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3566
+ <span class="tw-ml-3 tw-text-gray-600 tw-text-sm">Loading...</span>
3567
+ </div>
3568
+ } @else {
3569
+ @defer (when !accessPassLoading()) {
3570
+ <form [formGroup]="rightsForm" (ngSubmit)="saveRights()">
3571
+ <div class="tw-flex tw-flex-wrap tw-gap-3 tw-min-h-[80px] tw-items-center">
3572
+ <div class="tw-flex tw-items-center tw-space-x-2">
3573
+ <cide-ele-input
3574
+ type="checkbox"
3575
+ formControlName="can_view"
3576
+ label="View">
3577
+ </cide-ele-input>
3578
+ </div>
3579
+
3580
+ <div class="tw-flex tw-items-center tw-space-x-2">
3581
+ <cide-ele-input
3582
+ type="checkbox"
3583
+ formControlName="can_edit"
3584
+ label="Edit">
3585
+ </cide-ele-input>
3586
+ </div>
3587
+
3588
+ <div class="tw-flex tw-items-center tw-space-x-2">
3589
+ <cide-ele-input
3590
+ type="checkbox"
3591
+ formControlName="is_owner"
3592
+ label="Is Owner">
3593
+ </cide-ele-input>
3594
+ </div>
3595
+
3596
+ <div class="tw-flex tw-items-center tw-space-x-2">
3597
+ <cide-ele-input
3598
+ type="checkbox"
3599
+ formControlName="syepm_isactive"
3600
+ label="Is Active">
3601
+ </cide-ele-input>
3602
+ </div>
3603
+ </div>
3604
+ </form>
3605
+ } @placeholder {
3606
+ <div class="tw-flex tw-items-center tw-justify-center tw-min-h-[80px]">
3607
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3608
+ <span class="tw-ml-2 tw-text-sm tw-text-gray-600">Loading rights...</span>
3609
+ </div>
3610
+ }
3611
+ }
3612
+ </div>
3613
+ }
3614
+ </div>
3615
+
3616
+ <!-- Footer -->
3617
+ <div class="tw-bg-white tw-bg-opacity-80 tw-backdrop-blur-sm tw-px-4 tw-py-3 tw-border-t tw-border-gray-200 tw-border-opacity-30 tw-flex tw-justify-end tw-space-x-2">
3618
+ <button cideEleButton variant="secondary" size="xs" type="button" (click)="onCancel()">
3619
+ Cancel
3620
+ </button>
3621
+ @if (selectedEntityId()) {
3622
+ <button cideEleButton variant="primary" size="xs" type="button" (click)="saveRights()"
3623
+ [disabled]="rightsForm.invalid || saving()" [loading]="saving()">
3624
+ {{ saving() ? 'Saving...' : 'Save' }}
3625
+ </button>
3626
+ }
3627
+ </div>
3628
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: CideEleButtonComponent, selector: "button[cideEleButton], a[cideEleButton]", inputs: ["label", "variant", "size", "type", "shape", "elevation", "disabled", "id", "loading", "fullWidth", "leftIcon", "rightIcon", "customClass", "tooltip", "ariaLabel", "testId", "routerLink", "routerExtras", "preventDoubleClick", "animated"], outputs: ["btnClick", "doubleClick"] }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }, { kind: "component", type: CideSpinnerComponent, selector: "cide-ele-spinner", inputs: ["size", "type"] }], deferBlockDependencies: [() => [CideIconComponent], () => [i2$1.ɵNgNoValidate, i2$1.NgControlStatus, i2$1.NgControlStatusGroup, i2$1.FormGroupDirective, i2$1.FormControlName, CideInputComponent]] });
3629
+ }
3630
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingEntityRightsSharingComponent, decorators: [{
3631
+ type: Component,
3632
+ args: [{ selector: 'cide-lyt-floating-entity-rights-sharing', standalone: true, imports: [
3633
+ CommonModule,
3634
+ ReactiveFormsModule,
3635
+ CideEleButtonComponent,
3636
+ CideInputComponent,
3637
+ CideIconComponent,
3638
+ CideSpinnerComponent
3639
+ ], template: `
3640
+ <!-- Entity Rights Sharing Content -->
3641
+ <div class="tw-p-4 tw-overflow-y-auto tw-max-h-[calc(80vh-120px)] tw-scrollbar-thin tw-scrollbar-thumb-gray-300 tw-scrollbar-track-transparent tw-select-none">
3642
+ <!-- Tabs / Pills -->
3643
+ <div class="tw-mb-3 tw-flex tw-items-center tw-gap-2">
3644
+ <button type="button"
3645
+ class="tw-text-xs tw-font-medium tw-rounded-full tw-px-3 tw-py-1 tw-transition-colors"
3646
+ [class.tw-bg-blue-600]="selectedTab() === 'user'"
3647
+ [class.tw-text-white]="selectedTab() === 'user'"
3648
+ [class.tw-bg-gray-100]="selectedTab() !== 'user'"
3649
+ [class.tw-text-gray-700]="selectedTab() !== 'user'"
3650
+ (click)="selectTab('user')">
3651
+ User Linked
3652
+ </button>
3653
+ <button type="button"
3654
+ class="tw-text-xs tw-font-medium tw-rounded-full tw-px-3 tw-py-1 tw-transition-colors"
3655
+ [class.tw-bg-blue-600]="selectedTab() === 'hierarchy'"
3656
+ [class.tw-text-white]="selectedTab() === 'hierarchy'"
3657
+ [class.tw-bg-gray-100]="selectedTab() !== 'hierarchy'"
3658
+ [class.tw-text-gray-700]="selectedTab() !== 'hierarchy'"
3659
+ (click)="selectTab('hierarchy')">
3660
+ Entity Hierarchy
3661
+ </button>
3662
+ </div>
3663
+
3664
+ <!-- User Linked Entities -->
3665
+ @if (selectedTab() === 'user') {
3666
+ <div class="tw-mb-4">
3667
+
3668
+ @if (entitiesLoading()) {
3669
+ <div class="tw-flex tw-items-center tw-justify-center tw-py-6">
3670
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3671
+ <span class="tw-ml-3 tw-text-gray-600 tw-text-sm">Loading entities...</span>
3672
+ </div>
3673
+ } @else if (entities().length === 0) {
3674
+ <div class="tw-text-center tw-py-6">
3675
+ <div class="tw-w-10 tw-h-10 tw-bg-gray-100 tw-rounded-xl tw-flex tw-items-center tw-justify-center tw-mx-auto tw-mb-2">
3676
+ <cide-ele-icon class="tw-w-5 tw-h-5 tw-text-gray-400">business</cide-ele-icon>
3677
+ </div>
3678
+ <p class="tw-text-gray-500 tw-text-sm">No entities available</p>
3679
+ </div>
3680
+ } @else {
3681
+ <div class="tw-space-y-2">
3682
+ @defer (when entities().length > 0) {
3683
+ @for (entity of entities(); track entity._id || entity.syen_name) {
3684
+ <div class="tw-bg-white tw-bg-opacity-80 tw-backdrop-blur-sm tw-border tw-border-gray-200 tw-border-opacity-50 tw-rounded-xl tw-p-3 tw-cursor-pointer tw-transition-all tw-duration-200 hover:tw-shadow-md hover:tw-border-blue-300 hover:tw-border-opacity-50 hover:tw-scale-[1.01] tw-group tw-select-none"
3685
+ [class.tw-border-blue-500]="selectedEntityId() === entity._id"
3686
+ [class.tw-bg-blue-50]="selectedEntityId() === entity._id"
3687
+ (click)="selectEntity(entity._id || '')">
3688
+ <div class="tw-flex tw-items-start tw-space-x-3">
3689
+ <div class="tw-w-6 tw-h-6 tw-bg-gray-100 tw-rounded-lg tw-flex tw-items-center tw-justify-center tw-flex-shrink-0">
3690
+ <cide-ele-icon class="tw-text-gray-600">person</cide-ele-icon>
3691
+ </div>
3692
+ <div class="tw-flex-1 tw-min-w-0">
3693
+ <div class="tw-flex tw-items-center tw-space-x-2 tw-mb-1">
3694
+ <h4 class="tw-text-sm tw-font-semibold tw-text-gray-900 tw-truncate">{{ entity.syen_name }}</h4>
3695
+ @if (entity._id === 'owner-entity') {
3696
+ <div class="tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium tw-bg-green-100 tw-text-green-800 tw-space-x-1">
3697
+ <cide-ele-icon>admin_panel_settings</cide-ele-icon>
3698
+ <span>Owner</span>
3699
+ </div>
3700
+ }
3701
+ </div>
3702
+ <div class="tw-flex tw-items-center tw-space-x-3">
3703
+ <div class="tw-flex tw-items-center tw-space-x-1">
3704
+ <cide-ele-icon class="tw-text-gray-400">visibility</cide-ele-icon>
3705
+ <span class="tw-text-xs tw-text-gray-500">View</span>
3706
+ </div>
3707
+ <div class="tw-flex tw-items-center tw-space-x-1">
3708
+ <cide-ele-icon class="tw-text-gray-400">edit</cide-ele-icon>
3709
+ <span class="tw-text-xs tw-text-gray-500">Edit</span>
3710
+ </div>
3711
+ </div>
3712
+ </div>
3713
+ @if (selectedEntityId() === entity._id) {
3714
+ <div class="tw-w-4 tw-h-4 tw-bg-green-500 tw-rounded-full tw-flex tw-items-center tw-justify-center tw-flex-shrink-0">
3715
+ <cide-ele-icon class="tw-text-white">done</cide-ele-icon>
3716
+ </div>
3717
+ }
3718
+ </div>
3719
+ </div>
3720
+ }
3721
+ } @placeholder {
3722
+ <div class="tw-flex tw-items-center tw-justify-center tw-py-4">
3723
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3724
+ <span class="tw-ml-2 tw-text-sm tw-text-gray-600">Loading entities...</span>
3725
+ </div>
3726
+ }
3727
+ </div>
3728
+ }
3729
+ </div>
3730
+ }
3731
+
3732
+ <!-- Entity Hierarchy -->
3733
+ @if (selectedTab() === 'hierarchy') {
3734
+ <div class="tw-mb-4">
3735
+ @if (hierarchyLoading()) {
3736
+ <div class="tw-flex tw-items-center tw-justify-center tw-py-6">
3737
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3738
+ <span class="tw-ml-3 tw-text-gray-600 tw-text-sm">Loading hierarchy...</span>
3739
+ </div>
3740
+ } @else {
3741
+ <div class="tw-space-y-2">
3742
+ @for (node of hierarchy(); track node._id) {
3743
+ <div class="tw-bg-white tw-border tw-border-gray-200 tw-rounded-xl tw-p-3">
3744
+ <div class="tw-flex tw-items-center tw-justify-between">
3745
+ <div class="tw-flex tw-items-center tw-gap-2">
3746
+ <cide-ele-icon class="tw-text-gray-500">account_tree</cide-ele-icon>
3747
+ <span class="tw-text-sm tw-font-medium tw-text-gray-800">{{ node.syen_name }}</span>
3748
+ </div>
3749
+ <span class="tw-text-xs tw-text-gray-500">Code: {{ node.syen_entity_code }}</span>
3750
+ </div>
3751
+ </div>
3752
+ }
3753
+ </div>
3754
+ }
3755
+ </div>
3756
+ }
3757
+
3758
+ <!-- Rights Management -->
3759
+ @if (selectedEntityId()) {
3760
+ <div class="tw-bg-white tw-bg-opacity-80 tw-backdrop-blur-sm tw-border tw-border-gray-200 tw-border-opacity-50 tw-rounded-xl tw-p-3 tw-shadow-sm">
3761
+ <div class="tw-flex tw-items-center tw-space-x-2 tw-mb-3">
3762
+ <cide-ele-icon class="tw-text-green-600">security</cide-ele-icon>
3763
+ <h3 class="tw-text-sm tw-font-semibold tw-text-gray-900">Manage Rights</h3>
3764
+ </div>
3765
+
3766
+ @if (accessPassLoading()) {
3767
+ <div class="tw-flex tw-items-center tw-justify-center tw-min-h-[80px]">
3768
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3769
+ <span class="tw-ml-3 tw-text-gray-600 tw-text-sm">Loading...</span>
3770
+ </div>
3771
+ } @else {
3772
+ @defer (when !accessPassLoading()) {
3773
+ <form [formGroup]="rightsForm" (ngSubmit)="saveRights()">
3774
+ <div class="tw-flex tw-flex-wrap tw-gap-3 tw-min-h-[80px] tw-items-center">
3775
+ <div class="tw-flex tw-items-center tw-space-x-2">
3776
+ <cide-ele-input
3777
+ type="checkbox"
3778
+ formControlName="can_view"
3779
+ label="View">
3780
+ </cide-ele-input>
3781
+ </div>
3782
+
3783
+ <div class="tw-flex tw-items-center tw-space-x-2">
3784
+ <cide-ele-input
3785
+ type="checkbox"
3786
+ formControlName="can_edit"
3787
+ label="Edit">
3788
+ </cide-ele-input>
3789
+ </div>
3790
+
3791
+ <div class="tw-flex tw-items-center tw-space-x-2">
3792
+ <cide-ele-input
3793
+ type="checkbox"
3794
+ formControlName="is_owner"
3795
+ label="Is Owner">
3796
+ </cide-ele-input>
3797
+ </div>
3798
+
3799
+ <div class="tw-flex tw-items-center tw-space-x-2">
3800
+ <cide-ele-input
3801
+ type="checkbox"
3802
+ formControlName="syepm_isactive"
3803
+ label="Is Active">
3804
+ </cide-ele-input>
3805
+ </div>
3806
+ </div>
3807
+ </form>
3808
+ } @placeholder {
3809
+ <div class="tw-flex tw-items-center tw-justify-center tw-min-h-[80px]">
3810
+ <cide-ele-spinner size="sm"></cide-ele-spinner>
3811
+ <span class="tw-ml-2 tw-text-sm tw-text-gray-600">Loading rights...</span>
3812
+ </div>
3813
+ }
3814
+ }
3815
+ </div>
3816
+ }
3817
+ </div>
3818
+
3819
+ <!-- Footer -->
3820
+ <div class="tw-bg-white tw-bg-opacity-80 tw-backdrop-blur-sm tw-px-4 tw-py-3 tw-border-t tw-border-gray-200 tw-border-opacity-30 tw-flex tw-justify-end tw-space-x-2">
3821
+ <button cideEleButton variant="secondary" size="xs" type="button" (click)="onCancel()">
3822
+ Cancel
3823
+ </button>
3824
+ @if (selectedEntityId()) {
3825
+ <button cideEleButton variant="primary" size="xs" type="button" (click)="saveRights()"
3826
+ [disabled]="rightsForm.invalid || saving()" [loading]="saving()">
3827
+ {{ saving() ? 'Saving...' : 'Save' }}
3828
+ </button>
3829
+ }
3830
+ </div>
3831
+ ` }]
3832
+ }], propDecorators: { data: [{
3833
+ type: Input
3834
+ }], close: [{
3835
+ type: Output
3836
+ }], save: [{
3837
+ type: Output
3838
+ }] } });
3839
+
3840
+ var floatingEntityRightsSharing_component = /*#__PURE__*/Object.freeze({
3841
+ __proto__: null,
3842
+ CideLytFloatingEntityRightsSharingComponent: CideLytFloatingEntityRightsSharingComponent
3843
+ });
3844
+
3845
+ class CideLytFloatingEntityRightsSharingService {
3846
+ containerService = inject(CideEleFloatingContainerService);
3668
3847
  /**
3669
- * Get file size display
3848
+ * Show entity rights sharing in floating container
3670
3849
  */
3671
- getFileSizeDisplay(size) {
3672
- if (size === 0)
3673
- return '0 Bytes';
3674
- const k = 1024;
3675
- const sizes = ['Bytes', 'KB', 'MB', 'GB'];
3676
- const i = Math.floor(Math.log(size) / Math.log(k));
3677
- return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
3850
+ async show(data) {
3851
+ console.log('🚀 Showing entity rights sharing...');
3852
+ console.log('📋 Current registered components:', this.containerService.getRegisteredComponentIds());
3853
+ // Lazy registration - only register if not already registered
3854
+ if (!this.containerService.isComponentRegistered('entity-rights-sharing')) {
3855
+ console.log('📝 Registering entity rights sharing component...');
3856
+ await this.registerEntityRightsSharingComponent();
3857
+ console.log('📋 Components after registration:', this.containerService.getRegisteredComponentIds());
3858
+ }
3859
+ else {
3860
+ console.log('✅ Entity rights sharing component already registered');
3861
+ }
3862
+ const config = {
3863
+ id: 'entity-rights-sharing-main',
3864
+ title: 'Entity Rights Sharing',
3865
+ icon: 'share',
3866
+ width: '450px',
3867
+ height: '500px',
3868
+ minWidth: '400px',
3869
+ minHeight: '400px',
3870
+ resizable: true,
3871
+ draggable: true,
3872
+ closable: true,
3873
+ minimizable: true,
3874
+ maximizable: true,
3875
+ componentId: 'entity-rights-sharing',
3876
+ componentConfig: {
3877
+ inputs: data ? { data } : undefined
3878
+ }
3879
+ };
3880
+ const containerId = this.containerService.show(config);
3881
+ console.log('✅ Container created with ID:', containerId);
3882
+ return containerId;
3678
3883
  }
3679
3884
  /**
3680
- * Get overall progress percentage
3885
+ * Hide entity rights sharing
3681
3886
  */
3682
- getOverallProgress() {
3683
- const uploads = this.uploadQueue();
3684
- if (uploads.length === 0)
3685
- return 0;
3686
- const totalProgress = uploads.reduce((sum, upload) => sum + upload.progress, 0);
3687
- return Math.round(totalProgress / uploads.length);
3887
+ hide() {
3888
+ this.containerService.hide('entity-rights-sharing-main');
3688
3889
  }
3689
3890
  /**
3690
- * Get upload summary text
3891
+ * Register the entity rights sharing component
3691
3892
  */
3692
- getUploadSummary() {
3693
- const active = this.activeUploads().length;
3694
- const completed = this.completedUploads().length;
3695
- const failed = this.failedUploads().length;
3696
- const pending = this.pendingUploads().length;
3697
- if (active > 0) {
3698
- return `${active} uploading`;
3699
- }
3700
- else if (completed > 0 && failed === 0) {
3701
- return `${completed} completed`;
3702
- }
3703
- else if (failed > 0) {
3704
- return `${completed} completed, ${failed} failed`;
3705
- }
3706
- else if (pending > 0) {
3707
- return `${pending} pending`;
3708
- }
3709
- return 'No uploads';
3710
- }
3711
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingFileUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3712
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideLytFloatingFileUploaderComponent, isStandalone: true, selector: "cide-layout-floating-file-uploader", ngImport: i0, template: "<!-- Floating File Uploader Container -->\n@if (isVisible()) {\n<div class=\"floating-uploader\" \n [class.minimized]=\"isMinimized()\" \n [class.animating]=\"isAnimating()\"\n [class.uploading]=\"isUploading()\">\n\n <!-- Header -->\n <div class=\"uploader-header\">\n <div class=\"header-left\">\n <div class=\"upload-icon\">\n <cide-ele-icon size=\"sm\">cloud_upload</cide-ele-icon>\n </div>\n <div class=\"upload-info\">\n <div class=\"upload-title\">File Upload</div>\n <div class=\"upload-summary\">{{ getUploadSummary() }}</div>\n </div>\n </div>\n \n <div class=\"header-actions\">\n <button class=\"action-btn minimize-btn\" (click)=\"toggleMinimize()\" [title]=\"isMinimized() ? 'Expand' : 'Minimize'\">\n <cide-ele-icon size=\"xs\">{{ isMinimized() ? 'expand_more' : 'expand_less' }}</cide-ele-icon>\n </button>\n <button class=\"action-btn close-btn\" (click)=\"close()\" title=\"Close\">\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\n </button>\n </div>\n </div>\n\n <!-- Content (hidden when minimized) -->\n @if (!isMinimized()) {\n <div class=\"uploader-content\">\n \n <!-- Overall Progress Bar -->\n @if (isUploading()) {\n <div class=\"overall-progress\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"getOverallProgress()\"></div>\n </div>\n <div class=\"progress-text\">{{ getOverallProgress() }}%</div>\n </div>\n }\n\n <!-- Upload Queue -->\n @if (hasUploads()) {\n <div class=\"upload-queue\">\n @for (upload of uploadQueue(); track upload.fileId) {\n <div class=\"upload-item\" [class]=\"getStatusClass(upload.status)\">\n \n <!-- File Info -->\n <div class=\"file-info\">\n <cide-ele-icon class=\"status-icon\" size=\"xs\">{{ getStatusIcon(upload.status) }}</cide-ele-icon>\n <div class=\"file-details\">\n <div class=\"file-name\">{{ upload.fileName }}</div>\n <div class=\"file-status\">\n @switch (upload.status) {\n @case ('pending') {\n <span class=\"text-yellow-600\">Waiting...</span>\n }\n @case ('uploading') {\n <span class=\"text-blue-600\">Uploading...</span>\n }\n @case ('completed') {\n <span class=\"text-green-600\">Completed</span>\n }\n @case ('error') {\n <span class=\"text-red-600\">{{ upload.error || 'Failed' }}</span>\n }\n @case ('cancelled') {\n <span class=\"text-gray-600\">Cancelled</span>\n }\n }\n </div>\n </div>\n </div>\n\n <!-- Progress Bar (for uploading files) -->\n @if (upload.status === 'uploading') {\n <div class=\"file-progress\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"upload.progress\"></div>\n </div>\n <span class=\"progress-text\">{{ upload.progress }}%</span>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"upload-actions\">\n @switch (upload.status) {\n @case ('pending') {\n <button class=\"action-btn cancel-btn\" (click)=\"onUploadCancelled(upload.fileId)\" title=\"Cancel\">\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\n </button>\n }\n @case ('uploading') {\n <button class=\"action-btn cancel-btn\" (click)=\"onUploadCancelled(upload.fileId)\" title=\"Cancel\">\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\n </button>\n }\n @case ('completed') {\n <button class=\"action-btn success-btn\" title=\"Completed\">\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\n </button>\n }\n @case ('error') {\n <button class=\"action-btn retry-btn\" title=\"Retry\">\n <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\n </button>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Hidden file input for drag & drop -->\n <div class=\"hidden-uploader\">\n <input type=\"file\" multiple style=\"display: none;\" id=\"floating-file-input\">\n </div>\n </div>\n }\n\n <!-- Footer (always visible) -->\n <div class=\"uploader-footer\">\n <div class=\"footer-stats\">\n @if (activeUploads().length > 0) {\n <span class=\"stat uploading\">\n <cide-ele-icon size=\"xs\">cloud_upload</cide-ele-icon>\n {{ activeUploads().length }} uploading\n </span>\n }\n @if (completedUploads().length > 0) {\n <span class=\"stat completed\">\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\n {{ completedUploads().length }} completed\n </span>\n }\n @if (failedUploads().length > 0) {\n <span class=\"stat failed\">\n <cide-ele-icon size=\"xs\">error</cide-ele-icon>\n {{ failedUploads().length }} failed\n </span>\n }\n </div>\n </div>\n</div>\n}\n", styles: [".floating-uploader{position:fixed;bottom:20px;right:20px;width:320px;max-height:500px;background:#fff;border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid rgba(0,0,0,.08);z-index:1000;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1);transform:translateY(0);opacity:1}.floating-uploader.animating{transition:all .3s cubic-bezier(.4,0,.2,1)}.floating-uploader.minimized .uploader-content{display:none}.floating-uploader.minimized .uploader-footer{border-top:none}.floating-uploader.uploading{border-color:#3b82f6;box-shadow:0 8px 32px #3b82f626}.floating-uploader .uploader-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.floating-uploader .uploader-header .header-left{display:flex;align-items:center;gap:8px}.floating-uploader .uploader-header .header-left .upload-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#3b82f6;border-radius:6px;color:#fff}.floating-uploader .uploader-header .header-left .upload-info .upload-title{font-size:14px;font-weight:600;color:#1e293b;margin:0}.floating-uploader .uploader-header .header-left .upload-info .upload-summary{font-size:12px;color:#64748b;margin:0}.floating-uploader .uploader-header .header-actions{display:flex;gap:4px}.floating-uploader .uploader-header .header-actions .action-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:background-color .2s;color:#64748b}.floating-uploader .uploader-header .header-actions .action-btn:hover{background:#e2e8f0;color:#1e293b}.floating-uploader .uploader-header .header-actions .action-btn.close-btn:hover{background:#fef2f2;color:#dc2626}.floating-uploader .uploader-content{max-height:400px;overflow-y:auto}.floating-uploader .uploader-content .overall-progress{padding:12px 16px;border-bottom:1px solid #e2e8f0}.floating-uploader .uploader-content .overall-progress .progress-bar{width:100%;height:4px;background:#e2e8f0;border-radius:2px;overflow:hidden;margin-bottom:4px}.floating-uploader .uploader-content .overall-progress .progress-bar .progress-fill{height:100%;background:#3b82f6;transition:width .3s ease}.floating-uploader .uploader-content .overall-progress .progress-text{font-size:12px;color:#64748b;text-align:center;display:block}.floating-uploader .uploader-content .upload-queue .upload-item{display:flex;align-items:center;padding:8px 16px;border-bottom:1px solid #f1f5f9;transition:background-color .2s}.floating-uploader .uploader-content .upload-queue .upload-item:last-child{border-bottom:none}.floating-uploader .uploader-content .upload-queue .upload-item.status-uploading{background:#f0f9ff}.floating-uploader .uploader-content .upload-queue .upload-item.status-completed{background:#f0fdf4}.floating-uploader .uploader-content .upload-queue .upload-item.status-error{background:#fef2f2}.floating-uploader .uploader-content .upload-queue .upload-item .file-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .status-icon{flex-shrink:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details{min-width:0;flex:1}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-name{font-size:13px;font-weight:500;color:#1e293b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-status{font-size:11px;margin:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-status span{font-weight:500}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress{display:flex;align-items:center;gap:8px;margin:0 8px;min-width:80px}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar{flex:1;height:3px;background:#e2e8f0;border-radius:2px;overflow:hidden}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar .progress-fill{height:100%;background:#3b82f6;transition:width .3s ease}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-text{font-size:10px;color:#64748b;min-width:24px;text-align:right}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions{display:flex;gap:4px}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:all .2s;color:#64748b}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn:hover{background:#e2e8f0}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.cancel-btn:hover{background:#fef2f2;color:#dc2626}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.retry-btn:hover{background:#f0f9ff;color:#3b82f6}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.success-btn{color:#16a34a}.floating-uploader .uploader-content .hidden-uploader{display:none}.floating-uploader .uploader-footer{padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0}.floating-uploader .uploader-footer .footer-stats{display:flex;gap:12px;font-size:11px}.floating-uploader .uploader-footer .footer-stats .stat{display:flex;align-items:center;gap:4px;color:#64748b}.floating-uploader .uploader-footer .footer-stats .stat.uploading{color:#3b82f6}.floating-uploader .uploader-footer .footer-stats .stat.completed{color:#16a34a}.floating-uploader .uploader-footer .footer-stats .stat.failed{color:#dc2626}@media (max-width: 640px){.floating-uploader{bottom:10px;right:10px;left:10px;width:auto;max-width:none}}@media (prefers-color-scheme: dark){.floating-uploader{background:#1e293b;border-color:#334155;box-shadow:0 8px 32px #0000004d}.floating-uploader.uploading{border-color:#3b82f6;box-shadow:0 8px 32px #3b82f633}.floating-uploader .uploader-header{background:#334155;border-bottom-color:#475569}.floating-uploader .uploader-header .header-left .upload-icon{background:#3b82f6}.floating-uploader .uploader-header .header-left .upload-info .upload-title{color:#f1f5f9}.floating-uploader .uploader-header .header-left .upload-info .upload-summary,.floating-uploader .uploader-header .header-actions .action-btn{color:#94a3b8}.floating-uploader .uploader-header .header-actions .action-btn:hover{background:#475569;color:#f1f5f9}.floating-uploader .uploader-header .header-actions .action-btn.close-btn:hover{background:#7f1d1d;color:#fca5a5}.floating-uploader .uploader-content .overall-progress{border-bottom-color:#475569}.floating-uploader .uploader-content .overall-progress .progress-bar{background:#475569}.floating-uploader .uploader-content .overall-progress .progress-bar .progress-fill{background:#3b82f6}.floating-uploader .uploader-content .overall-progress .progress-text{color:#94a3b8}.floating-uploader .uploader-content .upload-queue .upload-item{border-bottom-color:#334155}.floating-uploader .uploader-content .upload-queue .upload-item.status-uploading{background:#1e3a8a}.floating-uploader .uploader-content .upload-queue .upload-item.status-completed{background:#14532d}.floating-uploader .uploader-content .upload-queue .upload-item.status-error{background:#7f1d1d}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-name{color:#f1f5f9}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar{background:#475569}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar .progress-fill{background:#3b82f6}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-text,.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn{color:#94a3b8}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn:hover{background:#475569}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.cancel-btn:hover{background:#7f1d1d;color:#fca5a5}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.retry-btn:hover{background:#1e3a8a;color:#60a5fa}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.success-btn{color:#4ade80}.floating-uploader .uploader-footer{background:#334155;border-top-color:#475569}.floating-uploader .uploader-footer .footer-stats .stat{color:#94a3b8}.floating-uploader .uploader-footer .footer-stats .stat.uploading{color:#60a5fa}.floating-uploader .uploader-footer .footer-stats .stat.completed{color:#4ade80}.floating-uploader .uploader-footer .footer-stats .stat.failed{color:#fca5a5}}@keyframes slideInUp{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes slideOutDown{0%{transform:translateY(0);opacity:1}to{transform:translateY(100%);opacity:0}}.floating-uploader.animating{animation:slideInUp .3s cubic-bezier(.4,0,.2,1)}.floating-uploader.animating.hiding{animation:slideOutDown .3s cubic-bezier(.4,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideIconComponent, selector: "cide-ele-icon", inputs: ["size", "type", "toolTip"] }] });
3713
- }
3714
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingFileUploaderComponent, decorators: [{
3715
- type: Component,
3716
- args: [{ selector: 'cide-layout-floating-file-uploader', standalone: true, imports: [
3717
- CommonModule,
3718
- CideIconComponent
3719
- ], template: "<!-- Floating File Uploader Container -->\n@if (isVisible()) {\n<div class=\"floating-uploader\" \n [class.minimized]=\"isMinimized()\" \n [class.animating]=\"isAnimating()\"\n [class.uploading]=\"isUploading()\">\n\n <!-- Header -->\n <div class=\"uploader-header\">\n <div class=\"header-left\">\n <div class=\"upload-icon\">\n <cide-ele-icon size=\"sm\">cloud_upload</cide-ele-icon>\n </div>\n <div class=\"upload-info\">\n <div class=\"upload-title\">File Upload</div>\n <div class=\"upload-summary\">{{ getUploadSummary() }}</div>\n </div>\n </div>\n \n <div class=\"header-actions\">\n <button class=\"action-btn minimize-btn\" (click)=\"toggleMinimize()\" [title]=\"isMinimized() ? 'Expand' : 'Minimize'\">\n <cide-ele-icon size=\"xs\">{{ isMinimized() ? 'expand_more' : 'expand_less' }}</cide-ele-icon>\n </button>\n <button class=\"action-btn close-btn\" (click)=\"close()\" title=\"Close\">\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\n </button>\n </div>\n </div>\n\n <!-- Content (hidden when minimized) -->\n @if (!isMinimized()) {\n <div class=\"uploader-content\">\n \n <!-- Overall Progress Bar -->\n @if (isUploading()) {\n <div class=\"overall-progress\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"getOverallProgress()\"></div>\n </div>\n <div class=\"progress-text\">{{ getOverallProgress() }}%</div>\n </div>\n }\n\n <!-- Upload Queue -->\n @if (hasUploads()) {\n <div class=\"upload-queue\">\n @for (upload of uploadQueue(); track upload.fileId) {\n <div class=\"upload-item\" [class]=\"getStatusClass(upload.status)\">\n \n <!-- File Info -->\n <div class=\"file-info\">\n <cide-ele-icon class=\"status-icon\" size=\"xs\">{{ getStatusIcon(upload.status) }}</cide-ele-icon>\n <div class=\"file-details\">\n <div class=\"file-name\">{{ upload.fileName }}</div>\n <div class=\"file-status\">\n @switch (upload.status) {\n @case ('pending') {\n <span class=\"text-yellow-600\">Waiting...</span>\n }\n @case ('uploading') {\n <span class=\"text-blue-600\">Uploading...</span>\n }\n @case ('completed') {\n <span class=\"text-green-600\">Completed</span>\n }\n @case ('error') {\n <span class=\"text-red-600\">{{ upload.error || 'Failed' }}</span>\n }\n @case ('cancelled') {\n <span class=\"text-gray-600\">Cancelled</span>\n }\n }\n </div>\n </div>\n </div>\n\n <!-- Progress Bar (for uploading files) -->\n @if (upload.status === 'uploading') {\n <div class=\"file-progress\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width.%]=\"upload.progress\"></div>\n </div>\n <span class=\"progress-text\">{{ upload.progress }}%</span>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"upload-actions\">\n @switch (upload.status) {\n @case ('pending') {\n <button class=\"action-btn cancel-btn\" (click)=\"onUploadCancelled(upload.fileId)\" title=\"Cancel\">\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\n </button>\n }\n @case ('uploading') {\n <button class=\"action-btn cancel-btn\" (click)=\"onUploadCancelled(upload.fileId)\" title=\"Cancel\">\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\n </button>\n }\n @case ('completed') {\n <button class=\"action-btn success-btn\" title=\"Completed\">\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\n </button>\n }\n @case ('error') {\n <button class=\"action-btn retry-btn\" title=\"Retry\">\n <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\n </button>\n }\n }\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Hidden file input for drag & drop -->\n <div class=\"hidden-uploader\">\n <input type=\"file\" multiple style=\"display: none;\" id=\"floating-file-input\">\n </div>\n </div>\n }\n\n <!-- Footer (always visible) -->\n <div class=\"uploader-footer\">\n <div class=\"footer-stats\">\n @if (activeUploads().length > 0) {\n <span class=\"stat uploading\">\n <cide-ele-icon size=\"xs\">cloud_upload</cide-ele-icon>\n {{ activeUploads().length }} uploading\n </span>\n }\n @if (completedUploads().length > 0) {\n <span class=\"stat completed\">\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\n {{ completedUploads().length }} completed\n </span>\n }\n @if (failedUploads().length > 0) {\n <span class=\"stat failed\">\n <cide-ele-icon size=\"xs\">error</cide-ele-icon>\n {{ failedUploads().length }} failed\n </span>\n }\n </div>\n </div>\n</div>\n}\n", styles: [".floating-uploader{position:fixed;bottom:20px;right:20px;width:320px;max-height:500px;background:#fff;border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid rgba(0,0,0,.08);z-index:1000;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1);transform:translateY(0);opacity:1}.floating-uploader.animating{transition:all .3s cubic-bezier(.4,0,.2,1)}.floating-uploader.minimized .uploader-content{display:none}.floating-uploader.minimized .uploader-footer{border-top:none}.floating-uploader.uploading{border-color:#3b82f6;box-shadow:0 8px 32px #3b82f626}.floating-uploader .uploader-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.floating-uploader .uploader-header .header-left{display:flex;align-items:center;gap:8px}.floating-uploader .uploader-header .header-left .upload-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#3b82f6;border-radius:6px;color:#fff}.floating-uploader .uploader-header .header-left .upload-info .upload-title{font-size:14px;font-weight:600;color:#1e293b;margin:0}.floating-uploader .uploader-header .header-left .upload-info .upload-summary{font-size:12px;color:#64748b;margin:0}.floating-uploader .uploader-header .header-actions{display:flex;gap:4px}.floating-uploader .uploader-header .header-actions .action-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:background-color .2s;color:#64748b}.floating-uploader .uploader-header .header-actions .action-btn:hover{background:#e2e8f0;color:#1e293b}.floating-uploader .uploader-header .header-actions .action-btn.close-btn:hover{background:#fef2f2;color:#dc2626}.floating-uploader .uploader-content{max-height:400px;overflow-y:auto}.floating-uploader .uploader-content .overall-progress{padding:12px 16px;border-bottom:1px solid #e2e8f0}.floating-uploader .uploader-content .overall-progress .progress-bar{width:100%;height:4px;background:#e2e8f0;border-radius:2px;overflow:hidden;margin-bottom:4px}.floating-uploader .uploader-content .overall-progress .progress-bar .progress-fill{height:100%;background:#3b82f6;transition:width .3s ease}.floating-uploader .uploader-content .overall-progress .progress-text{font-size:12px;color:#64748b;text-align:center;display:block}.floating-uploader .uploader-content .upload-queue .upload-item{display:flex;align-items:center;padding:8px 16px;border-bottom:1px solid #f1f5f9;transition:background-color .2s}.floating-uploader .uploader-content .upload-queue .upload-item:last-child{border-bottom:none}.floating-uploader .uploader-content .upload-queue .upload-item.status-uploading{background:#f0f9ff}.floating-uploader .uploader-content .upload-queue .upload-item.status-completed{background:#f0fdf4}.floating-uploader .uploader-content .upload-queue .upload-item.status-error{background:#fef2f2}.floating-uploader .uploader-content .upload-queue .upload-item .file-info{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .status-icon{flex-shrink:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details{min-width:0;flex:1}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-name{font-size:13px;font-weight:500;color:#1e293b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-status{font-size:11px;margin:0}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-status span{font-weight:500}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress{display:flex;align-items:center;gap:8px;margin:0 8px;min-width:80px}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar{flex:1;height:3px;background:#e2e8f0;border-radius:2px;overflow:hidden}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar .progress-fill{height:100%;background:#3b82f6;transition:width .3s ease}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-text{font-size:10px;color:#64748b;min-width:24px;text-align:right}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions{display:flex;gap:4px}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;border-radius:4px;cursor:pointer;transition:all .2s;color:#64748b}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn:hover{background:#e2e8f0}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.cancel-btn:hover{background:#fef2f2;color:#dc2626}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.retry-btn:hover{background:#f0f9ff;color:#3b82f6}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.success-btn{color:#16a34a}.floating-uploader .uploader-content .hidden-uploader{display:none}.floating-uploader .uploader-footer{padding:8px 16px;background:#f8fafc;border-top:1px solid #e2e8f0}.floating-uploader .uploader-footer .footer-stats{display:flex;gap:12px;font-size:11px}.floating-uploader .uploader-footer .footer-stats .stat{display:flex;align-items:center;gap:4px;color:#64748b}.floating-uploader .uploader-footer .footer-stats .stat.uploading{color:#3b82f6}.floating-uploader .uploader-footer .footer-stats .stat.completed{color:#16a34a}.floating-uploader .uploader-footer .footer-stats .stat.failed{color:#dc2626}@media (max-width: 640px){.floating-uploader{bottom:10px;right:10px;left:10px;width:auto;max-width:none}}@media (prefers-color-scheme: dark){.floating-uploader{background:#1e293b;border-color:#334155;box-shadow:0 8px 32px #0000004d}.floating-uploader.uploading{border-color:#3b82f6;box-shadow:0 8px 32px #3b82f633}.floating-uploader .uploader-header{background:#334155;border-bottom-color:#475569}.floating-uploader .uploader-header .header-left .upload-icon{background:#3b82f6}.floating-uploader .uploader-header .header-left .upload-info .upload-title{color:#f1f5f9}.floating-uploader .uploader-header .header-left .upload-info .upload-summary,.floating-uploader .uploader-header .header-actions .action-btn{color:#94a3b8}.floating-uploader .uploader-header .header-actions .action-btn:hover{background:#475569;color:#f1f5f9}.floating-uploader .uploader-header .header-actions .action-btn.close-btn:hover{background:#7f1d1d;color:#fca5a5}.floating-uploader .uploader-content .overall-progress{border-bottom-color:#475569}.floating-uploader .uploader-content .overall-progress .progress-bar{background:#475569}.floating-uploader .uploader-content .overall-progress .progress-bar .progress-fill{background:#3b82f6}.floating-uploader .uploader-content .overall-progress .progress-text{color:#94a3b8}.floating-uploader .uploader-content .upload-queue .upload-item{border-bottom-color:#334155}.floating-uploader .uploader-content .upload-queue .upload-item.status-uploading{background:#1e3a8a}.floating-uploader .uploader-content .upload-queue .upload-item.status-completed{background:#14532d}.floating-uploader .uploader-content .upload-queue .upload-item.status-error{background:#7f1d1d}.floating-uploader .uploader-content .upload-queue .upload-item .file-info .file-details .file-name{color:#f1f5f9}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar{background:#475569}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-bar .progress-fill{background:#3b82f6}.floating-uploader .uploader-content .upload-queue .upload-item .file-progress .progress-text,.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn{color:#94a3b8}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn:hover{background:#475569}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.cancel-btn:hover{background:#7f1d1d;color:#fca5a5}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.retry-btn:hover{background:#1e3a8a;color:#60a5fa}.floating-uploader .uploader-content .upload-queue .upload-item .upload-actions .action-btn.success-btn{color:#4ade80}.floating-uploader .uploader-footer{background:#334155;border-top-color:#475569}.floating-uploader .uploader-footer .footer-stats .stat{color:#94a3b8}.floating-uploader .uploader-footer .footer-stats .stat.uploading{color:#60a5fa}.floating-uploader .uploader-footer .footer-stats .stat.completed{color:#4ade80}.floating-uploader .uploader-footer .footer-stats .stat.failed{color:#fca5a5}}@keyframes slideInUp{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes slideOutDown{0%{transform:translateY(0);opacity:1}to{transform:translateY(100%);opacity:0}}.floating-uploader.animating{animation:slideInUp .3s cubic-bezier(.4,0,.2,1)}.floating-uploader.animating.hiding{animation:slideOutDown .3s cubic-bezier(.4,0,.2,1)}\n"] }]
3720
- }], ctorParameters: () => [] });
3721
-
3722
- class CideLytLayoutWithFloatingUploaderComponent {
3723
- destroyRef = inject(DestroyRef);
3724
- floatingUploadService = inject(CideLytFloatingUploadService);
3725
- // Signals for reactive state
3726
- isVisible = signal(false, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
3727
- uploadCount = signal(0, ...(ngDevMode ? [{ debugName: "uploadCount" }] : []));
3728
- // Computed values
3729
- hasUploads = computed(() => this.uploadCount() > 0, ...(ngDevMode ? [{ debugName: "hasUploads" }] : []));
3730
- constructor() {
3731
- console.log('🚀 [LayoutWithFloatingUploader] Component initialized');
3732
- }
3733
- ngOnInit() {
3734
- // Subscribe to floating upload service state
3735
- this.floatingUploadService.isVisible$
3736
- .pipe(takeUntilDestroyed(this.destroyRef))
3737
- .subscribe(visible => {
3738
- this.isVisible.set(visible);
3739
- });
3740
- this.floatingUploadService.uploadQueue$
3741
- .pipe(takeUntilDestroyed(this.destroyRef))
3742
- .subscribe(queue => {
3743
- this.uploadCount.set(queue.length);
3744
- });
3745
- }
3746
- ngOnDestroy() {
3747
- console.log('🧹 [LayoutWithFloatingUploader] Component destroyed');
3748
- }
3749
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytLayoutWithFloatingUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3750
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.1.7", type: CideLytLayoutWithFloatingUploaderComponent, isStandalone: true, selector: "cide-layout-with-floating-uploader", ngImport: i0, template: "<!-- Layout with Floating Uploader -->\r\n<div class=\"layout-container\">\r\n <!-- Main Content Slot -->\r\n <ng-content></ng-content>\r\n \r\n <!-- Floating File Uploader -->\r\n <cide-layout-floating-file-uploader></cide-layout-floating-file-uploader>\r\n</div>\r\n\r\n", styles: [".layout-container{position:relative;width:100%;height:100%;min-height:100vh}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CideLytFloatingFileUploaderComponent, selector: "cide-layout-floating-file-uploader" }] });
3751
- }
3752
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytLayoutWithFloatingUploaderComponent, decorators: [{
3753
- type: Component,
3754
- args: [{ selector: 'cide-layout-with-floating-uploader', standalone: true, imports: [
3755
- CommonModule,
3756
- CideLytFloatingFileUploaderComponent
3757
- ], template: "<!-- Layout with Floating Uploader -->\r\n<div class=\"layout-container\">\r\n <!-- Main Content Slot -->\r\n <ng-content></ng-content>\r\n \r\n <!-- Floating File Uploader -->\r\n <cide-layout-floating-file-uploader></cide-layout-floating-file-uploader>\r\n</div>\r\n\r\n", styles: [".layout-container{position:relative;width:100%;height:100%;min-height:100vh}\n"] }]
3758
- }], ctorParameters: () => [] });
3759
-
3760
- class CideLytFloatingUploadTriggerDirective {
3761
- elementRef = inject(ElementRef);
3762
- floatingUploadService = inject(CideLytFloatingUploadService);
3763
- userId = '';
3764
- constructor() {
3765
- console.log('🎯 [FloatingUploadTrigger] Directive initialized');
3766
- }
3767
- onFileChange(event) {
3768
- const input = event.target;
3769
- const files = input.files;
3770
- if (files && files.length > 0) {
3771
- console.log('📁 [FloatingUploadTrigger] Files selected:', files.length);
3772
- // Set user ID if provided
3773
- if (this.userId) {
3774
- this.floatingUploadService.setCurrentUserId(this.userId);
3775
- }
3776
- // Add files to floating uploader queue
3777
- this.floatingUploadService.addFilesToQueue(Array.from(files));
3778
- // Reset the input to allow selecting the same files again
3779
- input.value = '';
3780
- }
3781
- }
3782
- onDragOver(event) {
3783
- event.preventDefault();
3784
- event.stopPropagation();
3785
- }
3786
- onDragEnter(event) {
3787
- event.preventDefault();
3788
- event.stopPropagation();
3789
- }
3790
- onDrop(event) {
3791
- event.preventDefault();
3792
- event.stopPropagation();
3793
- const files = event.dataTransfer?.files;
3794
- if (files && files.length > 0) {
3795
- console.log('📁 [FloatingUploadTrigger] Files dropped:', files.length);
3796
- // Set user ID if provided
3797
- if (this.userId) {
3798
- this.floatingUploadService.setCurrentUserId(this.userId);
3893
+ async registerEntityRightsSharingComponent() {
3894
+ try {
3895
+ console.log('📦 Importing entity rights sharing component...');
3896
+ const module = await Promise.resolve().then(function () { return floatingEntityRightsSharing_component; });
3897
+ console.log('📦 Module imported:', module);
3898
+ console.log('📦 Component class:', module.CideLytFloatingEntityRightsSharingComponent);
3899
+ if (!module.CideLytFloatingEntityRightsSharingComponent) {
3900
+ throw new Error('Component class not found in module');
3799
3901
  }
3800
- // Add files to floating uploader queue
3801
- this.floatingUploadService.addFilesToQueue(Array.from(files));
3902
+ this.containerService.registerComponent('entity-rights-sharing', module.CideLytFloatingEntityRightsSharingComponent);
3903
+ console.log('✅ Entity rights sharing component registered successfully');
3904
+ console.log('📋 Available components after registration:', this.containerService.getRegisteredComponentIds());
3905
+ }
3906
+ catch (error) {
3907
+ console.error('❌ Failed to register entity rights sharing component:', error);
3908
+ console.error('❌ Error details:', error);
3802
3909
  }
3803
3910
  }
3804
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingUploadTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3805
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.7", type: CideLytFloatingUploadTriggerDirective, isStandalone: true, selector: "[cideFloatingUploadTrigger]", inputs: { userId: "userId" }, host: { listeners: { "change": "onFileChange($event)", "dragover": "onDragOver($event)", "dragenter": "onDragEnter($event)", "drop": "onDrop($event)" } }, ngImport: i0 });
3911
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingEntityRightsSharingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3912
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingEntityRightsSharingService, providedIn: 'root' });
3806
3913
  }
3807
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingUploadTriggerDirective, decorators: [{
3808
- type: Directive,
3914
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingEntityRightsSharingService, decorators: [{
3915
+ type: Injectable,
3809
3916
  args: [{
3810
- selector: '[cideFloatingUploadTrigger]',
3811
- standalone: true
3917
+ providedIn: 'root'
3812
3918
  }]
3813
- }], ctorParameters: () => [], propDecorators: { userId: [{
3814
- type: Input
3815
- }], onFileChange: [{
3816
- type: HostListener,
3817
- args: ['change', ['$event']]
3818
- }], onDragOver: [{
3819
- type: HostListener,
3820
- args: ['dragover', ['$event']]
3821
- }], onDragEnter: [{
3822
- type: HostListener,
3823
- args: ['dragenter', ['$event']]
3824
- }], onDrop: [{
3825
- type: HostListener,
3826
- args: ['drop', ['$event']]
3827
- }] } });
3919
+ }] });
3828
3920
 
3829
3921
  /*
3830
3922
  * Public API Surface of cloud-ide-layout
3831
3923
  */
3924
+ // Floating Container (moved to cloud-ide-element)
3925
+ // export * from './lib/components/floating-container';
3926
+ // Layout Components
3832
3927
 
3833
3928
  /**
3834
3929
  * Generated bundle index. Do not edit.
3835
3930
  */
3836
3931
 
3837
- export { AppStateHelperService as A, CideLytSharedWrapperComponent as C, ENVIRONMENT_CONFIG as E, CideLytSidebarService as a, CideLytRequestService as b, CideLytSidedrawerService as c, CideLytThemeService as d, CloudIdeLayoutService as e, CloudIdeLayoutComponent as f, CideLytSharedService as g, layoutControlPannelChildRoutes as h, CustomRouteReuseStrategy as i, AppStateService as j, CideLytUserStatusService as k, layoutRoutes as l, CacheManagerService as m, CideLytFileManagerService as n, CideLytFloatingFileUploaderComponent as o, processThemeVariable as p, CideLytLayoutWithFloatingUploaderComponent as q, CideLytFloatingUploadService as r, setCSSVariable as s, themeFactory as t, CideLytFloatingUploadTriggerDirective as u };
3838
- //# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-RD9NYgsO.mjs.map
3932
+ export { AppStateHelperService as A, CideLytSharedWrapperComponent as C, ENVIRONMENT_CONFIG as E, CideLytSidebarService as a, CideLytRequestService as b, CideLytSidedrawerService as c, CideLytThemeService as d, CloudIdeLayoutService as e, CloudIdeLayoutComponent as f, CideLytSharedService as g, layoutControlPannelChildRoutes as h, CustomRouteReuseStrategy as i, AppStateService 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 };
3933
+ //# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-o_bwZvM8.mjs.map