@emailmaker/filemanager 0.10.46 → 0.10.48

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 (36) hide show
  1. package/components/FileContent/FileContent.d.ts +1 -0
  2. package/components/FileManagerApp/ActionsHeader.d.ts +4 -0
  3. package/components/FileModals/FileModals.d.ts +4 -1
  4. package/components/ImageIcons/IconsControls.d.ts +26 -0
  5. package/components/ImageIcons/IconsGrid.d.ts +26 -0
  6. package/components/ImageIcons/IconsSearchForm.d.ts +13 -0
  7. package/components/ImageIcons/IconsTab.d.ts +4 -0
  8. package/components/ImageIcons/useIconsCopyToFolder.d.ts +28 -0
  9. package/components/ImageIcons/useStreamlineApi.d.ts +47 -0
  10. package/components/index.d.ts +1 -0
  11. package/constants/index.d.ts +2 -0
  12. package/file-manager.css +495 -21
  13. package/file-manager.esm.js +9 -9
  14. package/file-manager.esm.js.map +1 -1
  15. package/file-manager.js +1 -1
  16. package/file-manager.js.LICENSE.txt +2 -0
  17. package/hooks/core/files/actions/useFilesCopy.d.ts +1 -0
  18. package/hooks/core/files/useFilesAPI.d.ts +2 -1
  19. package/hooks/core/files/useFilesSelection.d.ts +1 -0
  20. package/hooks/core/types.d.ts +6 -1
  21. package/hooks/core/useFiles.d.ts +1 -0
  22. package/hooks/useCustomIcons.d.ts +1 -0
  23. package/hooks/useFileActions.d.ts +6 -1
  24. package/hooks/useFolderSelectionMenu.d.ts +26 -0
  25. package/notification.d.ts +27 -8
  26. package/package.json +1 -1
  27. package/types.d.ts +80 -7
  28. package/utils/errorMessages.d.ts +39 -2
  29. package/utils/fileFormatUtils.d.ts +39 -0
  30. package/utils/fileValidation.d.ts +23 -0
  31. package/utils/imageCompression.d.ts +1 -0
  32. package/utils/jsonDataProvider.d.ts +8 -0
  33. package/utils/mimeUtils.d.ts +12 -0
  34. package/utils/nameNormalization.d.ts +23 -0
  35. package/utils/svgParseUtils.d.ts +47 -0
  36. package/utils/svgToPng.d.ts +11 -0
@@ -143,6 +143,8 @@ and limitations under the License.
143
143
 
144
144
  /**![info-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0zMiA2NjRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQ1NmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MnptLTMyLTM0NGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnoiIC8+PC9zdmc+) */
145
145
 
