@flusys/ng-storage 1.0.0-beta → 1.1.0-beta

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.
Files changed (18) hide show
  1. package/README.md +68 -1
  2. package/fesm2022/{flusys-ng-storage-file-manager-form.component-DVZsFYrj.mjs → flusys-ng-storage-file-manager-form.component-CxAYC6nj.mjs} +5 -5
  3. package/fesm2022/{flusys-ng-storage-file-manager-form.component-DVZsFYrj.mjs.map → flusys-ng-storage-file-manager-form.component-CxAYC6nj.mjs.map} +1 -1
  4. package/fesm2022/{flusys-ng-storage-file-manager-list.component-CwnyNoYb.mjs → flusys-ng-storage-file-manager-list.component-BevfDZO0.mjs} +6 -6
  5. package/fesm2022/{flusys-ng-storage-file-manager-list.component-CwnyNoYb.mjs.map → flusys-ng-storage-file-manager-list.component-BevfDZO0.mjs.map} +1 -1
  6. package/fesm2022/{flusys-ng-storage-folder-form.component-DH-KCz21.mjs → flusys-ng-storage-folder-form.component-BhurG3dl.mjs} +4 -4
  7. package/fesm2022/{flusys-ng-storage-folder-form.component-DH-KCz21.mjs.map → flusys-ng-storage-folder-form.component-BhurG3dl.mjs.map} +1 -1
  8. package/fesm2022/{flusys-ng-storage-folder-list.component-iIys4NvL.mjs → flusys-ng-storage-folder-list.component-Clrjcw0B.mjs} +4 -4
  9. package/fesm2022/{flusys-ng-storage-folder-list.component-iIys4NvL.mjs.map → flusys-ng-storage-folder-list.component-Clrjcw0B.mjs.map} +1 -1
  10. package/fesm2022/{flusys-ng-storage-storage-config-form.component-Bc95TVD0.mjs → flusys-ng-storage-storage-config-form.component-SEYIBife.mjs} +37 -4
  11. package/fesm2022/flusys-ng-storage-storage-config-form.component-SEYIBife.mjs.map +1 -0
  12. package/fesm2022/{flusys-ng-storage-storage-config-list.component-Bfomqyr3.mjs → flusys-ng-storage-storage-config-list.component-CofVBysj.mjs} +5 -5
  13. package/fesm2022/{flusys-ng-storage-storage-config-list.component-Bfomqyr3.mjs.map → flusys-ng-storage-storage-config-list.component-CofVBysj.mjs.map} +1 -1
  14. package/fesm2022/flusys-ng-storage.mjs +191 -70
  15. package/fesm2022/flusys-ng-storage.mjs.map +1 -1
  16. package/package.json +4 -4
  17. package/types/flusys-ng-storage.d.ts +77 -4
  18. package/fesm2022/flusys-ng-storage-storage-config-form.component-Bc95TVD0.mjs.map +0 -1
@@ -1,8 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, Injectable, Component } from '@angular/core';
3
+ import { map } from 'rxjs/operators';
4
+ import { switchMap } from 'rxjs';
5
+ import { BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';
3
6
  import { HttpClient } from '@angular/common/http';
4
- import { ApiResourceService } from '@flusys/ng-shared';
5
- import { BaseApiService } from '@flusys/ng-core';
7
+ import { ApiResourceService, PROFILE_UPLOAD_PROVIDER } from '@flusys/ng-shared';
6
8
  import { CommonModule } from '@angular/common';
7
9
  import { RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';
8
10
 
@@ -76,6 +78,13 @@ class FileManagerApiService extends ApiResourceService {
76
78
  sort: {},
77
79
  });
78
80
  }
81
+ /**
82
+ * Create new file manager record
83
+ * POST /storage/file-manager/insert
84
+ */
85
+ create(dto) {
86
+ return this.http.post(`${this.baseUrl}/insert`, dto);
87
+ }
79
88
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FileManagerApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
80
89
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FileManagerApiService, providedIn: 'root' });
81
90
  }
@@ -86,50 +95,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
86
95
  }]
87
96
  }], ctorParameters: () => [] });
88
97
 
89
- /**
90
- * Folder API Service
91
- * Handles folder CRUD operations
92
- * Endpoint: POST /storage/folder/*
93
- *
94
- * Note: Company feature enabled - all queries automatically scoped to user's company
95
- */
96
- class FolderApiService extends ApiResourceService {
97
- constructor() {
98
- const http = inject(HttpClient);
99
- super('storage/folder', http);
100
- }
101
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FolderApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
102
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FolderApiService, providedIn: 'root' });
103
- }
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FolderApiService, decorators: [{
105
- type: Injectable,
106
- args: [{
107
- providedIn: 'root',
108
- }]
109
- }], ctorParameters: () => [] });
110
-
111
- /**
112
- * Storage Config API Service
113
- * Handles storage configuration CRUD operations
114
- * Endpoint: POST /storage/storage-config/*
115
- *
116
- * Note: Company feature enabled - all queries automatically scoped to user's company
117
- */
118
- class StorageConfigApiService extends ApiResourceService {
119
- constructor() {
120
- const http = inject(HttpClient);
121
- super('storage/storage-config', http);
122
- }
123
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: StorageConfigApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
124
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: StorageConfigApiService, providedIn: 'root' });
125
- }
126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: StorageConfigApiService, decorators: [{
127
- type: Injectable,
128
- args: [{
129
- providedIn: 'root',
130
- }]
131
- }], ctorParameters: () => [] });
132
-
133
98
  /**
134
99
  * Upload Service
135
100
  * Handles file upload/delete operations
@@ -140,11 +105,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
140
105
  * - Image compression
141
106
  * - Multiple storage providers
142
107
  * - File validation (size, type)
108
+ * - Default storage config from environment (services.storage.defaultStorageConfigId)
143
109
  */
