cloud-ide-element 1.0.74 → 1.0.76

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.
@@ -2757,11 +2757,15 @@ class CideEleFileManagerService {
2757
2757
  console.log('✅ [FileManagerService] Upload successful:', event.body);
2758
2758
  // Handle the CoreFileManagerInsertUpdateResponse
2759
2759
  const response = event.body;
2760
+ console.log('🔍 [FileManagerService] Upload response received:', response);
2761
+ console.log('🔍 [FileManagerService] Response success:', response.success);
2762
+ console.log('🔍 [FileManagerService] Response data:', response.data);
2760
2763
  if (response.success) {
2761
2764
  observer.next(response);
2762
2765
  observer.complete();
2763
2766
  }
2764
2767
  else {
2768
+ console.error('❌ [FileManagerService] Upload failed with response:', response);
2765
2769
  observer.error(new Error(response.message || 'Upload failed'));
2766
2770
  }
2767
2771
  }
@@ -3531,7 +3535,7 @@ class CideEleFileInputComponent {
3531
3535
  // Generate group ID BEFORE starting any file uploads
3532
3536
  this.fileManagerService.generateObjectId().subscribe({
3533
3537
  next: (response) => {
3534
- const newGroupId = response.objectId;
3538
+ const newGroupId = response.data?.objectId;
3535
3539
  console.log('🆔 [FileInput] STEP 1 COMPLETE: Generated new group ID:', newGroupId);
3536
3540
  console.log('🔄 [FileInput] STEP 2: Starting file uploads with group ID:', newGroupId);
3537
3541
  this.groupId.set(newGroupId);
@@ -4022,6 +4026,488 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
4022
4026
  type: Output
4023
4027
  }] } });
4024
4028
 