146
+ /**![like](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTg4NS45IDUzMy43YzE2LjgtMjIuMiAyNi4xLTQ5LjQgMjYuMS03Ny43IDAtNDQuOS0yNS4xLTg3LjQtNjUuNS0xMTEuMWE2Ny42NyA2Ny42NyAwIDAwLTM0LjMtOS4zSDU3Mi40bDYtMTIyLjljMS40LTI5LjctOS4xLTU3LjktMjkuNS03OS40QTEwNi42MiAxMDYuNjIgMCAwMDQ3MSA5OS45Yy01MiAwLTk4IDM1LTExMS44IDg1LjFsLTg1LjkgMzExSDE0NGMtMTcuNyAwLTMyIDE0LjMtMzIgMzJ2MzY0YzAgMTcuNyAxNC4zIDMyIDMyIDMyaDYwMS4zYzkuMiAwIDE4LjItMS44IDI2LjUtNS40IDQ3LjYtMjAuMyA3OC4zLTY2LjggNzguMy0xMTguNCAwLTEyLjYtMS44LTI1LTUuNC0zNyAxNi44LTIyLjIgMjYuMS00OS40IDI2LjEtNzcuNyAwLTEyLjYtMS44LTI1LTUuNC0zNyAxNi44LTIyLjIgMjYuMS00OS40IDI2LjEtNzcuNy0uMi0xMi42LTItMjUuMS01LjYtMzcuMXpNMTg0IDg1MlY1NjhoODF2Mjg0aC04MXptNjM2LjQtMzUzbC0yMS45IDE5IDEzLjkgMjUuNGE1Ni4yIDU2LjIgMCAwMTYuOSAyNy4zYzAgMTYuNS03LjIgMzIuMi0xOS42IDQzbC0yMS45IDE5IDEzLjkgMjUuNGE1Ni4yIDU2LjIgMCAwMTYuOSAyNy4zYzAgMTYuNS03LjIgMzIuMi0xOS42IDQzbC0yMS45IDE5IDEzLjkgMjUuNGE1Ni4yIDU2LjIgMCAwMTYuOSAyNy4zYzAgMjIuNC0xMy4yIDQyLjYtMzMuNiA1MS44SDMyOVY1NjQuOGw5OS41LTM2MC41YTQ0LjEgNDQuMSAwIDAxNDIuMi0zMi4zYzcuNiAwIDE1LjEgMi4yIDIxLjEgNi43IDkuOSA3LjQgMTUuMiAxOC42IDE0LjYgMzAuNWwtOS42IDE5OC40aDMxNC40QzgyOSA0MTguNSA4NDAgNDM2LjkgODQwIDQ1NmMwIDE2LjUtNy4yIDMyLjEtMTkuNiA0M3oiIC8+PC9zdmc+) */
147
+
146
148
  /**![link](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTU3NCA2NjUuNGE4LjAzIDguMDMgMCAwMC0xMS4zIDBMNDQ2LjUgNzgxLjZjLTUzLjggNTMuOC0xNDQuNiA1OS41LTIwNCAwLTU5LjUtNTkuNS01My44LTE1MC4yIDAtMjA0bDExNi4yLTExNi4yYzMuMS0zLjEgMy4xLTguMiAwLTExLjNsLTM5LjgtMzkuOGE4LjAzIDguMDMgMCAwMC0xMS4zIDBMMTkxLjQgNTI2LjVjLTg0LjYgODQuNi04NC42IDIyMS41IDAgMzA2czIyMS41IDg0LjYgMzA2IDBsMTE2LjItMTE2LjJjMy4xLTMuMSAzLjEtOC4yIDAtMTEuM0w1NzQgNjY1LjR6bTI1OC42LTQ3NGMtODQuNi04NC42LTIyMS41LTg0LjYtMzA2IDBMNDEwLjMgMzA3LjZhOC4wMyA4LjAzIDAgMDAwIDExLjNsMzkuNyAzOS43YzMuMSAzLjEgOC4yIDMuMSAxMS4zIDBsMTE2LjItMTE2LjJjNTMuOC01My44IDE0NC42LTU5LjUgMjA0IDAgNTkuNSA1OS41IDUzLjggMTUwLjIgMCAyMDRMNjY1LjMgNTYyLjZhOC4wMyA4LjAzIDAgMDAwIDExLjNsMzkuOCAzOS44YzMuMSAzLjEgOC4yIDMuMSAxMS4zIDBsMTE2LjItMTE2LjJjODQuNS04NC42IDg0LjUtMjIxLjUgMC0zMDYuMXpNNjEwLjEgMzcyLjNhOC4wMyA4LjAzIDAgMDAtMTEuMyAwTDM3Mi4zIDU5OC43YTguMDMgOC4wMyAwIDAwMCAxMS4zbDM5LjYgMzkuNmMzLjEgMy4xIDguMiAzLjEgMTEuMyAwbDIyNi40LTIyNi40YzMuMS0zLjEgMy4xLTguMiAwLTExLjNsLTM5LjUtMzkuNnoiIC8+PC9zdmc+) */
147
149
 
148
150
  /**![loading](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTk4OCA1NDhjLTE5LjkgMC0zNi0xNi4xLTM2LTM2IDAtNTkuNC0xMS42LTExNy0zNC42LTE3MS4zYTQ0MC40NSA0NDAuNDUgMCAwMC05NC4zLTEzOS45IDQzNy43MSA0MzcuNzEgMCAwMC0xMzkuOS05NC4zQzYyOSA4My42IDU3MS40IDcyIDUxMiA3MmMtMTkuOSAwLTM2LTE2LjEtMzYtMzZzMTYuMS0zNiAzNi0zNmM2OS4xIDAgMTM2LjIgMTMuNSAxOTkuMyA0MC4zQzc3Mi4zIDY2IDgyNyAxMDMgODc0IDE1MGM0NyA0NyA4My45IDEwMS44IDEwOS43IDE2Mi43IDI2LjcgNjMuMSA0MC4yIDEzMC4yIDQwLjIgMTk5LjMuMSAxOS45LTE2IDM2LTM1LjkgMzZ6IiAvPjwvc3ZnPg==) */
@@ -3,6 +3,7 @@ export interface CopyItemsParams {
3
3
  items: Array<{
4
4
  id: string;
5
5
  isFolder?: boolean;
6
+ newName?: string;
6
7
  }>;
7
8
  targetFolderId: string;
8
9
  getItemNameById: (id?: string | null) => string | undefined;
@@ -8,7 +8,7 @@ export interface UseFilesAPIActions {
8
8
  onStartBatch?: (files: globalThis.File[]) => void;
9
9
  onProgress: (fileName: string, progress: number) => void;
10
10
  onComplete: (fileName: string) => void;
11
- onError: (fileName: string, error: string) => void;
11
+ onError: (fileName: string, error: string, index?: number) => void;
12
12
  onBatchComplete?: (result: {
13
13
  files: globalThis.File[];
14
14
  successes: string[];
@@ -20,6 +20,7 @@ export interface UseFilesAPIActions {
20
20
  id?: string;
21
21
  name?: string;
22
22
  folderId?: string | null;
23
+ size?: number;
23
24
  }>;
24
25
  }) => void;
25
26
  }) => Promise<void>;