144
110
  class UploadService extends BaseApiService {
111
+ fileManagerApi = inject(FileManagerApiService);
145
112
  constructor() {
146
113
  super('storage');
147
114
  }
115
+ /**
116
+ * Get default storage config ID from app config
117
+ * Used when no storageConfigId is provided in upload options
118
+ */
119
+ getDefaultConfigId() {
120
+ return getDefaultStorageConfigId(this.appConfig);
121
+ }
148
122
  /**
149
123
  * Upload single file
150
124
  * POST /storage/upload/single-file?storageConfigId=x&folderPath=y
@@ -179,24 +153,25 @@ class UploadService extends BaseApiService {
179
153
  }
180
154
  /**
181
155
  * Build query string from upload options
156
+ * Uses default storageConfigId from app config if not provided in options
182
157
  */
183
158
  buildQueryParams(options) {
184
- if (!options)
185
- return '';
186
159
  const params = new URLSearchParams();
187
- if (options.storageConfigId)
188
- params.append('storageConfigId', options.storageConfigId);
189
- if (options.folderPath)
160
+ // Use provided storageConfigId or fall back to default from config
161
+ const storageConfigId = options?.storageConfigId ?? this.getDefaultConfigId();
162
+ if (storageConfigId)
163
+ params.append('storageConfigId', storageConfigId);
164
+ if (options?.folderPath)
190
165
  params.append('folderPath', options.folderPath);
191
- if (options.maxWidth)
166
+ if (options?.maxWidth)
192
167
  params.append('maxWidth', options.maxWidth.toString());
193
- if (options.maxHeight)
168
+ if (options?.maxHeight)
194
169
  params.append('maxHeight', options.maxHeight.toString());
195
- if (options.quality)
170
+ if (options?.quality)
196
171
  params.append('quality', options.quality.toString());
197
- if (options.format)
172
+ if (options?.format)
198
173
  params.append('format', options.format);
199
- if (options.compress !== undefined)
174
+ if (options?.compress !== undefined)
200
175
  params.append('compress', options.compress.toString());
201
176
  return params.toString();
202
177
  }
@@ -205,20 +180,22 @@ class UploadService extends BaseApiService {
205
180
  * POST /storage/upload/delete-single-file
206
181
  *
207
182
  * @param key - File key/path to delete
208
- * @param storageConfigId - Optional storage config ID (uses default if not provided)
183
+ * @param storageConfigId - Optional storage config ID (uses default from config if not provided)
209
184
  */
210
185
  deleteSingleFile(key, storageConfigId) {
211
- return this.http.post(this.getUrl('upload/delete-single-file'), { key, ...(storageConfigId && { storageConfigId }) });
186
+ const configId = storageConfigId ?? this.getDefaultConfigId();
187
+ return this.http.post(this.getUrl('upload/delete-single-file'), { key, ...(configId && { storageConfigId: configId }) });
212
188
  }
213
189
  /**
214
190
  * Delete multiple files
215
191
  * POST /storage/upload/delete-multiple-file
216
192
  *
217
193
  * @param keys - Array of file keys/paths to delete
218
- * @param storageConfigId - Optional storage config ID (uses default if not provided)
194
+ * @param storageConfigId - Optional storage config ID (uses default from config if not provided)
219
195
  */
220
196
  deleteMultipleFiles(keys, storageConfigId) {
221
- return this.http.post(this.getUrl('upload/delete-multiple-file'), { keys, ...(storageConfigId && { storageConfigId }) });
197
+ const configId = storageConfigId ?? this.getDefaultConfigId();
198
+ return this.http.post(this.getUrl('upload/delete-multiple-file'), { keys, ...(configId && { storageConfigId: configId }) });
222
199
  }
223
200
  /**
224
201
  * Get file download URL
@@ -230,6 +207,34 @@ class UploadService extends BaseApiService {
230
207
  getFileUrl(key) {
231
208
  return this.getUrl(`upload/file/${key}`);
232
209
  }
210
+ /**
211
+ * Upload file and register in file manager
212
+ * Returns file manager ID (UUID) for storing in references like profilePictureId
213
+ *
214
+ * @param file - File to upload
215
+ * @param options - Upload options (storage config, compression, etc.)
216
+ * @returns Observable with file manager record (id is the UUID to store)
217
+ */
218
+ uploadAndRegister(file, options) {
219
+ return this.uploadSingleFile(file, options).pipe(switchMap((uploadResponse) => {
220
+ if (!uploadResponse.success || !uploadResponse.data) {
221
+ throw new Error(uploadResponse.message || 'Upload failed');
222
+ }
223
+ const uploadedFile = uploadResponse.data;
224
+ const storageConfigId = options?.storageConfigId ?? this.getDefaultConfigId();
225
+ // Create file manager record
226
+ return this.fileManagerApi.create({
227
+ name: uploadedFile.name,
228
+ key: uploadedFile.key,
229
+ size: String(uploadedFile.size),
230
+ contentType: uploadedFile.contentType,
231
+ isPrivate: options?.isPrivate ?? false,
232
+ folderId: options?.folderId,
233
+ storageConfigId,
234
+ location: FileLocationEnum.LOCAL,
235
+ });
236
+ }));
237
+ }
233
238
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: UploadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
234
239
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: UploadService, providedIn: 'root' });
235
240
  }