4029
+ class CideEleGlobalFileUploaderComponent {
4030
+ // Dependency injection
4031
+ destroyRef = inject(DestroyRef);
4032
+ fileService = inject(CideEleFileManagerService);
4033
+ // Input properties
4034
+ userId = '';
4035
+ multiple = true;
4036
+ accept = '';
4037
+ maxFileSize = 10; // MB
4038
+ allowedTypes = [];
4039
+ // Output events
4040
+ uploadComplete = new EventEmitter();
4041
+ uploadError = new EventEmitter();
4042
+ uploadCancelled = new EventEmitter();
4043
+ allUploadsComplete = new EventEmitter();
4044
+ // Signals for reactive state management
4045
+ isDragOver = signal(false, ...(ngDevMode ? [{ debugName: "isDragOver" }] : []));
4046
+ isUploading = signal(false, ...(ngDevMode ? [{ debugName: "isUploading" }] : []));
4047
+ uploadQueue = signal([], ...(ngDevMode ? [{ debugName: "uploadQueue" }] : []));
4048
+ currentGroupId = signal(null, ...(ngDevMode ? [{ debugName: "currentGroupId" }] : []));
4049
+ // Computed values
4050
+ hasUploads = computed(() => this.uploadQueue().length > 0, ...(ngDevMode ? [{ debugName: "hasUploads" }] : []));
4051
+ pendingUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'pending'), ...(ngDevMode ? [{ debugName: "pendingUploads" }] : []));
4052
+ activeUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'uploading'), ...(ngDevMode ? [{ debugName: "activeUploads" }] : []));
4053
+ completedUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'completed'), ...(ngDevMode ? [{ debugName: "completedUploads" }] : []));
4054
+ failedUploads = computed(() => this.uploadQueue().filter(upload => upload.status === 'error'), ...(ngDevMode ? [{ debugName: "failedUploads" }] : []));
4055
+ constructor() {
4056
+ console.log('🚀 [GlobalFileUploader] Component initialized');
4057
+ }
4058
+ /**
4059
+ * Handle drag over event
4060
+ */
4061
+ onDragOver(event) {
4062
+ event.preventDefault();
4063
+ event.stopPropagation();
4064
+ this.isDragOver.set(true);
4065
+ }
4066
+ /**
4067
+ * Handle drag leave event
4068
+ */
4069
+ onDragLeave(event) {
4070
+ event.preventDefault();
4071
+ event.stopPropagation();
4072
+ this.isDragOver.set(false);
4073
+ }
4074
+ /**
4075
+ * Handle drop event
4076
+ */
4077
+ onDrop(event) {
4078
+ event.preventDefault();
4079
+ event.stopPropagation();
4080
+ this.isDragOver.set(false);
4081
+ const files = event.dataTransfer?.files;
4082
+ if (files && files.length > 0) {
4083
+ this.addFilesToQueue(Array.from(files));
4084
+ }
4085
+ }
4086
+ /**
4087
+ * Handle file input change
4088
+ */
4089
+ onFileInputChange(event) {
4090
+ const target = event.target;
4091
+ const files = target.files;
4092
+ if (files && files.length > 0) {
4093
+ this.addFilesToQueue(Array.from(files));
4094
+ }
4095
+ // Reset input value to allow selecting the same file again
4096
+ target.value = '';
4097
+ }
4098
+ /**
4099
+ * Add files to upload queue
4100
+ */
4101
+ addFilesToQueue(files) {
4102
+ // Validate files
4103
+ const validFiles = files.filter(file => this.validateFile(file));
4104
+ if (validFiles.length === 0) {
4105
+ console.warn('⚠️ [GlobalFileUploader] No valid files to upload');
4106
+ return;
4107
+ }
4108
+ const newUploads = validFiles.map(file => ({
4109
+ fileId: this.generateFileId(file),
4110
+ fileName: file.name,
4111
+ progress: 0,
4112
+ status: 'pending',
4113
+ file: file
4114
+ }));
4115
+ this.uploadQueue.update(queue => [...queue, ...newUploads]);
4116
+ this.processUploadQueue();
4117
+ }
4118
+ /**
4119
+ * Validate file
4120
+ */
4121
+ validateFile(file) {
4122
+ // Check file size
4123
+ const maxSizeBytes = this.maxFileSize * 1024 * 1024;
4124
+ if (file.size > maxSizeBytes) {
4125
+ console.warn(`⚠️ [GlobalFileUploader] File ${file.name} exceeds size limit`);
4126
+ return false;
4127
+ }
4128
+ // Check file type
4129
+ if (this.allowedTypes.length > 0 && !this.allowedTypes.includes(file.type)) {
4130
+ console.warn(`⚠️ [GlobalFileUploader] File type ${file.type} not allowed`);
4131
+ return false;
4132
+ }
4133
+ return true;
4134
+ }
4135
+ /**
4136
+ * Process upload queue
4137
+ */
4138
+ processUploadQueue() {
4139
+ const pendingUploads = this.uploadQueue().filter(upload => upload.status === 'pending');
4140
+ if (pendingUploads.length > 0 && !this.isUploading()) {
4141
+ this.isUploading.set(true);
4142
+ if (this.multiple && pendingUploads.length > 1) {
4143
+ // Multiple file upload with group ID
4144
+ this.uploadMultipleFiles(pendingUploads);
4145
+ }
4146
+ else {
4147
+ // Single file upload
4148
+ this.uploadNextFile();
4149
+ }
4150
+ }
4151
+ }
4152
+ /**
4153
+ * Upload multiple files with group ID
4154
+ */
4155
+ uploadMultipleFiles(uploads) {
4156
+ console.log('📤 [GlobalFileUploader] Starting multiple file upload for:', uploads.length, 'files');
4157
+ // Generate group ID first
4158
+ this.fileService.generateObjectId()
4159
+ .pipe(takeUntilDestroyed(this.destroyRef))
4160
+ .subscribe({
4161
+ next: (response) => {
4162
+ const groupId = response.data?.objectId;
4163
+ console.log('🆔 [GlobalFileUploader] Generated group ID:', groupId);
4164
+ this.currentGroupId.set(groupId || null);
4165
+ if (groupId) {
4166
+ // Upload all files with the same group ID
4167
+ this.uploadFilesWithGroupId(uploads, groupId);
4168
+ }
4169
+ else {
4170
+ console.error('❌ [GlobalFileUploader] No group ID received');
4171
+ this.handleUploadError('Failed to generate group ID', uploads[0]?.fileId);
4172
+ }
4173
+ },
4174
+ error: (error) => {
4175
+ console.error('❌ [GlobalFileUploader] Failed to generate group ID:', error);
4176
+ this.handleUploadError('Failed to generate group ID', uploads[0]?.fileId);
4177
+ }
4178
+ });
4179
+ }
4180
+ /**
4181
+ * Upload files with group ID
4182
+ */
4183
+ uploadFilesWithGroupId(uploads, groupId) {
4184
+ let completedCount = 0;
4185
+ let failedCount = 0;
4186
+ const totalFiles = uploads.length;
4187
+ const uploadedFiles = [];
4188
+ uploads.forEach((upload, index) => {
4189
+ // Update status to uploading
4190
+ this.updateUploadStatus(upload.fileId, 'uploading', 0);
4191
+ const uploadRequest = {
4192
+ file: upload.file,
4193
+ userId: this.userId,
4194
+ groupId: groupId,
4195
+ tags: [],
4196
+ permissions: ['read', 'write']
4197
+ };
4198
+ this.fileService.uploadFile(upload.file, this.convertToFileUploadOptions(uploadRequest), (progress) => {
4199
+ // Use the original fileId for progress updates during upload
4200
+ this.updateUploadProgress(upload.fileId, progress);
4201
+ })
4202
+ .pipe(takeUntilDestroyed(this.destroyRef))
4203
+ .subscribe({
4204
+ next: (response) => {
4205
+ completedCount++;
4206
+ console.log(`✅ [GlobalFileUploader] File ${index + 1}/${totalFiles} uploaded successfully`);
4207
+ // Find the upload item by cyfm_temp_unique_id from response
4208
+ const responseFile = response?.data?.core_file_manager?.[0];
4209
+ const tempUniqueId = responseFile?.cyfm_temp_unique_id;
4210
+ console.log('🔍 [GlobalFileUploader] Response tempUniqueId:', tempUniqueId);
4211
+ console.log('🔍 [GlobalFileUploader] Original upload fileId:', upload.fileId);
4212
+ // Use the tempUniqueId to find and update the correct upload item
4213
+ if (tempUniqueId) {
4214
+ this.updateUploadStatusByTempId(tempUniqueId, 'completed', 100, undefined, response);
4215
+ }
4216
+ else {
4217
+ // Fallback to original fileId
4218
+ this.updateUploadStatus(upload.fileId, 'completed', 100, undefined, response);
4219
+ }
4220
+ this.uploadComplete.emit({
4221
+ fileId: tempUniqueId || upload.fileId,
4222
+ fileName: upload.fileName,
4223
+ progress: 100,
4224
+ status: 'completed',
4225
+ uploadedFile: response
4226
+ });
4227
+ if (responseFile) {
4228
+ uploadedFiles.push(responseFile);
4229
+ }
4230
+ console.log('🔍 [GlobalFileUploader] Upload response received:', response);
4231
+ console.log('🔍 [GlobalFileUploader] Response data structure:', response?.data);
4232
+ // Check if all files are completed
4233
+ if (completedCount + failedCount === totalFiles) {
4234
+ this.handleMultipleUploadComplete(completedCount, failedCount, groupId, uploadedFiles);
4235
+ }
4236
+ },
4237
+ error: (error) => {
4238
+ failedCount++;
4239
+ console.error(`❌ [GlobalFileUploader] File ${index + 1}/${totalFiles} upload failed:`, error);
4240
+ this.updateUploadStatus(upload.fileId, 'error', 0, error.message || 'Upload failed');
4241
+ this.uploadError.emit({
4242
+ fileId: upload.fileId,
4243
+ error: error.message || 'Upload failed'
4244
+ });
4245
+ // Check if all files are completed
4246
+ if (completedCount + failedCount === totalFiles) {
4247
+ this.handleMultipleUploadComplete(completedCount, failedCount, groupId, uploadedFiles);
4248
+ }
4249
+ }
4250
+ });
4251
+ });
4252
+ }
4253
+ /**
4254
+ * Handle multiple upload completion
4255
+ */
4256
+ handleMultipleUploadComplete(completed, failed, groupId, uploadedFiles) {
4257
+ console.log(`📊 [GlobalFileUploader] Multiple upload complete: ${completed}/${completed + failed} successful`);
4258
+ this.isUploading.set(false);
4259
+ if (completed > 0) {
4260
+ this.allUploadsComplete.emit({
4261
+ groupId: groupId,
4262
+ uploadedFiles: uploadedFiles
4263
+ });
4264
+ }
4265
+ }
4266
+ /**
4267
+ * Upload next file in queue (single file mode)
4268
+ */
4269
+ uploadNextFile() {
4270
+ const pendingUpload = this.uploadQueue().find(upload => upload.status === 'pending');
4271
+ if (!pendingUpload) {
4272
+ this.isUploading.set(false);
4273
+ return;
4274
+ }
4275
+ // Update status to uploading
4276
+ this.updateUploadStatus(pendingUpload.fileId, 'uploading', 0);
4277
+ const uploadRequest = {
4278
+ file: pendingUpload.file,
4279
+ userId: this.userId,
4280
+ tags: [],
4281
+ permissions: ['read', 'write']
4282
+ };
4283
+ this.fileService.uploadFile(pendingUpload.file, this.convertToFileUploadOptions(uploadRequest), (progress) => {
4284
+ this.updateUploadProgress(pendingUpload.fileId, progress);
4285
+ })
4286
+ .pipe(takeUntilDestroyed(this.destroyRef))
4287
+ .subscribe({
4288
+ next: (response) => {
4289
+ console.log('✅ [GlobalFileUploader] Single file upload successful:', response);
4290
+ // Find the upload item by cyfm_temp_unique_id from response
4291
+ const responseFile = response?.data?.core_file_manager?.[0];
4292
+ const tempUniqueId = responseFile?.cyfm_temp_unique_id;
4293
+ console.log('🔍 [GlobalFileUploader] Single upload - Response tempUniqueId:', tempUniqueId);
4294
+ console.log('🔍 [GlobalFileUploader] Single upload - Original upload fileId:', pendingUpload.fileId);
4295
+ // Use the tempUniqueId to find and update the correct upload item
4296
+ if (tempUniqueId) {
4297
+ this.updateUploadStatusByTempId(tempUniqueId, 'completed', 100, undefined, response);
4298
+ }
4299
+ else {
4300
+ // Fallback to original fileId
4301
+ this.updateUploadStatus(pendingUpload.fileId, 'completed', 100, undefined, response);
4302
+ }
4303
+ this.uploadComplete.emit({
4304
+ fileId: tempUniqueId || pendingUpload.fileId,
4305
+ fileName: pendingUpload.fileName,
4306
+ progress: 100,
4307
+ status: 'completed',
4308
+ uploadedFile: response
4309
+ });
4310
+ // Process next file
4311
+ setTimeout(() => this.uploadNextFile(), 500);
4312
+ },
4313
+ error: (error) => {
4314
+ console.error('❌ [GlobalFileUploader] Upload error:', error);
4315
+ this.updateUploadStatus(pendingUpload.fileId, 'error', 0, error.message || 'Upload failed');
4316
+ this.uploadError.emit({
4317
+ fileId: pendingUpload.fileId,
4318
+ error: error.message || 'Upload failed'
4319
+ });
4320
+ // Process next file
4321
+ setTimeout(() => this.uploadNextFile(), 500);
4322
+ }
4323
+ });
4324
+ }
4325
+ /**
4326
+ * Update upload progress
4327
+ */
4328
+ updateUploadProgress(fileId, progress) {
4329
+ this.uploadQueue.update(queue => queue.map(upload => upload.fileId === fileId
4330
+ ? { ...upload, progress }
4331
+ : upload));
4332
+ }
4333
+ /**
4334
+ * Update upload status
4335
+ */
4336
+ updateUploadStatus(fileId, status, progress, error, uploadedFile) {
4337
+ console.log('🔄 [GlobalFileUploader] Updating upload status:', { fileId, status, progress, error: !!error, uploadedFile: !!uploadedFile });
4338
+ this.uploadQueue.update(queue => {
4339
+ const updatedQueue = queue.map(upload => {
4340
+ if (upload.fileId === fileId) {
4341
+ console.log('🔄 [GlobalFileUploader] Found upload to update:', upload.fileName, 'from', upload.status, 'to', status);
4342
+ return { ...upload, status, progress, error, uploadedFile };
4343
+ }
4344
+ return upload;
4345
+ });
4346
+ console.log('🔄 [GlobalFileUploader] Updated queue:', updatedQueue.map(u => ({ fileName: u.fileName, status: u.status })));
4347
+ return updatedQueue;
4348
+ });
4349
+ }
4350
+ /**
4351
+ * Update upload status by cyfm_temp_unique_id
4352
+ */
4353
+ updateUploadStatusByTempId(tempUniqueId, status, progress, error, uploadedFile) {
4354
+ console.log('🔄 [GlobalFileUploader] Updating upload status by tempId:', { tempUniqueId, status, progress, error: !!error, uploadedFile: !!uploadedFile });
4355
+ this.uploadQueue.update(queue => {
4356
+ const updatedQueue = queue.map(upload => {
4357
+ // Check if this upload's fileId matches the tempUniqueId
4358
+ if (upload.fileId === tempUniqueId) {
4359
+ console.log('🔄 [GlobalFileUploader] Found upload by tempId to update:', upload.fileName, 'from', upload.status, 'to', status);
4360
+ return { ...upload, status, progress, error, uploadedFile };
4361
+ }
4362
+ return upload;
4363
+ });
4364
+ console.log('🔄 [GlobalFileUploader] Updated queue by tempId:', updatedQueue.map(u => ({ fileName: u.fileName, status: u.status, fileId: u.fileId })));
4365
+ return updatedQueue;
4366
+ });
4367
+ }
4368
+ /**
4369
+ * Handle upload error
4370
+ */
4371
+ handleUploadError(error, fileId) {
4372
+ if (fileId) {
4373
+ this.updateUploadStatus(fileId, 'error', 0, error);
4374
+ this.uploadError.emit({ fileId, error });
4375
+ }
4376
+ this.isUploading.set(false);
4377
+ }
4378
+ /**
4379
+ * Cancel upload
4380
+ */
4381
+ cancelUpload(fileId) {
4382
+ this.updateUploadStatus(fileId, 'cancelled', 0);
4383
+ this.uploadCancelled.emit(fileId);
4384
+ // Remove from queue after a delay
4385
+ setTimeout(() => {
4386
+ this.uploadQueue.update(queue => queue.filter(upload => upload.fileId !== fileId));
4387
+ }, 1000);
4388
+ }
4389
+ /**
4390
+ * Retry upload
4391
+ */
4392
+ retryUpload(fileId) {
4393
+ this.updateUploadStatus(fileId, 'pending', 0);
4394
+ this.processUploadQueue();
4395
+ }
4396
+ /**
4397
+ * Remove upload from queue
4398
+ */
4399
+ removeUpload(fileId) {
4400
+ this.uploadQueue.update(queue => queue.filter(upload => upload.fileId !== fileId));
4401
+ }
4402
+ /**
4403
+ * Clear completed uploads
4404
+ */
4405
+ clearCompleted() {
4406
+ this.uploadQueue.update(queue => queue.filter(upload => upload.status !== 'completed'));
4407
+ }
4408
+ /**
4409
+ * Clear all uploads
4410
+ */
4411
+ clearAll() {
4412
+ this.uploadQueue.set([]);
4413
+ this.currentGroupId.set(null);
4414
+ }
4415
+ /**
4416
+ * Get status icon
4417
+ */
4418
+ getStatusIcon(status) {
4419
+ switch (status) {
4420
+ case 'pending': return 'schedule';
4421
+ case 'uploading': return 'cloud_upload';
4422
+ case 'completed': return 'check_circle';
4423
+ case 'error': return 'error';
4424
+ case 'cancelled': return 'cancel';
4425
+ default: return 'help';
4426
+ }
4427
+ }
4428
+ /**
4429
+ * Get status class
4430
+ */
4431
+ getStatusClass(status) {
4432
+ switch (status) {
4433
+ case 'pending': return 'status-pending';
4434
+ case 'uploading': return 'status-uploading';
4435
+ case 'completed': return 'status-completed';
4436
+ case 'error': return 'status-error';
4437
+ case 'cancelled': return 'status-cancelled';
4438
+ default: return 'status-unknown';
4439
+ }
4440
+ }
4441
+ /**
4442
+ * Get file size display
4443
+ */
4444
+ getFileSizeDisplay(file) {
4445
+ const bytes = file.size;
4446
+ if (bytes === 0)
4447
+ return '0 Bytes';
4448
+ const k = 1024;
4449
+ const sizes = ['Bytes', 'KB', 'MB', 'GB'];
4450
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
4451
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
4452
+ }
4453
+ /**
4454
+ * Generate unique file ID - this should match the service's generateFileId method
4455
+ * The service uses: ${file.name}_${file.size}_${Date.now()}
4456
+ */
4457
+ generateFileId(file) {
4458
+ return `${file.name}_${file.size}_${Date.now()}`;
4459
+ }
4460
+ /**
4461
+ * Convert IFileUploadRequest to FileUploadOptions
4462
+ */
4463
+ convertToFileUploadOptions(request) {
4464
+ return {
4465
+ altText: request.altText,
4466
+ userId: request.userId,
4467
+ permissions: request.permissions,
4468
+ tags: request.tags,
4469
+ groupId: request.groupId
4470
+ };
4471
+ }
4472
+ /**
4473
+ * Trigger file input click
4474
+ */
4475
+ triggerFileInput() {
4476
+ const fileInput = document.getElementById('global-file-input');
4477
+ if (fileInput) {
4478
+ fileInput.click();
4479
+ }
4480
+ }
4481
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideEleGlobalFileUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4482
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.7", type: CideEleGlobalFileUploaderComponent, isStandalone: true, selector: "cide-ele-global-file-uploader", inputs: { userId: "userId", multiple: "multiple", accept: "accept", maxFileSize: "maxFileSize", allowedTypes: "allowedTypes" }, outputs: { uploadComplete: "uploadComplete", uploadError: "uploadError", uploadCancelled: "uploadCancelled", allUploadsComplete: "allUploadsComplete" }, ngImport: i0, template: "<!-- Global File Uploader Component -->\r\n<div class=\"global-file-uploader\">\r\n\r\n <!-- Hidden file input -->\r\n <input id=\"global-file-input\" type=\"file\" [multiple]=\"multiple\" [accept]=\"accept\" \r\n (change)=\"onFileInputChange($event)\" style=\"display: none;\">\r\n\r\n <!-- Drag and Drop Zone -->\r\n <div class=\"upload-zone\" [class.drag-over]=\"isDragOver()\" (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\" (drop)=\"onDrop($event)\" (click)=\"triggerFileInput()\">\r\n\r\n <div class=\"upload-zone-content\">\r\n <cide-ele-icon name=\"cloud_upload\" class=\"upload-icon\" size=\"lg\">\r\n </cide-ele-icon>\r\n\r\n <h3 class=\"upload-title\">\r\n {{ isDragOver() ? 'Drop files here' : 'Upload Files' }}\r\n </h3>\r\n\r\n <p class=\"upload-subtitle\">\r\n {{ isDragOver() ? 'Release to upload' : 'Drag and drop files here or click to browse' }}\r\n </p>\r\n\r\n <button cideEleButton cideEleButton variant=\"outline\" size=\"sm\"\r\n (click)=\"triggerFileInput(); $event.stopPropagation()\">\r\n <cide-ele-icon name=\"add\" size=\"sm\"></cide-ele-icon>\r\n Choose Files\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Upload Queue -->\r\n @if (hasUploads()) {\r\n <div class=\"upload-queue\">\r\n <div class=\"queue-header\">\r\n <h4 class=\"queue-title\">Upload Queue</h4>\r\n <div class=\"queue-actions\">\r\n @if (completedUploads().length > 0) {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"clearCompleted()\">\r\n Clear Completed\r\n </button>\r\n }\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"clearAll()\">\r\n Clear All\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"queue-items\">\r\n @for (upload of uploadQueue(); track upload.fileId) {\r\n <div class=\"upload-item\" [class]=\"getStatusClass(upload.status)\">\r\n\r\n <!-- File Info -->\r\n <div class=\"file-info\">\r\n <cide-ele-icon class=\"status-icon\" size=\"sm\">\r\n {{getStatusIcon(upload.status)}}\r\n </cide-ele-icon>\r\n\r\n <div class=\"file-details\">\r\n <div class=\"file-name\">{{ upload.fileName }}</div>\r\n @if (upload.file) {\r\n <div class=\"file-size\">{{ getFileSizeDisplay(upload.file) }}</div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Progress Bar -->\r\n @if (upload.status === 'uploading') {\r\n <div class=\"progress-container\">\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"upload.progress\">\r\n </div>\r\n </div>\r\n <span class=\"progress-text\">{{ upload.progress }}%</span>\r\n </div>\r\n }\r\n\r\n <!-- Status Text -->\r\n @if (upload.status !== 'uploading') {\r\n <div class=\"status-text\">\r\n @switch (upload.status) {\r\n @case ('pending') {\r\n <span class=\"text-yellow-600\">Waiting...</span>\r\n }\r\n @case ('completed') {\r\n <span class=\"text-green-600\">Uploaded successfully</span>\r\n }\r\n @case ('error') {\r\n <span class=\"text-red-600\">{{ upload.error || 'Upload failed' }}</span>\r\n }\r\n @case ('cancelled') {\r\n <span class=\"text-gray-600\">Cancelled</span>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Actions -->\r\n <div class=\"upload-actions\">\r\n @switch (upload.status) {\r\n @case ('pending') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"cancelUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"cancel\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n @case ('uploading') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"cancelUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"cancel\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n @case ('completed') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"removeUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"close\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n @case ('error') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"retryUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"refresh\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"removeUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"close\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n @case ('cancelled') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"removeUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"close\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Queue Summary -->\r\n <div class=\"queue-summary\">\r\n <div class=\"summary-stats\">\r\n <span class=\"stat\">\r\n <cide-ele-icon name=\"schedule\" size=\"xs\"></cide-ele-icon>\r\n {{ pendingUploads().length }} pending\r\n </span>\r\n <span class=\"stat\">\r\n <cide-ele-icon name=\"cloud_upload\" size=\"xs\"></cide-ele-icon>\r\n {{ activeUploads().length }} uploading\r\n </span>\r\n <span class=\"stat\">\r\n <cide-ele-icon name=\"check_circle\" size=\"xs\"></cide-ele-icon>\r\n {{ completedUploads().length }} completed\r\n </span>\r\n @if (failedUploads().length > 0) {\r\n <span class=\"stat error\">\r\n <cide-ele-icon name=\"error\" size=\"xs\"></cide-ele-icon>\r\n {{ failedUploads().length }} failed\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n\r\n", styles: [".global-file-uploader{@apply tw-w-full tw-max-w-2xl tw-mx-auto tw-p-4;}.global-file-uploader .upload-zone{@apply tw-border-2 tw-border-dashed tw-border-gray-300 tw-rounded-lg tw-p-8 tw-text-center tw-cursor-pointer tw-transition-all tw-duration-200 tw-ease-in-out;@apply hover:tw-border-blue-400 hover:tw-bg-blue-50;}.global-file-uploader .upload-zone.drag-over{@apply tw-border-blue-500 tw-bg-blue-100 tw-scale-105;}.global-file-uploader .upload-zone .upload-zone-content{@apply tw-space-y-4;}.global-file-uploader .upload-zone .upload-zone-content .upload-icon{@apply tw-text-gray-400 tw-mx-auto;}.global-file-uploader .upload-zone .upload-zone-content .upload-title{@apply tw-text-xl tw-font-semibold tw-text-gray-700 tw-m-0;}.global-file-uploader .upload-zone .upload-zone-content .upload-subtitle{@apply tw-text-sm tw-text-gray-500 tw-m-0;}.global-file-uploader .upload-queue{@apply tw-mt-6 tw-bg-white tw-border tw-border-gray-200 tw-rounded-lg tw-shadow-sm;}.global-file-uploader .upload-queue .queue-header{@apply tw-flex tw-justify-between tw-items-center tw-p-4 tw-border-b tw-border-gray-200;}.global-file-uploader .upload-queue .queue-header .queue-title{@apply tw-text-lg tw-font-medium tw-text-gray-700 tw-m-0;}.global-file-uploader .upload-queue .queue-header .queue-actions{@apply tw-flex tw-space-x-2;}.global-file-uploader .upload-queue .queue-items{@apply tw-max-h-96 tw-overflow-y-auto;}.global-file-uploader .upload-queue .queue-items .upload-item{@apply tw-flex tw-items-center tw-justify-between tw-p-4 tw-border-b tw-border-gray-100 tw-transition-colors tw-duration-200;}.global-file-uploader .upload-queue .queue-items .upload-item:last-child{@apply tw-border-b-0;}.global-file-uploader .upload-queue .queue-items .upload-item.status-pending{@apply tw-bg-yellow-50;}.global-file-uploader .upload-queue .queue-items .upload-item.status-uploading{@apply tw-bg-blue-50;}.global-file-uploader .upload-queue .queue-items .upload-item.status-completed{@apply tw-bg-green-50;}.global-file-uploader .upload-queue .queue-items .upload-item.status-error{@apply tw-bg-red-50;}.global-file-uploader .upload-queue .queue-items .upload-item.status-cancelled{@apply tw-bg-gray-50;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info{@apply tw-flex tw-items-center tw-flex-1 tw-min-w-0;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .status-icon{@apply tw-mr-3 tw-flex-shrink-0;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details{@apply tw-min-w-0 tw-flex-1;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details .file-name{@apply tw-text-sm tw-font-medium tw-text-gray-700 tw-truncate;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details .file-size{@apply tw-text-xs tw-text-gray-500 tw-mt-1;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container{@apply tw-flex tw-items-center tw-space-x-3 tw-flex-1 tw-max-w-xs tw-mx-4;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-bar{@apply tw-flex-1 tw-h-2 tw-bg-gray-200 tw-rounded-full tw-overflow-hidden;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-bar .progress-fill{@apply tw-h-full tw-bg-blue-500 tw-transition-all tw-duration-300 tw-ease-out;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-text{@apply tw-text-xs tw-font-medium tw-text-gray-600 tw-min-w-12 tw-text-right;}.global-file-uploader .upload-queue .queue-items .upload-item .status-text{@apply tw-flex-1 tw-text-sm tw-text-center;}.global-file-uploader .upload-queue .queue-items .upload-item .status-text span{@apply tw-font-medium;}.global-file-uploader .upload-queue .queue-items .upload-item .upload-actions{@apply tw-flex tw-space-x-1 tw-ml-4;}.global-file-uploader .upload-queue .queue-summary{@apply tw-p-4 tw-bg-gray-50 tw-border-t tw-border-gray-200;}.global-file-uploader .upload-queue .queue-summary .summary-stats{@apply tw-flex tw-flex-wrap tw-gap-4 tw-text-sm tw-text-gray-600;}.global-file-uploader .upload-queue .queue-summary .summary-stats .stat{@apply tw-flex tw-items-center tw-space-x-1;}.global-file-uploader .upload-queue .queue-summary .summary-stats .stat.error{@apply tw-text-red-600;}@media (max-width: 640px){.global-file-uploader{@apply tw-p-2;}.global-file-uploader .upload-zone{@apply tw-p-6;}.global-file-uploader .upload-zone .upload-zone-content .upload-title{@apply tw-text-lg;}.global-file-uploader .upload-zone .upload-zone-content .upload-subtitle{@apply tw-text-xs;}.global-file-uploader .upload-queue .queue-header{@apply tw-p-3 tw-flex-col tw-space-y-2 tw-items-start;}.global-file-uploader .upload-queue .queue-header .queue-actions{@apply tw-w-full tw-justify-end;}.global-file-uploader .upload-queue .queue-items .upload-item{@apply tw-p-3 tw-flex-col tw-space-y-3 tw-items-start;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info{@apply tw-w-full;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container{@apply tw-w-full tw-mx-0;}.global-file-uploader .upload-queue .queue-items .upload-item .status-text{@apply tw-w-full tw-text-left;}.global-file-uploader .upload-queue .queue-items .upload-item .upload-actions{@apply tw-w-full tw-justify-end tw-ml-0;}}@media (prefers-color-scheme: dark){.global-file-uploader .upload-zone{@apply tw-border-gray-600 hover:tw-border-blue-400 hover:tw-bg-gray-800;}.global-file-uploader .upload-zone.drag-over{@apply tw-bg-blue-900;}.global-file-uploader .upload-zone .upload-zone-content .upload-icon{@apply tw-text-gray-500;}.global-file-uploader .upload-zone .upload-zone-content .upload-title{@apply tw-text-gray-200;}.global-file-uploader .upload-zone .upload-zone-content .upload-subtitle{@apply tw-text-gray-400;}.global-file-uploader .upload-queue{@apply tw-bg-gray-800 tw-border-gray-700;}.global-file-uploader .upload-queue .queue-header{@apply tw-border-gray-700;}.global-file-uploader .upload-queue .queue-header .queue-title{@apply tw-text-gray-200;}.global-file-uploader .upload-queue .queue-items .upload-item{@apply tw-border-gray-700;}.global-file-uploader .upload-queue .queue-items .upload-item.status-pending{@apply tw-bg-yellow-900;}.global-file-uploader .upload-queue .queue-items .upload-item.status-uploading{@apply tw-bg-blue-900;}.global-file-uploader .upload-queue .queue-items .upload-item.status-completed{@apply tw-bg-green-900;}.global-file-uploader .upload-queue .queue-items .upload-item.status-error{@apply tw-bg-red-900;}.global-file-uploader .upload-queue .queue-items .upload-item.status-cancelled{@apply tw-bg-gray-700;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details .file-name{@apply tw-text-gray-200;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details .file-size{@apply tw-text-gray-400;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-bar{@apply tw-bg-gray-600;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-text{@apply tw-text-gray-300;}.global-file-uploader .upload-queue .queue-summary{@apply tw-bg-gray-700 tw-border-gray-600;}.global-file-uploader .upload-queue .queue-summary .summary-stats{@apply tw-text-gray-300;}.global-file-uploader .upload-queue .queue-summary .summary-stats .stat.error{@apply tw-text-red-400;}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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"] }] });
4483
+ }
4484
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideEleGlobalFileUploaderComponent, decorators: [{
4485
+ type: Component,
4486
+ args: [{ selector: 'cide-ele-global-file-uploader', standalone: true, imports: [
4487
+ CommonModule,
4488
+ CideEleButtonComponent,
4489
+ CideIconComponent
4490
+ ], template: "<!-- Global File Uploader Component -->\r\n<div class=\"global-file-uploader\">\r\n\r\n <!-- Hidden file input -->\r\n <input id=\"global-file-input\" type=\"file\" [multiple]=\"multiple\" [accept]=\"accept\" \r\n (change)=\"onFileInputChange($event)\" style=\"display: none;\">\r\n\r\n <!-- Drag and Drop Zone -->\r\n <div class=\"upload-zone\" [class.drag-over]=\"isDragOver()\" (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\" (drop)=\"onDrop($event)\" (click)=\"triggerFileInput()\">\r\n\r\n <div class=\"upload-zone-content\">\r\n <cide-ele-icon name=\"cloud_upload\" class=\"upload-icon\" size=\"lg\">\r\n </cide-ele-icon>\r\n\r\n <h3 class=\"upload-title\">\r\n {{ isDragOver() ? 'Drop files here' : 'Upload Files' }}\r\n </h3>\r\n\r\n <p class=\"upload-subtitle\">\r\n {{ isDragOver() ? 'Release to upload' : 'Drag and drop files here or click to browse' }}\r\n </p>\r\n\r\n <button cideEleButton cideEleButton variant=\"outline\" size=\"sm\"\r\n (click)=\"triggerFileInput(); $event.stopPropagation()\">\r\n <cide-ele-icon name=\"add\" size=\"sm\"></cide-ele-icon>\r\n Choose Files\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Upload Queue -->\r\n @if (hasUploads()) {\r\n <div class=\"upload-queue\">\r\n <div class=\"queue-header\">\r\n <h4 class=\"queue-title\">Upload Queue</h4>\r\n <div class=\"queue-actions\">\r\n @if (completedUploads().length > 0) {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"clearCompleted()\">\r\n Clear Completed\r\n </button>\r\n }\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"clearAll()\">\r\n Clear All\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"queue-items\">\r\n @for (upload of uploadQueue(); track upload.fileId) {\r\n <div class=\"upload-item\" [class]=\"getStatusClass(upload.status)\">\r\n\r\n <!-- File Info -->\r\n <div class=\"file-info\">\r\n <cide-ele-icon class=\"status-icon\" size=\"sm\">\r\n {{getStatusIcon(upload.status)}}\r\n </cide-ele-icon>\r\n\r\n <div class=\"file-details\">\r\n <div class=\"file-name\">{{ upload.fileName }}</div>\r\n @if (upload.file) {\r\n <div class=\"file-size\">{{ getFileSizeDisplay(upload.file) }}</div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Progress Bar -->\r\n @if (upload.status === 'uploading') {\r\n <div class=\"progress-container\">\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width.%]=\"upload.progress\">\r\n </div>\r\n </div>\r\n <span class=\"progress-text\">{{ upload.progress }}%</span>\r\n </div>\r\n }\r\n\r\n <!-- Status Text -->\r\n @if (upload.status !== 'uploading') {\r\n <div class=\"status-text\">\r\n @switch (upload.status) {\r\n @case ('pending') {\r\n <span class=\"text-yellow-600\">Waiting...</span>\r\n }\r\n @case ('completed') {\r\n <span class=\"text-green-600\">Uploaded successfully</span>\r\n }\r\n @case ('error') {\r\n <span class=\"text-red-600\">{{ upload.error || 'Upload failed' }}</span>\r\n }\r\n @case ('cancelled') {\r\n <span class=\"text-gray-600\">Cancelled</span>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Actions -->\r\n <div class=\"upload-actions\">\r\n @switch (upload.status) {\r\n @case ('pending') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"cancelUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"cancel\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n @case ('uploading') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"cancelUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"cancel\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n @case ('completed') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"removeUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"close\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n @case ('error') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"retryUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"refresh\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"removeUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"close\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n @case ('cancelled') {\r\n <button cideEleButton variant=\"text\" size=\"sm\" (click)=\"removeUpload(upload.fileId)\">\r\n <cide-ele-icon name=\"close\" size=\"xs\"></cide-ele-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Queue Summary -->\r\n <div class=\"queue-summary\">\r\n <div class=\"summary-stats\">\r\n <span class=\"stat\">\r\n <cide-ele-icon name=\"schedule\" size=\"xs\"></cide-ele-icon>\r\n {{ pendingUploads().length }} pending\r\n </span>\r\n <span class=\"stat\">\r\n <cide-ele-icon name=\"cloud_upload\" size=\"xs\"></cide-ele-icon>\r\n {{ activeUploads().length }} uploading\r\n </span>\r\n <span class=\"stat\">\r\n <cide-ele-icon name=\"check_circle\" size=\"xs\"></cide-ele-icon>\r\n {{ completedUploads().length }} completed\r\n </span>\r\n @if (failedUploads().length > 0) {\r\n <span class=\"stat error\">\r\n <cide-ele-icon name=\"error\" size=\"xs\"></cide-ele-icon>\r\n {{ failedUploads().length }} failed\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n\r\n", styles: [".global-file-uploader{@apply tw-w-full tw-max-w-2xl tw-mx-auto tw-p-4;}.global-file-uploader .upload-zone{@apply tw-border-2 tw-border-dashed tw-border-gray-300 tw-rounded-lg tw-p-8 tw-text-center tw-cursor-pointer tw-transition-all tw-duration-200 tw-ease-in-out;@apply hover:tw-border-blue-400 hover:tw-bg-blue-50;}.global-file-uploader .upload-zone.drag-over{@apply tw-border-blue-500 tw-bg-blue-100 tw-scale-105;}.global-file-uploader .upload-zone .upload-zone-content{@apply tw-space-y-4;}.global-file-uploader .upload-zone .upload-zone-content .upload-icon{@apply tw-text-gray-400 tw-mx-auto;}.global-file-uploader .upload-zone .upload-zone-content .upload-title{@apply tw-text-xl tw-font-semibold tw-text-gray-700 tw-m-0;}.global-file-uploader .upload-zone .upload-zone-content .upload-subtitle{@apply tw-text-sm tw-text-gray-500 tw-m-0;}.global-file-uploader .upload-queue{@apply tw-mt-6 tw-bg-white tw-border tw-border-gray-200 tw-rounded-lg tw-shadow-sm;}.global-file-uploader .upload-queue .queue-header{@apply tw-flex tw-justify-between tw-items-center tw-p-4 tw-border-b tw-border-gray-200;}.global-file-uploader .upload-queue .queue-header .queue-title{@apply tw-text-lg tw-font-medium tw-text-gray-700 tw-m-0;}.global-file-uploader .upload-queue .queue-header .queue-actions{@apply tw-flex tw-space-x-2;}.global-file-uploader .upload-queue .queue-items{@apply tw-max-h-96 tw-overflow-y-auto;}.global-file-uploader .upload-queue .queue-items .upload-item{@apply tw-flex tw-items-center tw-justify-between tw-p-4 tw-border-b tw-border-gray-100 tw-transition-colors tw-duration-200;}.global-file-uploader .upload-queue .queue-items .upload-item:last-child{@apply tw-border-b-0;}.global-file-uploader .upload-queue .queue-items .upload-item.status-pending{@apply tw-bg-yellow-50;}.global-file-uploader .upload-queue .queue-items .upload-item.status-uploading{@apply tw-bg-blue-50;}.global-file-uploader .upload-queue .queue-items .upload-item.status-completed{@apply tw-bg-green-50;}.global-file-uploader .upload-queue .queue-items .upload-item.status-error{@apply tw-bg-red-50;}.global-file-uploader .upload-queue .queue-items .upload-item.status-cancelled{@apply tw-bg-gray-50;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info{@apply tw-flex tw-items-center tw-flex-1 tw-min-w-0;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .status-icon{@apply tw-mr-3 tw-flex-shrink-0;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details{@apply tw-min-w-0 tw-flex-1;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details .file-name{@apply tw-text-sm tw-font-medium tw-text-gray-700 tw-truncate;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details .file-size{@apply tw-text-xs tw-text-gray-500 tw-mt-1;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container{@apply tw-flex tw-items-center tw-space-x-3 tw-flex-1 tw-max-w-xs tw-mx-4;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-bar{@apply tw-flex-1 tw-h-2 tw-bg-gray-200 tw-rounded-full tw-overflow-hidden;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-bar .progress-fill{@apply tw-h-full tw-bg-blue-500 tw-transition-all tw-duration-300 tw-ease-out;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-text{@apply tw-text-xs tw-font-medium tw-text-gray-600 tw-min-w-12 tw-text-right;}.global-file-uploader .upload-queue .queue-items .upload-item .status-text{@apply tw-flex-1 tw-text-sm tw-text-center;}.global-file-uploader .upload-queue .queue-items .upload-item .status-text span{@apply tw-font-medium;}.global-file-uploader .upload-queue .queue-items .upload-item .upload-actions{@apply tw-flex tw-space-x-1 tw-ml-4;}.global-file-uploader .upload-queue .queue-summary{@apply tw-p-4 tw-bg-gray-50 tw-border-t tw-border-gray-200;}.global-file-uploader .upload-queue .queue-summary .summary-stats{@apply tw-flex tw-flex-wrap tw-gap-4 tw-text-sm tw-text-gray-600;}.global-file-uploader .upload-queue .queue-summary .summary-stats .stat{@apply tw-flex tw-items-center tw-space-x-1;}.global-file-uploader .upload-queue .queue-summary .summary-stats .stat.error{@apply tw-text-red-600;}@media (max-width: 640px){.global-file-uploader{@apply tw-p-2;}.global-file-uploader .upload-zone{@apply tw-p-6;}.global-file-uploader .upload-zone .upload-zone-content .upload-title{@apply tw-text-lg;}.global-file-uploader .upload-zone .upload-zone-content .upload-subtitle{@apply tw-text-xs;}.global-file-uploader .upload-queue .queue-header{@apply tw-p-3 tw-flex-col tw-space-y-2 tw-items-start;}.global-file-uploader .upload-queue .queue-header .queue-actions{@apply tw-w-full tw-justify-end;}.global-file-uploader .upload-queue .queue-items .upload-item{@apply tw-p-3 tw-flex-col tw-space-y-3 tw-items-start;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info{@apply tw-w-full;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container{@apply tw-w-full tw-mx-0;}.global-file-uploader .upload-queue .queue-items .upload-item .status-text{@apply tw-w-full tw-text-left;}.global-file-uploader .upload-queue .queue-items .upload-item .upload-actions{@apply tw-w-full tw-justify-end tw-ml-0;}}@media (prefers-color-scheme: dark){.global-file-uploader .upload-zone{@apply tw-border-gray-600 hover:tw-border-blue-400 hover:tw-bg-gray-800;}.global-file-uploader .upload-zone.drag-over{@apply tw-bg-blue-900;}.global-file-uploader .upload-zone .upload-zone-content .upload-icon{@apply tw-text-gray-500;}.global-file-uploader .upload-zone .upload-zone-content .upload-title{@apply tw-text-gray-200;}.global-file-uploader .upload-zone .upload-zone-content .upload-subtitle{@apply tw-text-gray-400;}.global-file-uploader .upload-queue{@apply tw-bg-gray-800 tw-border-gray-700;}.global-file-uploader .upload-queue .queue-header{@apply tw-border-gray-700;}.global-file-uploader .upload-queue .queue-header .queue-title{@apply tw-text-gray-200;}.global-file-uploader .upload-queue .queue-items .upload-item{@apply tw-border-gray-700;}.global-file-uploader .upload-queue .queue-items .upload-item.status-pending{@apply tw-bg-yellow-900;}.global-file-uploader .upload-queue .queue-items .upload-item.status-uploading{@apply tw-bg-blue-900;}.global-file-uploader .upload-queue .queue-items .upload-item.status-completed{@apply tw-bg-green-900;}.global-file-uploader .upload-queue .queue-items .upload-item.status-error{@apply tw-bg-red-900;}.global-file-uploader .upload-queue .queue-items .upload-item.status-cancelled{@apply tw-bg-gray-700;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details .file-name{@apply tw-text-gray-200;}.global-file-uploader .upload-queue .queue-items .upload-item .file-info .file-details .file-size{@apply tw-text-gray-400;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-bar{@apply tw-bg-gray-600;}.global-file-uploader .upload-queue .queue-items .upload-item .progress-container .progress-text{@apply tw-text-gray-300;}.global-file-uploader .upload-queue .queue-summary{@apply tw-bg-gray-700 tw-border-gray-600;}.global-file-uploader .upload-queue .queue-summary .summary-stats{@apply tw-text-gray-300;}.global-file-uploader .upload-queue .queue-summary .summary-stats .stat.error{@apply tw-text-red-400;}}\n"] }]
4491
+ }], ctorParameters: () => [], propDecorators: { userId: [{
4492
+ type: Input
4493
+ }], multiple: [{
4494
+ type: Input
4495
+ }], accept: [{
4496
+ type: Input
4497
+ }], maxFileSize: [{
4498
+ type: Input
4499
+ }], allowedTypes: [{
4500
+ type: Input
4501
+ }], uploadComplete: [{
4502
+ type: Output
4503
+ }], uploadError: [{
4504
+ type: Output
4505
+ }], uploadCancelled: [{
4506
+ type: Output
4507
+ }], allUploadsComplete: [{
4508
+ type: Output
4509
+ }] } });
4510
+
4025
4511
  class CideTextareaComponent {
4026
4512
  label = '';
4027
4513
  labelHide = false;
@@ -7189,7 +7675,7 @@ class CideCoreFileManagerService {
7189
7675
  formData.append('altText', request.altText || '');
7190
7676
  formData.append('tags', JSON.stringify(request.tags || []));
7191
7677
  formData.append('permissions', JSON.stringify(request.permissions || []));
7192
- formData.append('userId', request.userId);
7678
+ formData.append('userId', request.userId || '');
7193
7679
  const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'upload']);