@@ -6,6 +6,7 @@ export interface UseFilesSelectionActions {
6
6
  metaKey?: boolean;
7
7
  ctrlKey?: boolean;
8
8
  shiftKey?: boolean;
9
+ forceToggle?: boolean;
9
10
  }) => void;
10
11
  }
11
12
  export declare const useFilesSelection: () => {
@@ -78,7 +78,12 @@ export interface FileManagerActions {
78
78
  generateMenuItems: () => MenuItem[];
79
79
  fetchFiles: (params?: FilesQueryParams) => Promise<void>;
80
80
  handleDeleteFile: (fileId: string) => Promise<void>;
81
- toggleFileSelection: (fileId: string) => void;
81
+ toggleFileSelection: (fileId: string, opts?: {
82
+ metaKey?: boolean;
83
+ ctrlKey?: boolean;
84
+ shiftKey?: boolean;
85
+ forceToggle?: boolean;
86
+ }) => void;
82
87
  handleItemClick: (record: File) => void;
83
88
  handleAddFile: () => Promise<void>;
84
89
  handleDroppedFiles: (droppedFiles: globalThis.File[]) => Promise<void>;
@@ -29,6 +29,7 @@ export interface UseFilesActions {
29
29
  id?: string;
30
30
  name?: string;
31
31
  folderId?: string | null;
32
+ size?: number;
32
33
  }>;
33
34
  }) => void;
34
35
  }) => Promise<void>;
@@ -29,5 +29,6 @@ export declare const useCustomIcons: () => {
29
29
  DarkModeIcon: (props?: IconProps) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
30
30
  AiIcon_2: (props?: IconProps) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
31
31
  NoFilesIcon: (props?: IconProps) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
32
+ ThumbsUpIcon: (props?: IconProps) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
32
33
  getCustomIcon: (iconName: keyof NonNullable<import("../types").CustomIcons | undefined>, defaultIcon: React.ComponentType<any>, props?: IconProps) => React.ReactElement;
33
34
  };
