@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.
- package/components/FileContent/FileContent.d.ts +1 -0
- package/components/FileManagerApp/ActionsHeader.d.ts +4 -0
- package/components/FileModals/FileModals.d.ts +4 -1
- package/components/ImageIcons/IconsControls.d.ts +26 -0
- package/components/ImageIcons/IconsGrid.d.ts +26 -0
- package/components/ImageIcons/IconsSearchForm.d.ts +13 -0
- package/components/ImageIcons/IconsTab.d.ts +4 -0
- package/components/ImageIcons/useIconsCopyToFolder.d.ts +28 -0
- package/components/ImageIcons/useStreamlineApi.d.ts +47 -0
- package/components/index.d.ts +1 -0
- package/constants/index.d.ts +2 -0
- package/file-manager.css +495 -21
- package/file-manager.esm.js +9 -9
- package/file-manager.esm.js.map +1 -1
- package/file-manager.js +1 -1
- package/file-manager.js.LICENSE.txt +2 -0
- package/hooks/core/files/actions/useFilesCopy.d.ts +1 -0
- package/hooks/core/files/useFilesAPI.d.ts +2 -1
- package/hooks/core/files/useFilesSelection.d.ts +1 -0
- package/hooks/core/types.d.ts +6 -1
- package/hooks/core/useFiles.d.ts +1 -0
- package/hooks/useCustomIcons.d.ts +1 -0
- package/hooks/useFileActions.d.ts +6 -1
- package/hooks/useFolderSelectionMenu.d.ts +26 -0
- package/notification.d.ts +27 -8
- package/package.json +1 -1
- package/types.d.ts +80 -7
- package/utils/errorMessages.d.ts +39 -2
- package/utils/fileFormatUtils.d.ts +39 -0
- package/utils/fileValidation.d.ts +23 -0
- package/utils/imageCompression.d.ts +1 -0
- package/utils/jsonDataProvider.d.ts +8 -0
- package/utils/mimeUtils.d.ts +12 -0
- package/utils/nameNormalization.d.ts +23 -0
- package/utils/svgParseUtils.d.ts +47 -0
- package/utils/svgToPng.d.ts +11 -0
|
@@ -143,6 +143,8 @@ and limitations under the License.
|
|
|
143
143
|
|
|
144
144
|
/** */
|
|
145
145
|
|
|
146
|
+
/** */
|
|
147
|
+
|
|
146
148
|
/** */
|
|
147
149
|
|
|
148
150
|
/** */
|
|
@@ -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>;
|
package/hooks/core/types.d.ts
CHANGED
|
@@ -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
|
|
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>;
|
package/hooks/core/useFiles.d.ts
CHANGED
|
@@ -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
|
|
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
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,
|
|
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
|
|
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;
|
package/utils/errorMessages.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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;
|
|
@@ -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;
|
package/utils/mimeUtils.d.ts
CHANGED
|
@@ -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;
|