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.
- package/fesm2022/{cloud-ide-layout-cloud-ide-layout-RD9NYgsO.mjs → cloud-ide-layout-cloud-ide-layout-o_bwZvM8.mjs} +624 -529
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-o_bwZvM8.mjs.map +1 -0
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-B4u9LnTe.mjs → cloud-ide-layout-drawer-theme.component-CdUqFP29.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-drawer-theme.component-B4u9LnTe.mjs.map → cloud-ide-layout-drawer-theme.component-CdUqFP29.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-DEec7PZk.mjs → cloud-ide-layout-home-wrapper.component-DegRTEPv.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-home-wrapper.component-DEec7PZk.mjs.map → cloud-ide-layout-home-wrapper.component-DegRTEPv.mjs.map} +1 -1
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-GT7A-85i.mjs → cloud-ide-layout-sidedrawer-notes.component-meLfK8As.mjs} +2 -2
- package/fesm2022/{cloud-ide-layout-sidedrawer-notes.component-GT7A-85i.mjs.map → cloud-ide-layout-sidedrawer-notes.component-meLfK8As.mjs.map} +1 -1
- package/fesm2022/cloud-ide-layout.mjs +1 -1
- package/index.d.ts +41 -203
- package/package.json +1 -1
- package/fesm2022/cloud-ide-layout-cloud-ide-layout-RD9NYgsO.mjs.map +0 -1
|
@@ -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,
|
|
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
|
|
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-
|
|
2656
|
-
this.componentMap['drawer_theme'] = () => import('./cloud-ide-layout-drawer-theme.component-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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
|
|
3286
|
-
|
|
3287
|
-
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3299
|
-
|
|
3300
|
-
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
|
|
3304
|
-
|
|
3305
|
-
|
|
3306
|
-
|
|
3307
|
-
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
3314
|
-
|
|
3315
|
-
|
|
3316
|
-
|
|
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
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
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
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3362
|
+
catch (error) {
|
|
3363
|
+
console.error('Error loading entities:', error);
|
|
3364
|
+
}
|
|
3365
|
+
finally {
|
|
3366
|
+
this.entitiesLoading.set(false);
|
|
3454
3367
|
}
|
|
3455
3368
|
}
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
|
|
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
|
-
|
|
3470
|
-
|
|
3380
|
+
catch (err) {
|
|
3381
|
+
console.error('Error loading hierarchy:', err);
|
|
3382
|
+
}
|
|
3383
|
+
finally {
|
|
3384
|
+
this.hierarchyLoading.set(false);
|
|
3471
3385
|
}
|
|
3472
3386
|
}
|
|
3473
|
-
|
|
3474
|
-
|
|
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
|
-
|
|
3564
|
-
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
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
|
-
|
|
3576
|
-
|
|
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
|
-
|
|
3657
|
-
|
|
3658
|
-
|
|
3659
|
-
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
|
|
3663
|
-
|
|
3664
|
-
|
|
3665
|
-
|
|
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
|
-
*
|
|
3848
|
+
* Show entity rights sharing in floating container
|
|
3670
3849
|
*/
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3675
|
-
|
|
3676
|
-
|
|
3677
|
-
|
|
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
|
-
*
|
|
3885
|
+
* Hide entity rights sharing
|
|
3681
3886
|
*/
|
|
3682
|
-
|
|
3683
|
-
|
|
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
|
-
*
|
|
3891
|
+
* Register the entity rights sharing component
|
|
3691
3892
|
*/
|
|
3692
|
-
|
|
3693
|
-
|
|
3694
|
-
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
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
|
-
|
|
3801
|
-
|
|
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:
|
|
3805
|
-
static
|
|
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:
|
|
3808
|
-
type:
|
|
3914
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideLytFloatingEntityRightsSharingService, decorators: [{
|
|
3915
|
+
type: Injectable,
|
|
3809
3916
|
args: [{
|
|
3810
|
-
|
|
3811
|
-
standalone: true
|
|
3917
|
+
providedIn: 'root'
|
|
3812
3918
|
}]
|
|
3813
|
-
}]
|
|
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,
|
|
3838
|
-
//# sourceMappingURL=cloud-ide-layout-cloud-ide-layout-
|
|
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
|