@emailmaker/filemanager 0.10.46 → 0.10.47

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 (35) 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 +466 -20
  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 +1 -0
  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 +16 -8
  26. package/package.json +1 -1
  27. package/types.d.ts +78 -7
  28. package/utils/errorMessages.d.ts +22 -2
  29. package/utils/fileFormatUtils.d.ts +39 -0
  30. package/utils/fileValidation.d.ts +22 -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/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;
@@ -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
  */
@@ -211,7 +210,7 @@ declare namespace Notify {
211
210
  /**
212
211
  * Details of a single item in batch operation results.
213
212
  * Used in the `detailed` array for batch operations (deleteItems, moveItems, copyItems, uploadFiles).
214
- *
213
+ *
215
214
  * @template T - Type of successful operation result data
216
215
  */
217
216
  export interface BatchOperationDetail<T = unknown> {
@@ -230,7 +229,7 @@ declare namespace Notify {
230
229
  /**
231
230
  * Result of a batch operation with support for detailed results.
232
231
  * Unified type for all batch operations in the file manager.
233
- *
232
+ *
234
233
  * @template T - Type of successful operation result data
235
234
  */
236
235
  export interface BatchOperationResult<T = unknown> {
@@ -376,7 +375,7 @@ declare namespace Notify {
376
375
  /**
377
376
  * Base type for error notification events.
378
377
  * Includes innerException field for error details.
379
- *
378
+ *
380
379
  * @template TId - Notification event ID type
381
380
  * @template TData - Payload data type
382
381
  */
@@ -403,7 +402,7 @@ declare namespace Notify {
403
402
  /**
404
403
  * Base type for success, warning, and info notification events.
405
404
  * Does not include innerException field.
406
- *
405
+ *
407
406
  * @template TId - Notification event ID type
408
407
  * @template TData - Payload data type
409
408
  */
@@ -475,7 +474,6 @@ declare namespace Notify {
475
474
  * Extends ItemErrorMap for single item operations and BatchErrorMap for batch operations.
476
475
  */
477
476
  export interface ErrorMap extends ItemErrorMap, BatchErrorMap {
478
-
479
477
  FILE_DOWNLOAD_FAILED: ImageFilePayload;
480
478
  IMAGE_DOWNLOAD_FAILED: ImageFilePayload;
481
479
  IMAGE_SAVE_FAILED: ImageFilePayload;
@@ -509,11 +507,17 @@ declare namespace Notify {
509
507
  FILES_COPY_DIRECTORY_NOT_SELECTED: never;
510
508
 
511
509
  FOLDERS_FETCH_FAILED: FolderOperationPayload;
510
+ FOLDER_ALREADY_EXISTS: FolderOperationPayload;
511
+ FOLDER_ALREADY_EXISTS_COPY: FolderOperationPayload & { targetFolderId?: string };
512
+ FOLDER_ALREADY_EXISTS_MOVE: FolderOperationPayload & { targetFolderId?: string };
512
513
  FOLDER_CREATE_PROVIDER_NOT_CONFIGURED: FolderOperationPayload;
513
514
  FOLDER_CREATE_FAILED: FolderOperationPayload;
514
515
  FOLDER_CHILDREN_COUNT_FAILED: FolderOperationPayload;
515
516
  FOLDER_CHILDREN_FETCH_FAILED: FolderOperationPayload;
516
517
  FILE_URL_VALIDATION_FAILED: FileUrlValidationErrorPayload;
518
+
519
+ TRASH_CLEAR_FAILED: OperationErrorPayload;
520
+ TRASH_CLEAR_ERROR: never;
517
521
  }
518
522
 
519
523
  /**
@@ -544,6 +548,8 @@ declare namespace Notify {
544
548
  FOLDER_CREATE_SUCCESS: FolderOperationPayload;
545
549
 
546
550
  FILE_UPLOAD_ITEM_SUCCESS: FileUploadPayload;
551
+
552
+ TRASH_CLEARED_SUCCESS: never;
547
553
  }
548
554
 
549
555
  /**
@@ -564,6 +570,8 @@ declare namespace Notify {
564
570
  export interface WarningMap {
565
571
  FILES_UPLOAD_UNSUPPORTED_TYPE: UnsupportedFileTypePayload;
566
572
  FOLDER_OPERATION_VALIDATION_FAILED: FolderOperationPayload;
573
+
574
+ TRASH_CLEARED_PARTIAL: OperationErrorPayload;
567
575
  }
568
576
 
569
577
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emailmaker/filemanager",
3
- "version": "0.10.46",
3
+ "version": "0.10.47",
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,11 @@ export interface Config {
369
392
  customTheme?: CustomTheme;
370
393
  UNSPLASH_KEY?: string;
371
394
  APP_NAME_UNSPLASH?: string;
395
+ /** Переопределение URL прокси Streamline (по умолчанию /streamline). Ключ добавляется на прокси. */
396
+ STREAMLINE_BASE_URL?: string;
397
+ handleTranslate?: (input: string, opts: {
398
+ locale?: string;
399
+ }) => Promise<string>;
372
400
  UNSLASH_PROXY_URL?: string;
373
401
  pushToGTM?: boolean;
374
402
  projectId?: string;
@@ -401,10 +429,53 @@ export interface Config {
401
429
  multiSelect?: boolean;
402
430
  defaultFolderName?: string;
403
431
  availableImageExtensions?: Array<(typeof IMAGE_EXTENSIONS)[number]>;
432
+ /** Настройки обработки имен файлов при загрузке */
433
+ fileNameProcessing?: {
434
+ transliterate?: boolean;
435
+ replaceSpaces?: boolean;
436
+ removeForbiddenChars?: boolean;
437
+ toLowerCase?: boolean;
438
+ };
439
+ /** Настройки обработки имен папок при создании */
440
+ folderNameProcessing?: {
441
+ transliterate?: boolean;
442
+ replaceSpaces?: boolean;
443
+ removeForbiddenChars?: boolean;
444
+ toLowerCase?: boolean;
445
+ };
404
446
  /** Разрешаем произвольные дополнительные поля */
405
447
  [key: string]: unknown;
406
448
  }
407
- export type LibraryMenuKey = typeof MY_FILES | typeof GIF | typeof STOCK_IMAGES | typeof AI | typeof EDITOR;
449
+ export type LibraryMenuKey = typeof MY_FILES | typeof GIF | typeof STOCK_IMAGES | typeof ICONS | typeof AI | typeof EDITOR;
450
+ export type StreamlineSearchItem = {
451
+ hash: string;
452
+ name: string;
453
+ imagePreviewUrl: string;
454
+ isFree: boolean;
455
+ familySlug: string;
456
+ familyName: string;
457
+ categorySlug?: string;
458
+ categoryName?: string;
459
+ subcategorySlug?: string;
460
+ subcategoryName?: string;
461
+ };
462
+ export type StreamlineSearchResponse = {
463
+ query: string;
464
+ results: StreamlineSearchItem[];
465
+ pagination: {
466
+ total: number;
467
+ hasMore: boolean;
468
+ offset: number;
469
+ nextSkip?: number;
470
+ };
471
+ };
472
+ export interface IconsTabProps {
473
+ apiKey?: string;
474
+ customRequest: (data: string) => void | Promise<void>;
475
+ query?: string;
476
+ setQuery?: (query: string) => void;
477
+ inputRef?: React.RefObject<InputRef>;
478
+ }
408
479
  export interface GifItem {
409
480
  id: string;
410
481
  title: string;
@@ -1,12 +1,32 @@
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
+ * Возвращает сообщение для отображения при ошибке загрузки по URL.
29
+ * Приоритет: код ошибки → понятное сообщение бэкенда → общий fallback.
30
+ */
31
+ export declare const getUploadByUrlErrorMessage: (apiError: FileManageErrorInfo | undefined, t: TFunction, params?: ErrorMessageParams) => string;
12
32
  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,26 @@ 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
+ /**
36
+ * Генерирует уникальное имя файла: если name уже есть в existingNames, добавляет _1 (или _2, _3 и т.д.).
37
+ * @param name — исходное имя файла (с расширением)
38
+ * @param existingNames — массив имён файлов/папок в целевой директории
39
+ */
40
+ export declare const getUniqueFileName: (name: string, existingNames: string[]) => string;
41
+ /**
42
+ * Кодирует URL для безопасного использования в img src. Решает проблему с кириллицей и другими
43
+ * не-ASCII символами в пути (например, emcdn.ru/.../Снимок_экрана.png).
44
+ * data: и blob: URLs возвращаются без изменений.
45
+ */
46
+ export declare const encodeUrlForImageSrc: (url: string | undefined | null) => string | undefined;
47
+ /**
48
+ * @deprecated Эта функция оставлена только для обратной совместимости.
49
+ * Используйте {@link normalizeFileName} из `nameNormalization.ts` для настраиваемой нормализации имен файлов.
50
+ *
51
+ * Упрощенная санитизация имени файла:
52
+ * - Заменяет запрещенные символы на `_`
53
+ * - Заменяет пробелы на `_`
54
+ * - Удаляет множественные подчеркивания
55
+ * - Ограничивает длину до 255 символов
56
+ */
35
57
  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;
@@ -0,0 +1,11 @@
1
+ export type SvgColorOptions = {
2
+ colorHex: string;
3
+ colorHex2: string;
4
+ colorHex3: string;
5
+ };
6
+ export declare function applyInlineColors(svg: string, colors: SvgColorOptions): string;
7
+ export declare function computeSvgTargetDimensions(svgText: string, targetSize: number): {
8
+ width: number;
9
+ height: number;
10
+ };
11
+ export declare function rasterizeSvgToPng(svgText: string, outW: number, outH: number, bg?: string): Promise<string>;