@@ -3,7 +3,12 @@ interface UseFileActionsProps {
3
3
  files: AppFile[];
4
4
  selectedFiles: Set<string>;
5
5
  currentMenuFile: string;
6
- toggleFileSelection: (fileId: string) => void;
6
+ toggleFileSelection: (fileId: string, opts?: {
7
+ metaKey?: boolean;
8
+ ctrlKey?: boolean;
9
+ shiftKey?: boolean;
10
+ forceToggle?: boolean;
11
+ }) => void;
7
12
  showRenameModal: (fileId: string) => void;
8
13
  showMoveModal: () => void;
9
14
  showCopyModal: () => void;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import type { FormInstance } from 'antd/es/form';
3
+ import type { Folder, MenuItem } from '../types';
4
+ interface UseFolderSelectionMenuParams {
5
+ folders: Folder[];
6
+ selectedFolder: string | null;
7
+ EmptyFolderIcon: React.ComponentType<{
8
+ style?: React.CSSProperties;
9
+ }>;
10
+ handleCreateFolderModalOk: (currentForm?: FormInstance) => Promise<Folder | {
11
+ id?: string;
12
+ } | undefined>;
13
+ setIsLoading: (value: boolean) => void;
14
+ t: (key: string) => string;
15
+ }
16
+ export declare function useFolderSelectionMenu({ folders, selectedFolder, EmptyFolderIcon, handleCreateFolderModalOk, setIsLoading, t, }: UseFolderSelectionMenuParams): {
17
+ activeFormField: string;
18
+ setActiveFormField: React.Dispatch<React.SetStateAction<string>>;
19
+ generateMenuItemsFromFolders: (params: {
20
+ targetForm: FormInstance;
21
+ onTreeSelect: (selectedKeys: React.Key[]) => Promise<void>;
22
+ onComplete: (targetFolder?: string) => void;
23
+ actionButtonText: string;
24
+ }) => MenuItem[];
25
+ };
26
+ export {};
package/notification.d.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  interface FileManageErrorInfo {
2
- message?: string;
2
+ message?: string;
3
3
  code?: FileManagerErrorCode;
4
4
  status?: number;
5
- raw?: any;
5
+ raw?: any;
6
6
  stack?: string;
7
7
  }
8
8
 
9
-
10
9
  /**
11
10
  * Error codes for FileManager API operations.
12
11
  */
@@ -182,6 +181,7 @@ declare namespace Notify {
182
181
  export interface OperationSuccessPayload extends ItemContextPayload {
183
182
  successCount: number;
184
183
  totalCount: number;
184
+ eventSource?: UploadEventSource;
185
185
  }
186
186
 
187
187
  /**
@@ -206,12 +206,13 @@ declare namespace Notify {
206
206
  * Used to differentiate between soft delete (trash) and hard delete operations.
207
207
  */
208
208
  isTrashMove?: boolean;
209
+ eventSource?: UploadEventSource;
209
210
  }
210
211
 
211
212
  /**
212
213
  * Details of a single item in batch operation results.
213
214
  * Used in the `detailed` array for batch operations (deleteItems, moveItems, copyItems, uploadFiles).
214
- *
215
+ *
215
216
  * @template T - Type of successful operation result data
216
217
  */
217
218
  export interface BatchOperationDetail<T = unknown> {
@@ -230,7 +231,7 @@ declare namespace Notify {
230
231
  /**
231
232
  * Result of a batch operation with support for detailed results.
232
233
  * Unified type for all batch operations in the file manager.
233
- *
234
+ *
234
235
  * @template T - Type of successful operation result data
235
236
  */
236
237
  export interface BatchOperationResult<T = unknown> {
@@ -274,11 +275,17 @@ declare namespace Notify {
274
275
  error: FileManageErrorInfo;
275
276
  }
276
277
 
278
+ /**
279
+ * Source of the upload event: 'upload' for file picker/drag-drop, 'uploadByUrl' for URL upload.
280
+ */
281
+ export type UploadEventSource = 'upload' | 'uploadByUrl';
282
+
277
283
  /**
278
284
  * Payload for file upload operations.
279
285
  */
280
286
  export interface FileUploadPayload extends SingleItemPayload {
281
287
  uploadId?: string;
288
+ eventSource?: UploadEventSource;
282
289
  }
283
290
 
284
291
  /**
@@ -327,6 +334,7 @@ declare namespace Notify {
327
334
  url?: string | null;
328
335
  folderId?: string | null;
329
336
  folderName?: string | null;
337
+ eventSource?: UploadEventSource;
330
338
  }
331
339
 
332
340
  /**
@@ -376,7 +384,7 @@ declare namespace Notify {
376
384
  /**
377
385
  * Base type for error notification events.
378
386
  * Includes innerException field for error details.
379
- *
387
+ *
380
388
  * @template TId - Notification event ID type
381
389
  * @template TData - Payload data type
382
390
  */
@@ -403,7 +411,7 @@ declare namespace Notify {
403
411
  /**
404
412
  * Base type for success, warning, and info notification events.
405
413
  * Does not include innerException field.
406
- *
414
+ *
407
415
  * @template TId - Notification event ID type
408
416
  * @template TData - Payload data type
409
417
  */
@@ -475,7 +483,6 @@ declare namespace Notify {
475
483
  * Extends ItemErrorMap for single item operations and BatchErrorMap for batch operations.
476
484
  */
477
485
  export interface ErrorMap extends ItemErrorMap, BatchErrorMap {
478
-
479
486
  FILE_DOWNLOAD_FAILED: ImageFilePayload;
480
487
  IMAGE_DOWNLOAD_FAILED: ImageFilePayload;
481
488
  IMAGE_SAVE_FAILED: ImageFilePayload;
@@ -509,11 +516,17 @@ declare namespace Notify {
509
516
  FILES_COPY_DIRECTORY_NOT_SELECTED: never;
510
517
 
511
518
  FOLDERS_FETCH_FAILED: FolderOperationPayload;
519
+ FOLDER_ALREADY_EXISTS: FolderOperationPayload;
520
+ FOLDER_ALREADY_EXISTS_COPY: FolderOperationPayload & { targetFolderId?: string };
521
+ FOLDER_ALREADY_EXISTS_MOVE: FolderOperationPayload & { targetFolderId?: string };
512
522
  FOLDER_CREATE_PROVIDER_NOT_CONFIGURED: FolderOperationPayload;
513
523
  FOLDER_CREATE_FAILED: FolderOperationPayload;
514
524
  FOLDER_CHILDREN_COUNT_FAILED: FolderOperationPayload;
515
525
  FOLDER_CHILDREN_FETCH_FAILED: FolderOperationPayload;
516
526
  FILE_URL_VALIDATION_FAILED: FileUrlValidationErrorPayload;
527
+
528
+ TRASH_CLEAR_FAILED: OperationErrorPayload;
529
+ TRASH_CLEAR_ERROR: never;
517
530
  }
518
531
 
519
532
  /**
@@ -544,6 +557,10 @@ declare namespace Notify {
544
557
  FOLDER_CREATE_SUCCESS: FolderOperationPayload;
545
558
 
546
559
  FILE_UPLOAD_ITEM_SUCCESS: FileUploadPayload;
560
+
561
+ TRASH_CLEARED_SUCCESS: never;
562
+
563
+ FOLDER_NOT_FOUND_NAVIGATE: never;
547
564
  }
548
565
 
549
566
  /**
@@ -564,6 +581,8 @@ declare namespace Notify {
564
581
  export interface WarningMap {
565
582
  FILES_UPLOAD_UNSUPPORTED_TYPE: UnsupportedFileTypePayload;
566
583
  FOLDER_OPERATION_VALIDATION_FAILED: FolderOperationPayload;
584
+
585
+ TRASH_CLEARED_PARTIAL: OperationErrorPayload;
567
586
  }
568
587
 
569
588
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emailmaker/filemanager",
3
- "version": "0.10.46",
3
+ "version": "0.10.48",
4
4
  "main": "./file-manager.js",
5
5
  "module": "./file-manager.esm.js",
6
6
  "types": "./index.d.ts",
package/types.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import React, { ReactNode, RefObject } from 'react';
2
2
  import { FormInstance } from 'antd/es/form';
3
- import { MY_FILES, GIF, STOCK_IMAGES, AI, EDITOR, IMAGE_EXTENSIONS } from './constants';
3
+ import { MY_FILES, GIF, STOCK_IMAGES, ICONS, AI, EDITOR, IMAGE_EXTENSIONS } from './constants';
4
4
  import type { InputRef } from 'antd';
5
- import type { FileManageErrorInfo, Notify, NotifyEvent } from 'notification';
6
- export * from 'notification';
5
+ import type { FileManageErrorInfo, Notify, NotifyEvent } from './notification';
6
+ export * from './notification';
7
7
  export interface Folder {
8
8
  id: string;
9
9
  name: string;
@@ -112,6 +112,7 @@ export interface CustomIcons {
112
112
  darkMode?: React.ComponentType<IconProps>;
113
113
  aiIcon_2?: React.ComponentType<IconProps>;
114
114
  noFiles?: React.ComponentType<IconProps>;
115
+ thumbsUp?: React.ComponentType<IconProps>;
115
116
  }
116
117
  type MayBePromise<T> = T | Promise<T>;
117
118
  export type NotifyListener<T> = (value: T) => MayBePromise<void | false | (NotifyEvent & Notify)>;
@@ -137,7 +138,7 @@ export interface FileManagerOptions {
137
138
  id: string;
138
139
  folderId: string | undefined;
139
140
  name: string;
140
- }) => void;
141
+ }) => void | Promise<void>;
141
142
  config?: Config;
142
143
  customIcons?: CustomIcons;
143
144
  dragDropIcon?: string;
@@ -233,6 +234,9 @@ export interface FileManagerDataProviders {
233
234
  * в остальных случаях — Blob.
234
235
  */
235
236
  data: UploadBinary;
237
+ thumbnail?: string;
238
+ dimensions?: string;
239
+ aspectRatio?: string;
236
240
  extension?: string;
237
241
  }) => Promise<File>;
238
242
  uploadFiles?: (request: UploadFilesRequest) => Promise<BatchResult<UploadFileResultData>>;
@@ -240,18 +244,28 @@ export interface FileManagerDataProviders {
240
244
  url: string;
241
245
  folderId?: string | null;
242
246
  noFolder?: boolean;
247
+ name?: string;
243
248
  }) => Promise<File>;
244
249
  deleteItems?: (items: string[], options?: {
245
250
  permanent?: boolean;
246
251
  }) => Promise<BatchResult<unknown>>;
252
+ cleanTrash?: () => Promise<{
253
+ success: boolean;
254
+ deletedCount?: number;
255
+ }>;
247
256
  renameFile?: (fileId: string, newName: string) => Promise<File>;
248
257
  moveItems?: (targetFolderId: string, files: string[]) => Promise<BatchResult<unknown>>;
249
258
  copyItem?: (options: {
250
259
  itemId: string;
251
260
  targetFolderId: string;
252
261
  isFolder: boolean;
262
+ /** При конфликте имени в целевой папке — использовать это имя для копии */
263
+ newName?: string;
253
264
  }) => Promise<boolean>;
254
- copyItems?: (targetFolderId: string, files: string[]) => Promise<BatchResult<unknown>>;
265
+ copyItems?: (targetFolderId: string, items: Array<{
266
+ id: string;
267
+ newName?: string;
268
+ }> | string[]) => Promise<BatchResult<unknown>>;
255
269
  updateFile?: (fileId: string, updates: {
256
270
  name?: string;
257
271
  type?: string;
@@ -296,7 +310,12 @@ export interface FileManagerHookReturn {
296
310
  handleDeleteFile: (fileId: string) => Promise<void>;
297
311
  handleAddFile: () => void;
298
312
  handleFolderSelect: (folderId: string) => void;
299
- toggleFileSelection: (fileId: string) => void;
313
+ toggleFileSelection: (fileId: string, opts?: {
314
+ metaKey?: boolean;
315
+ ctrlKey?: boolean;
316
+ shiftKey?: boolean;
317
+ forceToggle?: boolean;
318
+ }) => void;
300
319
  handleBreadcrumbClick: (index: number) => void;
301
320
  handleItemClick: (record: File) => void;
302
321
  handleAddFileByUrl: (url?: string | null) => Promise<void>;
@@ -361,6 +380,10 @@ export interface Config {
361
380
  dataProcessingMode?: 'server' | 'client' | 'auto';
362
381
  enableClientSideProcessing?: boolean;
363
382
  disablePagination?: boolean;
383
+ /** При false (или при disablePagination) — пагинации нет, фронт проверяет дубликаты имён и добавляет _1 */
384
+ hasPagination?: boolean;
385
+ /** Наличие пагинации. При false — проверка дубликатов имён папок при создании и при copy/move */
386
+ paginationAvailable?: boolean;
364
387
  enableTrashFolder?: boolean;
365
388
  staticData?: {
366
389
  files?: File[];
@@ -369,6 +392,13 @@ export interface Config {
369
392
  customTheme?: CustomTheme;
370
393
  UNSPLASH_KEY?: string;
371
394
  APP_NAME_UNSPLASH?: string;
395
+ /** Ключ Streamline API (добавляется на прокси, не передаётся с клиента). */
396
+ STREAMLINE_API_KEY?: string;
397
+ /** Переопределение URL прокси Streamline (по умолчанию /streamline). Ключ добавляется на прокси. */
398
+ STREAMLINE_BASE_URL?: string;
399
+ handleTranslate?: (input: string, opts: {
400
+ locale?: string;
401
+ }) => Promise<string>;
372
402
  UNSLASH_PROXY_URL?: string;
373
403
  pushToGTM?: boolean;
374
404
  projectId?: string;
@@ -401,10 +431,53 @@ export interface Config {
401
431
  multiSelect?: boolean;
402
432
  defaultFolderName?: string;
403
433
  availableImageExtensions?: Array<(typeof IMAGE_EXTENSIONS)[number]>;
434
+ /** Настройки обработки имен файлов при загрузке */
435
+ fileNameProcessing?: {
436
+ transliterate?: boolean;
437
+ replaceSpaces?: boolean;
438
+ removeForbiddenChars?: boolean;
439
+ toLowerCase?: boolean;
440
+ };
441
+ /** Настройки обработки имен папок при создании */
442
+ folderNameProcessing?: {
443
+ transliterate?: boolean;
444
+ replaceSpaces?: boolean;
445
+ removeForbiddenChars?: boolean;
446
+ toLowerCase?: boolean;
447
+ };
404
448
  /** Разрешаем произвольные дополнительные поля */
405
449
  [key: string]: unknown;
406
450
  }
407
- export type LibraryMenuKey = typeof MY_FILES | typeof GIF | typeof STOCK_IMAGES | typeof AI | typeof EDITOR;
451
+ export type LibraryMenuKey = typeof MY_FILES | typeof GIF | typeof STOCK_IMAGES | typeof ICONS | typeof AI | typeof EDITOR;
452
+ export type StreamlineSearchItem = {
453
+ hash: string;
454
+ name: string;
455
+ imagePreviewUrl: string;
456
+ isFree: boolean;
457
+ familySlug: string;
458
+ familyName: string;
459
+ categorySlug?: string;
460
+ categoryName?: string;
461
+ subcategorySlug?: string;
462
+ subcategoryName?: string;
463
+ };
464
+ export type StreamlineSearchResponse = {
465
+ query: string;
466
+ results: StreamlineSearchItem[];
467
+ pagination: {
468
+ total: number;
469
+ hasMore: boolean;
470
+ offset: number;
471
+ nextSkip?: number;
472
+ };
473
+ };
474
+ export interface IconsTabProps {
475
+ apiKey?: string;
476
+ customRequest: (data: string) => void | Promise<void>;
477
+ query?: string;
478
+ setQuery?: (query: string) => void;
479
+ inputRef?: React.RefObject<InputRef>;
480
+ }
408
481
  export interface GifItem {
409
482
  id: string;
410
483
  title: string;
@@ -1,12 +1,49 @@
1
1
  import type { FileManageErrorInfo, FileManagerErrorCode } from 'notification';
2
2
  type TFunction = (key: string, params?: Record<string, unknown>) => string;
3
+ export interface ErrorMessageParams {
4
+ allowedChars?: string;
5
+ fileSize?: string;
6
+ maxSize?: string;
7
+ }
3
8
  /**
4
9
  * Возвращает локализованное сообщение по коду ошибки, если для него есть i18n-ключ.
5
- * Если кода нет или он не сопоставлен — вернёт undefined.
10
+ * Поддерживает параметры для шаблонов: allowedChars, fileSize, maxSize.
6
11
  */
7
- export declare const getErrorMessageFromCode: (code: FileManagerErrorCode | undefined, t: TFunction) => string | undefined;
12
+ export declare const getErrorMessageFromCode: (code: FileManagerErrorCode | undefined, t: TFunction, params?: ErrorMessageParams) => string | undefined;
13
+ /**
14
+ * Пытается определить более точный код ошибки по тексту сообщения бэкенда.
15
+ * Используется когда бэкенд возвращает ValidationError/BackendError с информативным сообщением.
16
+ */
17
+ export declare const inferErrorCodeFromMessage: (message: string | undefined) => FileManagerErrorCode | undefined;
18
+ /**
19
+ * Определяет код ошибки по тексту сообщения для контекста загрузки по URL.
20
+ * 403/forbidden при загрузке по URL = внешний ресурс недоступен (UploadUrlNotReachable).
21
+ */
22
+ export declare const inferErrorCodeFromMessageForUrlUpload: (message: string | undefined) => FileManagerErrorCode | undefined;
8
23
  /**
9
24
  * Пытается извлечь IFileManagerApiError из unknown.
10
25
  */
11
26
  export declare const asFileManagerApiError: (error: unknown) => FileManageErrorInfo;
27
+ /** Ключ для сообщения о размере файла с параметрами */
28
+ export declare const FILE_TOO_LARGE_WITH_SIZE_KEY = "File too large ({{size}}). Maximum allowed size: {{maxSize}}";
29
+ /** Ключ для превышения лимита файлов в батче (allowed, received) */
30
+ export declare const BATCH_ITEM_LIMIT_EXCEEDED_WITH_COUNT_KEY = "Maximum number of files exceeded. Allowed: {{allowed}}, received: {{received}}";
31
+ /**
32
+ * Возвращает сообщение об ошибке для отображения при загрузке.
33
+ * Поддерживает параметры для FileTooLarge (size, maxSize) и BatchItemLimitExceeded/exceeded_max_files (allowed, received).
34
+ */
35
+ export declare const getUploadErrorMessage: (error: unknown, t: TFunction, context?: {
36
+ fileSize?: number;
37
+ maxSize?: number;
38
+ }) => string;
39
+ /**
40
+ * Проверяет, что ошибка — path_folder_not_found (папка уже не существует).
41
+ * При удалении это считается успехом — цель достигнута.
42
+ */
43
+ export declare const isPathFolderNotFoundError: (error: unknown) => boolean;
44
+ /**
45
+ * Возвращает сообщение для отображения при ошибке загрузки по URL.
46
+ * Приоритет: код ошибки → понятное сообщение бэкенда → общий fallback.
47
+ */
48
+ export declare const getUploadByUrlErrorMessage: (apiError: FileManageErrorInfo | undefined, t: TFunction, params?: ErrorMessageParams) => string;
12
49
  export {};
@@ -0,0 +1,39 @@
1
+ export type ImageFormat = 'jpeg' | 'png' | 'gif' | 'webp' | 'svg';
2
+ export type PixieFormat = 'jpeg' | 'png' | 'json' | 'svg';
3
+ export interface FileFormatInfo {
4
+ extension: string;
5
+ mimeType: string;
6
+ format: ImageFormat;
7
+ pixieFormat: PixieFormat;
8
+ }
9
+ /**
10
+ * Определяет формат файла из нескольких источников с правильным приоритетом
11
+ * @param file - Объект файла с возможными полями name, extension, type
12
+ * @param fallbackType - Запасной MIME-тип если не удалось определить из файла
13
+ * @returns Информация о формате файла
14
+ */
15
+ export declare function detectFileFormat(file: {
16
+ name?: string;
17
+ extension?: string;
18
+ type?: string;
19
+ } | null, fallbackType?: string): FileFormatInfo;
20
+ /**
21
+ * Константы для сжатия изображений
22
+ */
23
+ export declare const IMAGE_COMPRESSION_DEFAULTS: {
24
+ readonly MAX_SIZE_MB: 0.5;
25
+ readonly MAX_WIDTH_OR_HEIGHT: 2000;
26
+ readonly QUALITY: 0.8;
27
+ };
28
+ /**
29
+ * Поддерживаемые форматы изображений
30
+ */
31
+ export declare const SUPPORTED_IMAGE_FORMATS: readonly ["jpg", "jpeg", "png", "gif", "webp", "svg"];
32
+ /**
33
+ * Форматы, которые не нужно сжимать
34
+ */
35
+ export declare const NON_COMPRESSIBLE_FORMATS: readonly ["gif", "svg"];
36
+ /**
37
+ * Проверяет, нужно ли сжимать файл данного формата
38
+ */
39
+ export declare function shouldCompressFormat(format: string): boolean;
@@ -32,4 +32,27 @@ export declare const validateFileUrl: (url: string) => Promise<FileValidationRes
32
32
  export declare const getFileCategory: (file: File) => string;
33
33
  export declare const formatFileSize: (bytes: number) => string;
34
34
  export declare const formatFileSizeShort: (bytes?: number) => string;
35
+ export declare const formatFileSizeDisplay: (value?: number | string) => string;
36
+ /**
37
+ * Генерирует уникальное имя файла: если name уже есть в existingNames, добавляет _1 (или _2, _3 и т.д.).
38
+ * @param name — исходное имя файла (с расширением)
39
+ * @param existingNames — массив имён файлов/папок в целевой директории
40
+ */
41
+ export declare const getUniqueFileName: (name: string, existingNames: string[]) => string;
42
+ /**
43
+ * Кодирует URL для безопасного использования в img src. Решает проблему с кириллицей и другими
44
+ * не-ASCII символами в пути (например, emcdn.ru/.../Снимок_экрана.png).
45
+ * data: и blob: URLs возвращаются без изменений.
46
+ */
47
+ export declare const encodeUrlForImageSrc: (url: string | undefined | null) => string | undefined;
48
+ /**
49
+ * @deprecated Эта функция оставлена только для обратной совместимости.
50
+ * Используйте {@link normalizeFileName} из `nameNormalization.ts` для настраиваемой нормализации имен файлов.
51
+ *
52
+ * Упрощенная санитизация имени файла:
53
+ * - Заменяет запрещенные символы на `_`
54
+ * - Заменяет пробелы на `_`
55
+ * - Удаляет множественные подчеркивания
56
+ * - Ограничивает длину до 255 символов
57
+ */
35
58
  export declare const sanitizeFileName: (fileName: string) => string;
@@ -2,5 +2,6 @@ export interface CompressImageOptions {
2
2
  maxSizeMB?: number;
3
3
  maxWidthOrHeight?: number;
4
4
  mimeType?: string;
5
+ fileName?: string;
5
6
  }
6
7
  export declare function compressImageWithLimits(file: File, options?: CompressImageOptions): Promise<File>;
@@ -37,6 +37,9 @@ export declare class JSONDataProvider implements FileManagerDataProviders {
37
37
  type: string;
38
38
  folderId?: string | null;
39
39
  data: UploadBinary;
40
+ thumbnail?: string;
41
+ dimensions?: string;
42
+ aspectRatio?: string;
40
43
  extension?: string;
41
44
  }) => Promise<File>;
42
45
  uploadFiles: (request: UploadFilesRequest) => Promise<BatchResult<UploadFileResultData>>;
@@ -44,6 +47,7 @@ export declare class JSONDataProvider implements FileManagerDataProviders {
44
47
  url: string;
45
48
  folderId?: string | null;
46
49
  noFolder?: boolean;
50
+ name?: string;
47
51
  }) => Promise<File>;
48
52
  updateFile: (fileId: string, updates: {
49
53
  name?: string;
@@ -55,6 +59,10 @@ export declare class JSONDataProvider implements FileManagerDataProviders {
55
59
  extension?: string;
56
60
  }) => Promise<File>;
57
61
  deleteFile: (fileId: string) => Promise<boolean>;
62
+ cleanTrash: () => Promise<{
63
+ success: boolean;
64
+ deletedCount?: number;
65
+ }>;
58
66
  renameFile: (fileId: string, newName: string) => Promise<File>;
59
67
  moveItem: (options: {
60
68
  itemId: string;
@@ -1,3 +1,15 @@
1
+ /**
2
+ * Нормализует MIME-тип изображения до стандартного формата
3
+ * @param mimeType - MIME-тип для нормализации
4
+ * @returns Нормализованный MIME-тип
5
+ */
6
+ export declare const normalizeImageMimeType: (mimeType: string) => string;
7
+ /**
8
+ * Извлекает MIME-тип из data URL
9
+ * @param dataUrl - Data URL строка
10
+ * @returns MIME-тип или null если не найден
11
+ */
12
+ export declare const extractMimeFromDataUrl: (dataUrl: string) => string | null;
1
13
  /**
2
14
  * Нормализует MIME тип изображения на основе данных thumbnail и типа файла
3
15
  * @param thumbnail - Данные изображения (может быть data URL)
@@ -0,0 +1,23 @@
1
+ import { Config } from '../types';
2
+ /**
3
+ * Настройки обработки имени по умолчанию
4
+ */
5
+ export interface NameProcessingOptions {
6
+ transliterate?: boolean;
7
+ replaceSpaces?: boolean;
8
+ removeForbiddenChars?: boolean;
9
+ toLowerCase?: boolean;
10
+ }
11
+ /**
12
+ * Транслитерирует кириллицу в латиницу
13
+ */
14
+ export declare function transliterateRuToEn(text: string): string;
15
+ /**
16
+ * Нормализует имя файла с учетом настроек из конфига
17
+ * Сохраняет оригинальное расширение файла
18
+ */
19
+ export declare function normalizeFileName(fileName: string, config?: Config): string;
20
+ /**
21
+ * Нормализует имя папки с учетом настроек из конфига
22
+ */
23
+ export declare function normalizeFolderName(folderName: string, config?: Config): string;