7194
7680
  const req = new HttpRequest('POST', url, formData, {
7195
7681
  reportProgress: true
@@ -8260,5 +8746,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
8260
8746
  * Generated bundle index. Do not edit.
8261
8747
  */
8262
8748
 
8263
- export { CideCoreFileManagerService, CideEleButtonComponent, CideEleConfirmationModalComponent, CideEleDataGridComponent, CideEleDropdownComponent, CideEleFileImageDirective, CideEleFileInputComponent, CideEleFileManagerService, CideEleGlobalNotificationsComponent, CideEleJsonEditorComponent, CideEleResizerDirective, CideEleSkeletonLoaderComponent, CideEleTabComponent, CideEleToastNotificationComponent, CideElementsService, CideIconComponent, CideInputComponent, CideSelectComponent, CideSelectOptionComponent, CideSpinnerComponent, CideTextareaComponent, ConfirmationService, CoreFileManagerInsertUpdatePayload, DEFAULT_GRID_CONFIG, DropdownManagerService, ICoreCyfmSave, MFileManager, NotificationService, TooltipDirective };
8749
+ export { CideCoreFileManagerService, CideEleButtonComponent, CideEleConfirmationModalComponent, CideEleDataGridComponent, CideEleDropdownComponent, CideEleFileImageDirective, CideEleFileInputComponent, CideEleFileManagerService, CideEleGlobalFileUploaderComponent, CideEleGlobalNotificationsComponent, CideEleJsonEditorComponent, CideEleResizerDirective, CideEleSkeletonLoaderComponent, CideEleTabComponent, CideEleToastNotificationComponent, CideElementsService, CideIconComponent, CideInputComponent, CideSelectComponent, CideSelectOptionComponent, CideSpinnerComponent, CideTextareaComponent, ConfirmationService, CoreFileManagerInsertUpdatePayload, DEFAULT_GRID_CONFIG, DropdownManagerService, ICoreCyfmSave, MFileManager, NotificationService, TooltipDirective };
8264
8750
  //# sourceMappingURL=cloud-ide-element.mjs.map