@@ -240,6 +245,122 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
240
245
  }]
241
246
  }], ctorParameters: () => [] });
242
247
 
248
+ /**
249
+ * Profile Upload Provider Adapter
250
+ *
251
+ * Implements IProfileUploadProvider interface for ng-auth profile page.
252
+ * Uses UploadService.uploadAndRegister() to upload files and register in file manager.
253
+ *
254
+ * @example
255
+ * // In app.config.ts
256
+ * providers: [
257
+ * ...provideStorageProviders(),
258
+ * ]
259
+ */
260
+ class ProfileUploadProviderAdapter {
261
+ uploadService = inject(UploadService);
262
+ /**
263
+ * Upload profile picture and register in file manager
264
+ * Returns file manager ID (UUID) for storing in user.profilePictureId
265
+ */
266
+ uploadProfilePicture(file, options) {
267
+ return this.uploadService
268
+ .uploadAndRegister(file, {
269
+ folderPath: options?.folderPath ?? 'profile-pictures',
270
+ compress: options?.compress ?? true,
271
+ maxWidth: options?.maxWidth ?? 400,
272
+ maxHeight: options?.maxHeight ?? 400,
273
+ })
274
+ .pipe(map((response) => ({
275
+ success: response.success,
276
+ message: response.message,
277
+ data: response.data
278
+ ? {
279
+ id: response.data.id,
280
+ name: response.data.name,
281
+ key: response.data.key,
282
+ size: parseFloat(response.data.size) * 1024, // Convert KB to bytes
283
+ contentType: response.data.contentType,
284
+ }
285
+ : undefined,
286
+ })));
287
+ }
288
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ProfileUploadProviderAdapter, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
289
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ProfileUploadProviderAdapter });
290
+ }
291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ProfileUploadProviderAdapter, decorators: [{
292
+ type: Injectable
293
+ }] });
294
+
295
+ /**
296
+ * Provide Storage Providers
297
+ *
298
+ * Registers storage-related provider implementations.
299
+ * Call this in app.config.ts to enable storage features in other packages.
300
+ *
301
+ * @example
302
+ * // In app.config.ts
303
+ * export const appConfig: ApplicationConfig = {
304
+ * providers: [
305
+ * ...provideStorageProviders(),
306
+ * ],
307
+ * };
308
+ *
309
+ * @returns Array of providers for storage functionality
310
+ */
311
+ function provideStorageProviders() {
312
+ return [
313
+ {
314
+ provide: PROFILE_UPLOAD_PROVIDER,
315
+ useClass: ProfileUploadProviderAdapter,
316
+ },
317
+ ];
318
+ }
319
+
320
+ /**
321
+ * Folder API Service
322
+ * Handles folder CRUD operations
323
+ * Endpoint: POST /storage/folder/*
324
+ *
325
+ * Note: Company feature enabled - all queries automatically scoped to user's company
326
+ */
327
+ class FolderApiService extends ApiResourceService {
328
+ constructor() {
329
+ const http = inject(HttpClient);
330
+ super('storage/folder', http);
331
+ }
332
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FolderApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
333
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FolderApiService, providedIn: 'root' });
334
+ }
335
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FolderApiService, decorators: [{
336
+ type: Injectable,
337
+ args: [{
338
+ providedIn: 'root',
339
+ }]
340
+ }], ctorParameters: () => [] });
341
+
342
+ /**
343
+ * Storage Config API Service
344
+ * Handles storage configuration CRUD operations
345
+ * Endpoint: POST /storage/storage-config/*
346
+ *
347
+ * Note: Company feature enabled - all queries automatically scoped to user's company
348
+ */
349
+ class StorageConfigApiService extends ApiResourceService {
350
+ constructor() {
351
+ const http = inject(HttpClient);
352
+ super('storage/storage-config', http);
353
+ }
354
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: StorageConfigApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
355
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: StorageConfigApiService, providedIn: 'root' });
356
+ }
357
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: StorageConfigApiService, decorators: [{
358
+ type: Injectable,
359
+ args: [{
360
+ providedIn: 'root',
361
+ }]
362
+ }], ctorParameters: () => [] });
363
+
243
364
  /**
244
365
  * Storage Module Routes
245
366
  * All storage management routes: configs, files, folders
@@ -257,15 +378,15 @@ const STORAGE_ROUTES = [
257
378
  children: [
258
379
  {
259
380
  path: '',
260
- loadComponent: () => import('./flusys-ng-storage-file-manager-list.component-CwnyNoYb.mjs').then((m) => m.FileManagerListComponent),
381
+ loadComponent: () => import('./flusys-ng-storage-file-manager-list.component-BevfDZO0.mjs').then((m) => m.FileManagerListComponent),
261
382
  },
262
383
  {
263
384
  path: 'new',
264
- loadComponent: () => import('./flusys-ng-storage-file-manager-form.component-DVZsFYrj.mjs').then((m) => m.FileManagerFormComponent),
385
+ loadComponent: () => import('./flusys-ng-storage-file-manager-form.component-CxAYC6nj.mjs').then((m) => m.FileManagerFormComponent),
265
386
  },
266
387
  {
267
388
  path: ':id',
268
- loadComponent: () => import('./flusys-ng-storage-file-manager-form.component-DVZsFYrj.mjs').then((m) => m.FileManagerFormComponent),
389
+ loadComponent: () => import('./flusys-ng-storage-file-manager-form.component-CxAYC6nj.mjs').then((m) => m.FileManagerFormComponent),
269
390
  },
270
391
  ],
271
392
  },
@@ -275,15 +396,15 @@ const STORAGE_ROUTES = [
275
396
  children: [
276
397
  {
277
398
  path: '',
278
- loadComponent: () => import('./flusys-ng-storage-folder-list.component-iIys4NvL.mjs').then((m) => m.FolderListComponent),
399
+ loadComponent: () => import('./flusys-ng-storage-folder-list.component-Clrjcw0B.mjs').then((m) => m.FolderListComponent),
279
400
  },
280
401
  {
281
402
  path: 'new',
282
- loadComponent: () => import('./flusys-ng-storage-folder-form.component-DH-KCz21.mjs').then((m) => m.FolderFormComponent),
403
+ loadComponent: () => import('./flusys-ng-storage-folder-form.component-BhurG3dl.mjs').then((m) => m.FolderFormComponent),
283
404
  },
284
405
  {
285
406
  path: ':id',
286
- loadComponent: () => import('./flusys-ng-storage-folder-form.component-DH-KCz21.mjs').then((m) => m.FolderFormComponent),
407
+ loadComponent: () => import('./flusys-ng-storage-folder-form.component-BhurG3dl.mjs').then((m) => m.FolderFormComponent),
287
408
  },
288
409
  ],
289
410
  },
@@ -293,15 +414,15 @@ const STORAGE_ROUTES = [
293
414
  children: [
294
415
  {
295
416
  path: '',
296
- loadComponent: () => import('./flusys-ng-storage-storage-config-list.component-Bfomqyr3.mjs').then((m) => m.StorageConfigListComponent),
417
+ loadComponent: () => import('./flusys-ng-storage-storage-config-list.component-CofVBysj.mjs').then((m) => m.StorageConfigListComponent),
297
418
  },
298
419
  {
299
420
  path: 'new',
300
- loadComponent: () => import('./flusys-ng-storage-storage-config-form.component-Bc95TVD0.mjs').then((m) => m.StorageConfigFormComponent),
421
+ loadComponent: () => import('./flusys-ng-storage-storage-config-form.component-SEYIBife.mjs').then((m) => m.StorageConfigFormComponent),
301
422
  },
302
423
  {
303
424
  path: ':id',
304
- loadComponent: () => import('./flusys-ng-storage-storage-config-form.component-Bc95TVD0.mjs').then((m) => m.StorageConfigFormComponent),
425
+ loadComponent: () => import('./flusys-ng-storage-storage-config-form.component-SEYIBife.mjs').then((m) => m.StorageConfigFormComponent),
305
426
  },
306
427
  ],
307
428
  },
@@ -411,5 +532,5 @@ var storageContainer_component = /*#__PURE__*/Object.freeze({
411
532
  * Generated bundle index. Do not edit.
412
533
  */
413
534
 
414
- export { FileLocationEnum, FileManagerApiService, FolderApiService, ImageFormat, STORAGE_ROUTES, StorageConfigApiService, StorageContainerComponent, UploadService };
535
+ export { FileLocationEnum, FileManagerApiService, FolderApiService, ImageFormat, ProfileUploadProviderAdapter, STORAGE_ROUTES, StorageConfigApiService, StorageContainerComponent, UploadService, provideStorageProviders };
415
536
  //# sourceMappingURL=flusys-ng-storage.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage.mjs","sources":["../../../projects/ng-storage/enums/file-location.enum.ts","../../../projects/ng-storage/services/file-manager-api.service.ts","../../../projects/ng-storage/services/folder-api.service.ts","../../../projects/ng-storage/services/storage-config-api.service.ts","../../../projects/ng-storage/services/upload.service.ts","../../../projects/ng-storage/routes/storage.routes.ts","../../../projects/ng-storage/pages/storage-container/storage-container.component.ts","../../../projects/ng-storage/public-api.ts","../../../projects/ng-storage/flusys-ng-storage.ts"],"sourcesContent":["/**\n * File Location Enum\n * Storage provider types (matches backend FileLocationEnum)\n */\nexport enum FileLocationEnum {\n LOCAL = 'local',\n AWS = 'aws',\n AZURE = 'azure',\n SFTP = 'sftp',\n}\n\n/**\n * Image Format Enum\n * Supported image output formats for compression\n */\nexport enum ImageFormat {\n ORIGINAL = 'original',\n JPEG = 'jpeg',\n PNG = 'png',\n WEBP = 'webp',\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ApiResourceService, ISingleResponse, IListResponse } from '@flusys/ng-shared';\nimport {\n IFileManager,\n ICreateFileManagerDto,\n IUpdateFileManagerDto,\n IGetFilesRequestDto,\n IFilesResponseDto,\n} from '../interfaces/file-manager.interface';\n\n/**\n * File Manager API Service\n * Handles file metadata CRUD operations\n * Endpoint: POST /storage/file-manager/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FileManagerApiService extends ApiResourceService<\n IUpdateFileManagerDto,\n IFileManager\n> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/file-manager', http);\n }\n\n /**\n * Get multiple files with valid URLs\n * POST /storage/file-manager/get-files\n * Regenerates presigned URLs if expired\n */\n getFiles(\n fileIds: string[]\n ): Observable<ISingleResponse<IFilesResponseDto[]>> {\n const requests: IGetFilesRequestDto[] = fileIds.map((id) => ({ id }));\n return this.http.post<ISingleResponse<IFilesResponseDto[]>>(\n `${this.baseUrl}/get-files`,\n requests\n );\n }\n\n /**\n * Get files by folder\n * POST /storage/file-manager/get-all\n * Filtered by folder ID and company (if enabled)\n */\n getFilesByFolder(\n folderId: number | null,\n page: number = 1,\n limit: number = 50\n ): Observable<IListResponse<IFileManager>> {\n return this.getAll('', {\n filter: folderId ? { folderId } : {},\n pagination: { currentPage: page - 1, pageSize: limit },\n select: [],\n sort: {},\n });\n }\n\n /**\n * Get private files (requires permission)\n * POST /storage/file-manager/get-all\n * Filtered by isPrivate and user permission 'storage.file.viewPrivate'\n */\n getPrivateFiles(\n page: number = 1,\n limit: number = 50\n ): Observable<IListResponse<IFileManager>> {\n return this.getAll('', {\n filter: { isPrivate: true },\n pagination: { currentPage: page - 1, pageSize: limit },\n select: [],\n sort: {},\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { IFolder, IUpdateFolderDto } from '../interfaces/folder.interface';\n\n/**\n * Folder API Service\n * Handles folder CRUD operations\n * Endpoint: POST /storage/folder/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FolderApiService extends ApiResourceService<IUpdateFolderDto, IFolder> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/folder', http);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { IStorageConfig, IUpdateStorageConfigDto } from '../interfaces/storage-config.interface';\n\n/**\n * Storage Config API Service\n * Handles storage configuration CRUD operations\n * Endpoint: POST /storage/storage-config/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StorageConfigApiService extends ApiResourceService<\n IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/storage-config', http);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BaseApiService } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport {\n IUploadOptionsDto,\n IUploadedFileInfo,\n} from '../interfaces/upload.interface';\n\n/**\n * Upload Service\n * Handles file upload/delete operations\n * Endpoint: POST /storage/upload/*\n *\n * Features:\n * - Company-scoped uploads (if company feature enabled)\n * - Image compression\n * - Multiple storage providers\n * - File validation (size, type)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class UploadService extends BaseApiService {\n constructor() {\n super('storage');\n }\n\n /**\n * Upload single file\n * POST /storage/upload/single-file?storageConfigId=x&folderPath=y\n *\n * @param file - File to upload\n * @param options - Upload options (storage config, compression, etc.)\n */\n uploadSingleFile(\n file: File,\n options?: IUploadOptionsDto\n ): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n\n const queryParams = this.buildQueryParams(options);\n const url = queryParams\n ? `${this.getUrl('upload/single-file')}?${queryParams}`\n : this.getUrl('upload/single-file');\n\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(url, formData);\n }\n\n /**\n * Upload multiple files (max 50)\n * POST /storage/upload/multiple-file?storageConfigId=x&folderPath=y\n *\n * @param files - Array of files to upload\n * @param options - Upload options\n */\n uploadMultipleFiles(\n files: File[],\n options?: IUploadOptionsDto\n ): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n\n const queryParams = this.buildQueryParams(options);\n const url = queryParams\n ? `${this.getUrl('upload/multiple-file')}?${queryParams}`\n : this.getUrl('upload/multiple-file');\n\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(url, formData);\n }\n\n /**\n * Build query string from upload options\n */\n private buildQueryParams(options?: IUploadOptionsDto): string {\n if (!options) return '';\n const params = new URLSearchParams();\n if (options.storageConfigId) params.append('storageConfigId', options.storageConfigId);\n if (options.folderPath) params.append('folderPath', options.folderPath);\n if (options.maxWidth) params.append('maxWidth', options.maxWidth.toString());\n if (options.maxHeight) params.append('maxHeight', options.maxHeight.toString());\n if (options.quality) params.append('quality', options.quality.toString());\n if (options.format) params.append('format', options.format);\n if (options.compress !== undefined) params.append('compress', options.compress.toString());\n return params.toString();\n }\n\n /**\n * Delete single file\n * POST /storage/upload/delete-single-file\n *\n * @param key - File key/path to delete\n * @param storageConfigId - Optional storage config ID (uses default if not provided)\n */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n { key, ...(storageConfigId && { storageConfigId }) }\n );\n }\n\n /**\n * Delete multiple files\n * POST /storage/upload/delete-multiple-file\n *\n * @param keys - Array of file keys/paths to delete\n * @param storageConfigId - Optional storage config ID (uses default if not provided)\n */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n { keys, ...(storageConfigId && { storageConfigId }) }\n );\n }\n\n /**\n * Get file download URL\n * GET /storage/upload/file/:filePath\n *\n * @param key - File key/path\n * @returns URL for direct file access\n */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n}\n","import { Routes } from '@angular/router';\n\n/**\n * Storage Module Routes\n * All storage management routes: configs, files, folders\n *\n * All routes are protected by permission guards to prevent direct URL access.\n */\nexport const STORAGE_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-container/storage-container.component').then(\n (m) => m.StorageContainerComponent,\n ),\n children: [\n // File Manager Routes\n {\n path: 'files',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-list.component').then(\n (m) => m.FileManagerListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n ],\n },\n\n // Folder Routes\n {\n path: 'folders',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/folder/folder-list.component').then(\n (m) => m.FolderListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n ],\n },\n\n // Storage Config Routes\n {\n path: 'configs',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-list.component').then(\n (m) => m.StorageConfigListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n ],\n },\n\n // Default redirect to files\n {\n path: '',\n redirectTo: 'files',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n */\n@Component({\n selector: 'lib-storage-container',\n standalone: true,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n template: `\n <div class=\"storage-page p-4\">\n <div class=\"storage-header mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">Storage</h1>\n <p class=\"text-gray-500 mt-1\">Manage files, folders, and storage configurations</p>\n </div>\n\n <div class=\"storage-tabs flex gap-1 mb-4 border-b border-gray-200\">\n @for (tab of tabs; track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"active\"\n class=\"tab-link flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <div class=\"storage-content\">\n <router-outlet />\n </div>\n </div>\n `,\n styles: [\n `\n .tab-link {\n color: var(--text-color-secondary, #6b7280);\n text-decoration: none;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n }\n .tab-link.active {\n color: var(--primary-color, #3b82f6);\n border-bottom-color: var(--primary-color, #3b82f6);\n background-color: var(--surface-ground, #f9fafb);\n }\n .tab-link:hover:not(.active) {\n background-color: var(--surface-hover, #f3f4f6);\n }\n `,\n ],\n})\nexport class StorageContainerComponent {\n /** All available tabs */\n readonly tabs: ITab[] = [\n {\n id: 'files',\n label: 'Files',\n icon: 'pi pi-file',\n route: 'files',\n },\n {\n id: 'folders',\n label: 'Folders',\n icon: 'pi pi-folder',\n route: 'folders',\n },\n {\n id: 'configs',\n label: 'Configurations',\n icon: 'pi pi-cog',\n route: 'configs',\n },\n ];\n}\n","// =============================================================================\n// @flusys/ng-storage - Storage Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport { FileManagerApiService } from './services/file-manager-api.service';\nexport { FolderApiService } from './services/folder-api.service';\nexport { StorageConfigApiService } from './services/storage-config-api.service';\nexport { UploadService } from './services/upload.service';\n\n// Routes\nexport { STORAGE_ROUTES } from './routes/storage.routes';\n\n// Components\nexport { StorageContainerComponent } from './pages/storage-container/storage-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage.mjs","sources":["../../../projects/ng-storage/enums/file-location.enum.ts","../../../projects/ng-storage/services/file-manager-api.service.ts","../../../projects/ng-storage/services/upload.service.ts","../../../projects/ng-storage/adapters/profile-upload-provider.adapter.ts","../../../projects/ng-storage/providers/storage-providers.ts","../../../projects/ng-storage/services/folder-api.service.ts","../../../projects/ng-storage/services/storage-config-api.service.ts","../../../projects/ng-storage/routes/storage.routes.ts","../../../projects/ng-storage/pages/storage-container/storage-container.component.ts","../../../projects/ng-storage/public-api.ts","../../../projects/ng-storage/flusys-ng-storage.ts"],"sourcesContent":["/**\n * File Location Enum\n * Storage provider types (matches backend FileLocationEnum)\n */\nexport enum FileLocationEnum {\n LOCAL = 'local',\n AWS = 'aws',\n AZURE = 'azure',\n SFTP = 'sftp',\n}\n\n/**\n * Image Format Enum\n * Supported image output formats for compression\n */\nexport enum ImageFormat {\n ORIGINAL = 'original',\n JPEG = 'jpeg',\n PNG = 'png',\n WEBP = 'webp',\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ApiResourceService, ISingleResponse, IListResponse } from '@flusys/ng-shared';\nimport {\n IFileManager,\n ICreateFileManagerDto,\n IUpdateFileManagerDto,\n IGetFilesRequestDto,\n IFilesResponseDto,\n} from '../interfaces/file-manager.interface';\n\n/**\n * File Manager API Service\n * Handles file metadata CRUD operations\n * Endpoint: POST /storage/file-manager/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FileManagerApiService extends ApiResourceService<\n IUpdateFileManagerDto,\n IFileManager\n> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/file-manager', http);\n }\n\n /**\n * Get multiple files with valid URLs\n * POST /storage/file-manager/get-files\n * Regenerates presigned URLs if expired\n */\n getFiles(\n fileIds: string[]\n ): Observable<ISingleResponse<IFilesResponseDto[]>> {\n const requests: IGetFilesRequestDto[] = fileIds.map((id) => ({ id }));\n return this.http.post<ISingleResponse<IFilesResponseDto[]>>(\n `${this.baseUrl}/get-files`,\n requests\n );\n }\n\n /**\n * Get files by folder\n * POST /storage/file-manager/get-all\n * Filtered by folder ID and company (if enabled)\n */\n getFilesByFolder(\n folderId: number | null,\n page: number = 1,\n limit: number = 50\n ): Observable<IListResponse<IFileManager>> {\n return this.getAll('', {\n filter: folderId ? { folderId } : {},\n pagination: { currentPage: page - 1, pageSize: limit },\n select: [],\n sort: {},\n });\n }\n\n /**\n * Get private files (requires permission)\n * POST /storage/file-manager/get-all\n * Filtered by isPrivate and user permission 'storage.file.viewPrivate'\n */\n getPrivateFiles(\n page: number = 1,\n limit: number = 50\n ): Observable<IListResponse<IFileManager>> {\n return this.getAll('', {\n filter: { isPrivate: true },\n pagination: { currentPage: page - 1, pageSize: limit },\n select: [],\n sort: {},\n });\n }\n\n /**\n * Create new file manager record\n * POST /storage/file-manager/insert\n */\n create(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>> {\n return this.http.post<ISingleResponse<IFileManager>>(\n `${this.baseUrl}/insert`,\n dto\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, switchMap } from 'rxjs';\nimport { BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport {\n IUploadOptionsDto,\n IUploadedFileInfo,\n} from '../interfaces/upload.interface';\nimport { FileManagerApiService } from './file-manager-api.service';\nimport { IFileManager } from '../interfaces/file-manager.interface';\nimport { FileLocationEnum } from '../enums/file-location.enum';\n\n/**\n * Upload Service\n * Handles file upload/delete operations\n * Endpoint: POST /storage/upload/*\n *\n * Features:\n * - Company-scoped uploads (if company feature enabled)\n * - Image compression\n * - Multiple storage providers\n * - File validation (size, type)\n * - Default storage config from environment (services.storage.defaultStorageConfigId)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class UploadService extends BaseApiService {\n private readonly fileManagerApi = inject(FileManagerApiService);\n\n constructor() {\n super('storage');\n }\n\n /**\n * Get default storage config ID from app config\n * Used when no storageConfigId is provided in upload options\n */\n getDefaultConfigId(): string | undefined {\n return getDefaultStorageConfigId(this.appConfig);\n }\n\n /**\n * Upload single file\n * POST /storage/upload/single-file?storageConfigId=x&folderPath=y\n *\n * @param file - File to upload\n * @param options - Upload options (storage config, compression, etc.)\n */\n uploadSingleFile(\n file: File,\n options?: IUploadOptionsDto\n ): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n\n const queryParams = this.buildQueryParams(options);\n const url = queryParams\n ? `${this.getUrl('upload/single-file')}?${queryParams}`\n : this.getUrl('upload/single-file');\n\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(url, formData);\n }\n\n /**\n * Upload multiple files (max 50)\n * POST /storage/upload/multiple-file?storageConfigId=x&folderPath=y\n *\n * @param files - Array of files to upload\n * @param options - Upload options\n */\n uploadMultipleFiles(\n files: File[],\n options?: IUploadOptionsDto\n ): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n\n const queryParams = this.buildQueryParams(options);\n const url = queryParams\n ? `${this.getUrl('upload/multiple-file')}?${queryParams}`\n : this.getUrl('upload/multiple-file');\n\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(url, formData);\n }\n\n /**\n * Build query string from upload options\n * Uses default storageConfigId from app config if not provided in options\n */\n private buildQueryParams(options?: IUploadOptionsDto): string {\n const params = new URLSearchParams();\n\n // Use provided storageConfigId or fall back to default from config\n const storageConfigId = options?.storageConfigId ?? this.getDefaultConfigId();\n if (storageConfigId) params.append('storageConfigId', storageConfigId);\n\n if (options?.folderPath) params.append('folderPath', options.folderPath);\n if (options?.maxWidth) params.append('maxWidth', options.maxWidth.toString());\n if (options?.maxHeight) params.append('maxHeight', options.maxHeight.toString());\n if (options?.quality) params.append('quality', options.quality.toString());\n if (options?.format) params.append('format', options.format);\n if (options?.compress !== undefined) params.append('compress', options.compress.toString());\n\n return params.toString();\n }\n\n /**\n * Delete single file\n * POST /storage/upload/delete-single-file\n *\n * @param key - File key/path to delete\n * @param storageConfigId - Optional storage config ID (uses default from config if not provided)\n */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n const configId = storageConfigId ?? this.getDefaultConfigId();\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n { key, ...(configId && { storageConfigId: configId }) }\n );\n }\n\n /**\n * Delete multiple files\n * POST /storage/upload/delete-multiple-file\n *\n * @param keys - Array of file keys/paths to delete\n * @param storageConfigId - Optional storage config ID (uses default from config if not provided)\n */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n const configId = storageConfigId ?? this.getDefaultConfigId();\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n { keys, ...(configId && { storageConfigId: configId }) }\n );\n }\n\n /**\n * Get file download URL\n * GET /storage/upload/file/:filePath\n *\n * @param key - File key/path\n * @returns URL for direct file access\n */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n\n /**\n * Upload file and register in file manager\n * Returns file manager ID (UUID) for storing in references like profilePictureId\n *\n * @param file - File to upload\n * @param options - Upload options (storage config, compression, etc.)\n * @returns Observable with file manager record (id is the UUID to store)\n */\n uploadAndRegister(\n file: File,\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string }\n ): Observable<ISingleResponse<IFileManager>> {\n return this.uploadSingleFile(file, options).pipe(\n switchMap((uploadResponse) => {\n if (!uploadResponse.success || !uploadResponse.data) {\n throw new Error(uploadResponse.message || 'Upload failed');\n }\n\n const uploadedFile = uploadResponse.data;\n const storageConfigId = options?.storageConfigId ?? this.getDefaultConfigId();\n\n // Create file manager record\n return this.fileManagerApi.create({\n name: uploadedFile.name,\n key: uploadedFile.key,\n size: String(uploadedFile.size),\n contentType: uploadedFile.contentType,\n isPrivate: options?.isPrivate ?? false,\n folderId: options?.folderId,\n storageConfigId,\n location: FileLocationEnum.LOCAL,\n });\n })\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n IProfileUploadProvider,\n IProfileUploadOptions,\n IProfileUploadResult,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { UploadService } from '../services/upload.service';\n\n/**\n * Profile Upload Provider Adapter\n *\n * Implements IProfileUploadProvider interface for ng-auth profile page.\n * Uses UploadService.uploadAndRegister() to upload files and register in file manager.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * ...provideStorageProviders(),\n * ]\n */\n@Injectable()\nexport class ProfileUploadProviderAdapter implements IProfileUploadProvider {\n private readonly uploadService = inject(UploadService);\n\n /**\n * Upload profile picture and register in file manager\n * Returns file manager ID (UUID) for storing in user.profilePictureId\n */\n uploadProfilePicture(\n file: File,\n options?: IProfileUploadOptions\n ): Observable<ISingleResponse<IProfileUploadResult>> {\n return this.uploadService\n .uploadAndRegister(file, {\n folderPath: options?.folderPath ?? 'profile-pictures',\n compress: options?.compress ?? true,\n maxWidth: options?.maxWidth ?? 400,\n maxHeight: options?.maxHeight ?? 400,\n })\n .pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: response.data\n ? {\n id: response.data.id,\n name: response.data.name,\n key: response.data.key,\n size: parseFloat(response.data.size) * 1024, // Convert KB to bytes\n contentType: response.data.contentType,\n }\n : undefined,\n }))\n );\n }\n}\n","import { Provider } from '@angular/core';\nimport { PROFILE_UPLOAD_PROVIDER } from '@flusys/ng-shared';\nimport { ProfileUploadProviderAdapter } from '../adapters/profile-upload-provider.adapter';\n\n/**\n * Provide Storage Providers\n *\n * Registers storage-related provider implementations.\n * Call this in app.config.ts to enable storage features in other packages.\n *\n * @example\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * ...provideStorageProviders(),\n * ],\n * };\n *\n * @returns Array of providers for storage functionality\n */\nexport function provideStorageProviders(): Provider[] {\n return [\n {\n provide: PROFILE_UPLOAD_PROVIDER,\n useClass: ProfileUploadProviderAdapter,\n },\n ];\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { IFolder, IUpdateFolderDto } from '../interfaces/folder.interface';\n\n/**\n * Folder API Service\n * Handles folder CRUD operations\n * Endpoint: POST /storage/folder/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FolderApiService extends ApiResourceService<IUpdateFolderDto, IFolder> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/folder', http);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { IStorageConfig, IUpdateStorageConfigDto } from '../interfaces/storage-config.interface';\n\n/**\n * Storage Config API Service\n * Handles storage configuration CRUD operations\n * Endpoint: POST /storage/storage-config/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StorageConfigApiService extends ApiResourceService<\n IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/storage-config', http);\n }\n}\n","import { Routes } from '@angular/router';\n\n/**\n * Storage Module Routes\n * All storage management routes: configs, files, folders\n *\n * All routes are protected by permission guards to prevent direct URL access.\n */\nexport const STORAGE_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-container/storage-container.component').then(\n (m) => m.StorageContainerComponent,\n ),\n children: [\n // File Manager Routes\n {\n path: 'files',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-list.component').then(\n (m) => m.FileManagerListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n ],\n },\n\n // Folder Routes\n {\n path: 'folders',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/folder/folder-list.component').then(\n (m) => m.FolderListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n ],\n },\n\n // Storage Config Routes\n {\n path: 'configs',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-list.component').then(\n (m) => m.StorageConfigListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n ],\n },\n\n // Default redirect to files\n {\n path: '',\n redirectTo: 'files',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n */\n@Component({\n selector: 'lib-storage-container',\n standalone: true,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n template: `\n <div class=\"storage-page p-4\">\n <div class=\"storage-header mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">Storage</h1>\n <p class=\"text-gray-500 mt-1\">Manage files, folders, and storage configurations</p>\n </div>\n\n <div class=\"storage-tabs flex gap-1 mb-4 border-b border-gray-200\">\n @for (tab of tabs; track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"active\"\n class=\"tab-link flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <div class=\"storage-content\">\n <router-outlet />\n </div>\n </div>\n `,\n styles: [\n `\n .tab-link {\n color: var(--text-color-secondary, #6b7280);\n text-decoration: none;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n }\n .tab-link.active {\n color: var(--primary-color, #3b82f6);\n border-bottom-color: var(--primary-color, #3b82f6);\n background-color: var(--surface-ground, #f9fafb);\n }\n .tab-link:hover:not(.active) {\n background-color: var(--surface-hover, #f3f4f6);\n }\n `,\n ],\n})\nexport class StorageContainerComponent {\n /** All available tabs */\n readonly tabs: ITab[] = [\n {\n id: 'files',\n label: 'Files',\n icon: 'pi pi-file',\n route: 'files',\n },\n {\n id: 'folders',\n label: 'Folders',\n icon: 'pi pi-folder',\n route: 'folders',\n },\n {\n id: 'configs',\n label: 'Configurations',\n icon: 'pi pi-cog',\n route: 'configs',\n },\n ];\n}\n","// =============================================================================\n// @flusys/ng-storage - Storage Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Adapters\nexport { ProfileUploadProviderAdapter } from './adapters/profile-upload-provider.adapter';\n\n// Providers\nexport { provideStorageProviders } from './providers/storage-providers';\n\n// Services\nexport { FileManagerApiService } from './services/file-manager-api.service';\nexport { FolderApiService } from './services/folder-api.service';\nexport { StorageConfigApiService } from './services/storage-config-api.service';\nexport { UploadService } from './services/upload.service';\n\n// Routes\nexport { STORAGE_ROUTES } from './routes/storage.routes';\n\n// Components\nexport { StorageContainerComponent } from './pages/storage-container/storage-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@flusys/ng-storage",
3
- "version": "1.0.0-beta",
3
+ "version": "1.1.0-beta",
4
4
  "description": "File storage module for FLUSYS Angular applications",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
7
  "@angular/common": "^21.0.0",
8
8
  "@angular/core": "^21.0.0",
9
- "@flusys/ng-core": "^1.0.0-beta",
10
- "@flusys/ng-layout": "^1.0.0-beta",
11
- "@flusys/ng-shared": "^1.0.0-beta",
9
+ "@flusys/ng-core": "^1.1.0-beta",
10
+ "@flusys/ng-layout": "^1.1.0-beta",
11
+ "@flusys/ng-shared": "^1.1.0-beta",
12
12
  "@primeuix/themes": "^1.0.0",
13
13
  "primeicons": "^7.0.0",
14
14
  "primeng": "^21.0.0"