cloud-ide-element 1.0.74 → 1.0.75
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-element.mjs +445 -3
- package/fesm2022/cloud-ide-element.mjs.map +1 -1
- package/index.d.ts +324 -187
- package/package.json +1 -1
|
@@ -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,444 @@ 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(),
|
|
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
|
+
this.updateUploadProgress(upload.fileId, progress);
|
|
4200
|
+
})
|
|
4201
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
4202
|
+
.subscribe({
|
|
4203
|
+
next: (response) => {
|
|
4204
|
+
completedCount++;
|
|
4205
|
+
console.log(`✅ [GlobalFileUploader] File ${index + 1}/${totalFiles} uploaded successfully`);
|
|
4206
|
+
this.updateUploadStatus(upload.fileId, 'completed', 100, undefined, response);
|
|
4207
|
+
this.uploadComplete.emit({
|
|
4208
|
+
fileId: upload.fileId,
|
|
4209
|
+
fileName: upload.fileName,
|
|
4210
|
+
progress: 100,
|
|
4211
|
+
status: 'completed',
|
|
4212
|
+
uploadedFile: response
|
|
4213
|
+
});
|
|
4214
|
+
if (response?.data?.core_file_manager?.[0]) {
|
|
4215
|
+
uploadedFiles.push(response.data.core_file_manager[0]);
|
|
4216
|
+
}
|
|
4217
|
+
console.log('🔍 [GlobalFileUploader] Upload response received:', response);
|
|
4218
|
+
console.log('🔍 [GlobalFileUploader] Response data structure:', response?.data);
|
|
4219
|
+
// Check if all files are completed
|
|
4220
|
+
if (completedCount + failedCount === totalFiles) {
|
|
4221
|
+
this.handleMultipleUploadComplete(completedCount, failedCount, groupId, uploadedFiles);
|
|
4222
|
+
}
|
|
4223
|
+
},
|
|
4224
|
+
error: (error) => {
|
|
4225
|
+
failedCount++;
|
|
4226
|
+
console.error(`❌ [GlobalFileUploader] File ${index + 1}/${totalFiles} upload failed:`, error);
|
|
4227
|
+
this.updateUploadStatus(upload.fileId, 'error', 0, error.message || 'Upload failed');
|
|
4228
|
+
this.uploadError.emit({
|
|
4229
|
+
fileId: upload.fileId,
|
|
4230
|
+
error: error.message || 'Upload failed'
|
|
4231
|
+
});
|
|
4232
|
+
// Check if all files are completed
|
|
4233
|
+
if (completedCount + failedCount === totalFiles) {
|
|
4234
|
+
this.handleMultipleUploadComplete(completedCount, failedCount, groupId, uploadedFiles);
|
|
4235
|
+
}
|
|
4236
|
+
}
|
|
4237
|
+
});
|
|
4238
|
+
});
|
|
4239
|
+
}
|
|
4240
|
+
/**
|
|
4241
|
+
* Handle multiple upload completion
|
|
4242
|
+
*/
|
|
4243
|
+
handleMultipleUploadComplete(completed, failed, groupId, uploadedFiles) {
|
|
4244
|
+
console.log(`📊 [GlobalFileUploader] Multiple upload complete: ${completed}/${completed + failed} successful`);
|
|
4245
|
+
this.isUploading.set(false);
|
|
4246
|
+
if (completed > 0) {
|
|
4247
|
+
this.allUploadsComplete.emit({
|
|
4248
|
+
groupId: groupId,
|
|
4249
|
+
uploadedFiles: uploadedFiles
|
|
4250
|
+
});
|
|
4251
|
+
}
|
|
4252
|
+
}
|
|
4253
|
+
/**
|
|
4254
|
+
* Upload next file in queue (single file mode)
|
|
4255
|
+
*/
|
|
4256
|
+
uploadNextFile() {
|
|
4257
|
+
const pendingUpload = this.uploadQueue().find(upload => upload.status === 'pending');
|
|
4258
|
+
if (!pendingUpload) {
|
|
4259
|
+
this.isUploading.set(false);
|
|
4260
|
+
return;
|
|
4261
|
+
}
|
|
4262
|
+
// Update status to uploading
|
|
4263
|
+
this.updateUploadStatus(pendingUpload.fileId, 'uploading', 0);
|
|
4264
|
+
const uploadRequest = {
|
|
4265
|
+
file: pendingUpload.file,
|
|
4266
|
+
userId: this.userId,
|
|
4267
|
+
tags: [],
|
|
4268
|
+
permissions: ['read', 'write']
|
|
4269
|
+
};
|
|
4270
|
+
this.fileService.uploadFile(pendingUpload.file, this.convertToFileUploadOptions(uploadRequest), (progress) => {
|
|
4271
|
+
this.updateUploadProgress(pendingUpload.fileId, progress);
|
|
4272
|
+
})
|
|
4273
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
4274
|
+
.subscribe({
|
|
4275
|
+
next: (response) => {
|
|
4276
|
+
console.log('✅ [GlobalFileUploader] Single file upload successful:', response);
|
|
4277
|
+
this.updateUploadStatus(pendingUpload.fileId, 'completed', 100, undefined, response);
|
|
4278
|
+
this.uploadComplete.emit({
|
|
4279
|
+
fileId: pendingUpload.fileId,
|
|
4280
|
+
fileName: pendingUpload.fileName,
|
|
4281
|
+
progress: 100,
|
|
4282
|
+
status: 'completed',
|
|
4283
|
+
uploadedFile: response
|
|
4284
|
+
});
|
|
4285
|
+
// Process next file
|
|
4286
|
+
setTimeout(() => this.uploadNextFile(), 500);
|
|
4287
|
+
},
|
|
4288
|
+
error: (error) => {
|
|
4289
|
+
console.error('❌ [GlobalFileUploader] Upload error:', error);
|
|
4290
|
+
this.updateUploadStatus(pendingUpload.fileId, 'error', 0, error.message || 'Upload failed');
|
|
4291
|
+
this.uploadError.emit({
|
|
4292
|
+
fileId: pendingUpload.fileId,
|
|
4293
|
+
error: error.message || 'Upload failed'
|
|
4294
|
+
});
|
|
4295
|
+
// Process next file
|
|
4296
|
+
setTimeout(() => this.uploadNextFile(), 500);
|
|
4297
|
+
}
|
|
4298
|
+
});
|
|
4299
|
+
}
|
|
4300
|
+
/**
|
|
4301
|
+
* Update upload progress
|
|
4302
|
+
*/
|
|
4303
|
+
updateUploadProgress(fileId, progress) {
|
|
4304
|
+
this.uploadQueue.update(queue => queue.map(upload => upload.fileId === fileId
|
|
4305
|
+
? { ...upload, progress }
|
|
4306
|
+
: upload));
|
|
4307
|
+
}
|
|
4308
|
+
/**
|
|
4309
|
+
* Update upload status
|
|
4310
|
+
*/
|
|
4311
|
+
updateUploadStatus(fileId, status, progress, error, uploadedFile) {
|
|
4312
|
+
console.log('🔄 [GlobalFileUploader] Updating upload status:', { fileId, status, progress, error: !!error, uploadedFile: !!uploadedFile });
|
|
4313
|
+
this.uploadQueue.update(queue => {
|
|
4314
|
+
const updatedQueue = queue.map(upload => {
|
|
4315
|
+
if (upload.fileId === fileId) {
|
|
4316
|
+
console.log('🔄 [GlobalFileUploader] Found upload to update:', upload.fileName, 'from', upload.status, 'to', status);
|
|
4317
|
+
return { ...upload, status, progress, error, uploadedFile };
|
|
4318
|
+
}
|
|
4319
|
+
return upload;
|
|
4320
|
+
});
|
|
4321
|
+
console.log('🔄 [GlobalFileUploader] Updated queue:', updatedQueue.map(u => ({ fileName: u.fileName, status: u.status })));
|
|
4322
|
+
return updatedQueue;
|
|
4323
|
+
});
|
|
4324
|
+
}
|
|
4325
|
+
/**
|
|
4326
|
+
* Handle upload error
|
|
4327
|
+
*/
|
|
4328
|
+
handleUploadError(error, fileId) {
|
|
4329
|
+
if (fileId) {
|
|
4330
|
+
this.updateUploadStatus(fileId, 'error', 0, error);
|
|
4331
|
+
this.uploadError.emit({ fileId, error });
|
|
4332
|
+
}
|
|
4333
|
+
this.isUploading.set(false);
|
|
4334
|
+
}
|
|
4335
|
+
/**
|
|
4336
|
+
* Cancel upload
|
|
4337
|
+
*/
|
|
4338
|
+
cancelUpload(fileId) {
|
|
4339
|
+
this.updateUploadStatus(fileId, 'cancelled', 0);
|
|
4340
|
+
this.uploadCancelled.emit(fileId);
|
|
4341
|
+
// Remove from queue after a delay
|
|
4342
|
+
setTimeout(() => {
|
|
4343
|
+
this.uploadQueue.update(queue => queue.filter(upload => upload.fileId !== fileId));
|
|
4344
|
+
}, 1000);
|
|
4345
|
+
}
|
|
4346
|
+
/**
|
|
4347
|
+
* Retry upload
|
|
4348
|
+
*/
|
|
4349
|
+
retryUpload(fileId) {
|
|
4350
|
+
this.updateUploadStatus(fileId, 'pending', 0);
|
|
4351
|
+
this.processUploadQueue();
|
|
4352
|
+
}
|
|
4353
|
+
/**
|
|
4354
|
+
* Remove upload from queue
|
|
4355
|
+
*/
|
|
4356
|
+
removeUpload(fileId) {
|
|
4357
|
+
this.uploadQueue.update(queue => queue.filter(upload => upload.fileId !== fileId));
|
|
4358
|
+
}
|
|
4359
|
+
/**
|
|
4360
|
+
* Clear completed uploads
|
|
4361
|
+
*/
|
|
4362
|
+
clearCompleted() {
|
|
4363
|
+
this.uploadQueue.update(queue => queue.filter(upload => upload.status !== 'completed'));
|
|
4364
|
+
}
|
|
4365
|
+
/**
|
|
4366
|
+
* Clear all uploads
|
|
4367
|
+
*/
|
|
4368
|
+
clearAll() {
|
|
4369
|
+
this.uploadQueue.set([]);
|
|
4370
|
+
this.currentGroupId.set(null);
|
|
4371
|
+
}
|
|
4372
|
+
/**
|
|
4373
|
+
* Get status icon
|
|
4374
|
+
*/
|
|
4375
|
+
getStatusIcon(status) {
|
|
4376
|
+
switch (status) {
|
|
4377
|
+
case 'pending': return 'schedule';
|
|
4378
|
+
case 'uploading': return 'cloud_upload';
|
|
4379
|
+
case 'completed': return 'check_circle';
|
|
4380
|
+
case 'error': return 'error';
|
|
4381
|
+
case 'cancelled': return 'cancel';
|
|
4382
|
+
default: return 'help';
|
|
4383
|
+
}
|
|
4384
|
+
}
|
|
4385
|
+
/**
|
|
4386
|
+
* Get status class
|
|
4387
|
+
*/
|
|
4388
|
+
getStatusClass(status) {
|
|
4389
|
+
switch (status) {
|
|
4390
|
+
case 'pending': return 'status-pending';
|
|
4391
|
+
case 'uploading': return 'status-uploading';
|
|
4392
|
+
case 'completed': return 'status-completed';
|
|
4393
|
+
case 'error': return 'status-error';
|
|
4394
|
+
case 'cancelled': return 'status-cancelled';
|
|
4395
|
+
default: return 'status-unknown';
|
|
4396
|
+
}
|
|
4397
|
+
}
|
|
4398
|
+
/**
|
|
4399
|
+
* Get file size display
|
|
4400
|
+
*/
|
|
4401
|
+
getFileSizeDisplay(file) {
|
|
4402
|
+
const bytes = file.size;
|
|
4403
|
+
if (bytes === 0)
|
|
4404
|
+
return '0 Bytes';
|
|
4405
|
+
const k = 1024;
|
|
4406
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
4407
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
4408
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
4409
|
+
}
|
|
4410
|
+
/**
|
|
4411
|
+
* Generate unique file ID
|
|
4412
|
+
*/
|
|
4413
|
+
generateFileId() {
|
|
4414
|
+
return `upload_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
4415
|
+
}
|
|
4416
|
+
/**
|
|
4417
|
+
* Convert IFileUploadRequest to FileUploadOptions
|
|
4418
|
+
*/
|
|
4419
|
+
convertToFileUploadOptions(request) {
|
|
4420
|
+
return {
|
|
4421
|
+
altText: request.altText,
|
|
4422
|
+
userId: request.userId,
|
|
4423
|
+
permissions: request.permissions,
|
|
4424
|
+
tags: request.tags,
|
|
4425
|
+
groupId: request.groupId
|
|
4426
|
+
};
|
|
4427
|
+
}
|
|
4428
|
+
/**
|
|
4429
|
+
* Trigger file input click
|
|
4430
|
+
*/
|
|
4431
|
+
triggerFileInput() {
|
|
4432
|
+
const fileInput = document.getElementById('global-file-input');
|
|
4433
|
+
if (fileInput) {
|
|
4434
|
+
fileInput.click();
|
|
4435
|
+
}
|
|
4436
|
+
}
|
|
4437
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideEleGlobalFileUploaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
4438
|
+
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"] }] });
|
|
4439
|
+
}
|
|
4440
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImport: i0, type: CideEleGlobalFileUploaderComponent, decorators: [{
|
|
4441
|
+
type: Component,
|
|
4442
|
+
args: [{ selector: 'cide-ele-global-file-uploader', standalone: true, imports: [
|
|
4443
|
+
CommonModule,
|
|
4444
|
+
CideEleButtonComponent,
|
|
4445
|
+
CideIconComponent
|
|
4446
|
+
], 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"] }]
|
|
4447
|
+
}], ctorParameters: () => [], propDecorators: { userId: [{
|
|
4448
|
+
type: Input
|
|
4449
|
+
}], multiple: [{
|
|
4450
|
+
type: Input
|
|
4451
|
+
}], accept: [{
|
|
4452
|
+
type: Input
|
|
4453
|
+
}], maxFileSize: [{
|
|
4454
|
+
type: Input
|
|
4455
|
+
}], allowedTypes: [{
|
|
4456
|
+
type: Input
|
|
4457
|
+
}], uploadComplete: [{
|
|
4458
|
+
type: Output
|
|
4459
|
+
}], uploadError: [{
|
|
4460
|
+
type: Output
|
|
4461
|
+
}], uploadCancelled: [{
|
|
4462
|
+
type: Output
|
|
4463
|
+
}], allUploadsComplete: [{
|
|
4464
|
+
type: Output
|
|
4465
|
+
}] } });
|
|
4466
|
+
|
|
4025
4467
|
class CideTextareaComponent {
|
|
4026
4468
|
label = '';
|
|
4027
4469
|
labelHide = false;
|
|
@@ -7189,7 +7631,7 @@ class CideCoreFileManagerService {
|
|
|
7189
7631
|
formData.append('altText', request.altText || '');
|
|
7190
7632
|
formData.append('tags', JSON.stringify(request.tags || []));
|
|
7191
7633
|
formData.append('permissions', JSON.stringify(request.permissions || []));
|
|
7192
|
-
formData.append('userId', request.userId);
|
|
7634
|
+
formData.append('userId', request.userId || '');
|
|
7193
7635
|
const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'upload']);
|
|
7194
7636
|
const req = new HttpRequest('POST', url, formData, {
|
|
7195
7637
|
reportProgress: true
|
|
@@ -8260,5 +8702,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.7", ngImpor
|
|
|
8260
8702
|
* Generated bundle index. Do not edit.
|
|
8261
8703
|
*/
|
|
8262
8704
|
|
|
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 };
|
|
8705
|
+
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
8706
|
//# sourceMappingURL=cloud-ide-element.mjs.map
|