From ba0cd2d3fa11cd655cf587378cf33fe97e88d425 Mon Sep 17 00:00:00 2001 From: alex <48489896+devnaumov@users.noreply.github.com> Date: Fri, 14 Jul 2023 14:15:34 +0200 Subject: [PATCH] CB-3600 support files aggregation (#1813) * CB-3600 support files aggregation * CB-3600 notify about duplicates --------- Co-authored-by: dariamarutkina <125263541+dariamarutkina@users.noreply.github.com> --- .../src/FormControls/InputFiles.tsx | 28 +++++++++++++++++++ .../core-localization/src/locales/en.ts | 1 + .../core-localization/src/locales/it.ts | 1 + .../core-localization/src/locales/ru.ts | 1 + .../core-localization/src/locales/zh.ts | 1 + 5 files changed, 32 insertions(+) diff --git a/webapp/packages/core-blocks/src/FormControls/InputFiles.tsx b/webapp/packages/core-blocks/src/FormControls/InputFiles.tsx index 115419e09d..2c1b1d11e3 100644 --- a/webapp/packages/core-blocks/src/FormControls/InputFiles.tsx +++ b/webapp/packages/core-blocks/src/FormControls/InputFiles.tsx @@ -56,6 +56,8 @@ type BaseProps = Omit, 'onChange' | mod?: 'surface'; ref?: React.Ref; style?: ComponentStyle; + aggregate?: boolean; + onDuplicate?: (files: File[]) => void; }; type ControlledProps = BaseProps & { @@ -101,7 +103,9 @@ export const InputFiles: InputFilesType = observer( large, tiny, autoHide, + aggregate, onChange, + onDuplicate, ...rest }: ControlledProps | ObjectProps, refInherit: React.Ref, @@ -120,6 +124,30 @@ export const InputFiles: InputFilesType = observer( } function setValue(value: FileList | null) { + if (aggregate) { + if (value) { + const currentFiles = Array.from(innerState || []); + const newFiles = Array.from(value); + const existingFiles = new Set(); + const aggregation = new DataTransfer(); + + for (const file of [...currentFiles, ...newFiles]) { + if (!existingFiles.has(file.name)) { + aggregation.items.add(file); + existingFiles.add(file.name); + } + } + + const duplication = newFiles.filter(n => currentFiles.some(c => c.name === n.name)); + + if (duplication.length > 0) { + onDuplicate?.(duplication); + } + + value = aggregation.files; + } + } + setInnerState(value); if (state) { state[name] = value; diff --git a/webapp/packages/core-localization/src/locales/en.ts b/webapp/packages/core-localization/src/locales/en.ts index b8f6e6f267..e3c3bbdeae 100644 --- a/webapp/packages/core-localization/src/locales/en.ts +++ b/webapp/packages/core-localization/src/locales/en.ts @@ -97,6 +97,7 @@ export default [ ['ui_file_size_exceeds', 'Max file size exceeds. File size: {arg:size}. Max file size: {arg:maxSize}'], ['ui_upload_file', 'Upload file'], ['ui_upload_files', 'Upload files'], + ['ui_upload_files_duplicate_error', 'Files with the same name already exist'], ['root_permission_denied', "You don't have permissions"], ['root_permission_no_permission', "You don't have permission for this action"], diff --git a/webapp/packages/core-localization/src/locales/it.ts b/webapp/packages/core-localization/src/locales/it.ts index c47bb17d5d..0e25ee2468 100644 --- a/webapp/packages/core-localization/src/locales/it.ts +++ b/webapp/packages/core-localization/src/locales/it.ts @@ -81,6 +81,7 @@ export default [ ['ui_file_size_exceeds', 'Max file size exceeds. File size: {arg:size}. Max file size: {arg:maxSize}'], ['ui_upload_file', 'Upload file'], ['ui_upload_files', 'Upload files'], + ['ui_upload_files_duplicate_error', 'Files with the same name already exist'], ['root_permission_denied', 'Non hai i permessi'], ['app_root_session_expire_warning_title', 'La sessione sta per scadere'], diff --git a/webapp/packages/core-localization/src/locales/ru.ts b/webapp/packages/core-localization/src/locales/ru.ts index 2d552f6efb..80334808ec 100644 --- a/webapp/packages/core-localization/src/locales/ru.ts +++ b/webapp/packages/core-localization/src/locales/ru.ts @@ -93,6 +93,7 @@ export default [ ['ui_file_size_exceeds', 'Максимальный размер файла превышен. Размер файла: {arg:size}. Максимальный размер: {arg:maxSize}'], ['ui_upload_file', 'Загрузить файл'], ['ui_upload_files', 'Загрузить файлы'], + ['ui_upload_files_duplicate_error', 'Файлы с такими именами уже существуют'], ['root_permission_denied', 'Отказано в доступе'], ['root_permission_no_permission', 'У вас нет разрешения на это действие'], diff --git a/webapp/packages/core-localization/src/locales/zh.ts b/webapp/packages/core-localization/src/locales/zh.ts index b9ec443d76..8c54ec229d 100644 --- a/webapp/packages/core-localization/src/locales/zh.ts +++ b/webapp/packages/core-localization/src/locales/zh.ts @@ -94,6 +94,7 @@ export default [ ['ui_file_size_exceeds', 'Max file size exceeds. File size: {arg:size}. Max file size: {arg:maxSize}'], ['ui_upload_file', 'Upload file'], ['ui_upload_files', 'Upload files'], + ['ui_upload_files_duplicate_error', 'Files with the same name already exist'], ['root_permission_denied', '您没有权限'], ['root_permission_no_permission', '您没有权限执行此操作'],