diff --git a/packages/client/src/components/GlobalEvents/CreateEvent.js b/packages/client/src/components/GlobalEvents/CreateEvent.js index ab3cdbb167..7659fcf0a6 100644 --- a/packages/client/src/components/GlobalEvents/CreateEvent.js +++ b/packages/client/src/components/GlobalEvents/CreateEvent.js @@ -48,7 +48,7 @@ const CreateEvent = ({ setEventDialogVisible, eventDialogVisible, - createWithoutDialog, + keepNewFileName, }) => { const [headerTitle, setHeaderTitle] = React.useState(null); const [startValue, setStartValue] = React.useState(""); @@ -77,7 +77,7 @@ const CreateEvent = ({ if (!extension) return setEventDialogVisible(true); - if (!createWithoutDialog) { + if (!keepNewFileName) { setEventDialogVisible(true); } else { onSave(null, title || defaultName); @@ -289,6 +289,7 @@ export default inject( uploadDataStore, dialogsStore, oformsStore, + settingsStore, }) => { const { setIsLoading, @@ -321,7 +322,7 @@ export default inject( eventDialogVisible, } = dialogsStore; - const { createWithoutDialog } = filesStore; + const { keepNewFileName } = settingsStore; return { setEventDialogVisible, @@ -352,7 +353,7 @@ export default inject( replaceFileStream, setEncryptionAccess, - createWithoutDialog, + keepNewFileName, }; } )(observer(CreateEvent)); diff --git a/packages/client/src/components/GlobalEvents/sub-components/Dialog.js b/packages/client/src/components/GlobalEvents/sub-components/Dialog.js index 422a7b18a9..bcb7c5c596 100644 --- a/packages/client/src/components/GlobalEvents/sub-components/Dialog.js +++ b/packages/client/src/components/GlobalEvents/sub-components/Dialog.js @@ -22,9 +22,9 @@ const Dialog = ({ onCancel, onClose, isCreateDialog, - createWithoutDialog, - setCreateWithoutDialog, extension, + keepNewFileName, + setKeepNewFileName, }) => { const [value, setValue] = useState(""); const [isDisabled, setIsDisabled] = useState(false); @@ -32,8 +32,8 @@ const Dialog = ({ const [isChanged, setIsChanged] = useState(false); useEffect(() => { - createWithoutDialog && isCreateDialog && setIsChecked(createWithoutDialog); - }, [isCreateDialog, createWithoutDialog]); + keepNewFileName && isCreateDialog && setIsChecked(keepNewFileName); + }, [isCreateDialog, keepNewFileName]); useEffect(() => { let input = document?.getElementById("create-text-input"); @@ -80,7 +80,7 @@ const Dialog = ({ const onSaveAction = useCallback( (e) => { setIsDisabled(true); - isCreateDialog && setCreateWithoutDialog(isChecked); + isCreateDialog && setKeepNewFileName(isChecked); onSave && onSave(e, value); }, [onSave, isCreateDialog, value, isChecked] @@ -88,7 +88,7 @@ const Dialog = ({ const onCancelAction = useCallback((e) => { if (isChecked) { - setCreateWithoutDialog(false); + setKeepNewFileName(false); } onCancel && onCancel(e); }, []); @@ -96,7 +96,7 @@ const Dialog = ({ const onCloseAction = useCallback( (e) => { if (!isDisabled && isChecked) { - setCreateWithoutDialog(false); + setKeepNewFileName(false); } onClose && onClose(e); }, @@ -171,9 +171,9 @@ const Dialog = ({ ); }; -export default inject(({ auth, filesStore }) => { +export default inject(({ auth, settingsStore }) => { const { folderFormValidation } = auth.settingsStore; - const { createWithoutDialog, setCreateWithoutDialog } = filesStore; + const { keepNewFileName, setKeepNewFileName } = settingsStore; - return { folderFormValidation, createWithoutDialog, setCreateWithoutDialog }; + return { folderFormValidation, keepNewFileName, setKeepNewFileName }; })(observer(Dialog)); diff --git a/packages/client/src/components/panels/UploadPanel/FileRow.js b/packages/client/src/components/panels/UploadPanel/FileRow.js index 3fb0689fc3..1f17dbe307 100644 --- a/packages/client/src/components/panels/UploadPanel/FileRow.js +++ b/packages/client/src/components/panels/UploadPanel/FileRow.js @@ -142,11 +142,11 @@ class FileRow extends Component { onCancelCurrentUpload = (e) => { //console.log("cancel upload ", e); const { id, action, fileId } = e.currentTarget.dataset; - const { cancelCurrentUpload, cancelCurrentFileConversion } = this.props; + const { t, cancelCurrentUpload, cancelCurrentFileConversion } = this.props; return action === "convert" ? cancelCurrentFileConversion(fileId) - : cancelCurrentUpload(id); + : cancelCurrentUpload(id, t); }; onMediaClick = (id) => { diff --git a/packages/client/src/pages/Settings/Section/Body/CommonSettings.js b/packages/client/src/pages/Settings/Section/Body/CommonSettings.js index 427b963dd1..a5b317d502 100644 --- a/packages/client/src/pages/Settings/Section/Body/CommonSettings.js +++ b/packages/client/src/pages/Settings/Section/Body/CommonSettings.js @@ -28,10 +28,11 @@ const PersonalSettings = ({ t, showTitle, - createWithoutDialog, - setCreateWithoutDialog, showAdminSettings, + + keepNewFileName, + setKeepNewFileName, }) => { const [isLoadingFavorites, setIsLoadingFavorites] = React.useState(false); const [isLoadingRecent, setIsLoadingRecent] = React.useState(false); @@ -52,6 +53,10 @@ const PersonalSettings = ({ setForceSave(!forceSave); }, [setForceSave, forceSave]); + const onChangeKeepNewFileName = React.useCallback(() => { + setKeepNewFileName(!keepNewFileName); + }, [setKeepNewFileName, keepNewFileName]); + const onChangeFavorites = React.useCallback( (e) => { setIsLoadingFavorites(true); @@ -72,10 +77,6 @@ const PersonalSettings = ({ [setIsLoadingRecent, setRecentSetting] ); - const onChangeCheckbox = () => { - setCreateWithoutDialog(!createWithoutDialog); - }; - return ( )} { - const { - storeOriginalFiles, - confirmDelete, - updateIfExist, - forcesave, +export default inject(({ auth, settingsStore, treeFoldersStore }) => { + const { + storeOriginalFiles, + confirmDelete, + updateIfExist, + forcesave, - setUpdateIfExist, - setStoreOriginal, + setUpdateIfExist, + setStoreOriginal, - setConfirmDelete, + setConfirmDelete, - setForceSave, + setForceSave, - favoritesSection, - recentSection, - setFavoritesSetting, - setRecentSetting, - } = settingsStore; + favoritesSection, + recentSection, + setFavoritesSetting, + setRecentSetting, - const { myFolderId, commonFolderId } = treeFoldersStore; - const { setCreateWithoutDialog, createWithoutDialog } = filesStore; + keepNewFileName, + setKeepNewFileName, + } = settingsStore; - return { - storeOriginalFiles, - confirmDelete, - updateIfExist, - forceSave: forcesave, + const { myFolderId, commonFolderId } = treeFoldersStore; - myFolderId, - commonFolderId, - isVisitor: auth.userStore.user.isVisitor, - favoritesSection, - recentSection, + return { + storeOriginalFiles, + confirmDelete, + updateIfExist, + forceSave: forcesave, - setUpdateIfExist, - setStoreOriginal, + myFolderId, + commonFolderId, + isVisitor: auth.userStore.user.isVisitor, + favoritesSection, + recentSection, - setConfirmDelete, + setUpdateIfExist, + setStoreOriginal, - setForceSave, + setConfirmDelete, - setFavoritesSetting, - setRecentSetting, - myFolderId, - commonFolderId, - setCreateWithoutDialog, - createWithoutDialog, - }; - } -)(observer(PersonalSettings)); + setForceSave, + + setFavoritesSetting, + setRecentSetting, + myFolderId, + commonFolderId, + + keepNewFileName, + setKeepNewFileName, + }; +})(observer(PersonalSettings)); diff --git a/packages/client/src/store/FilesStore.js b/packages/client/src/store/FilesStore.js index 9e61153784..f91dd9a1de 100644 --- a/packages/client/src/store/FilesStore.js +++ b/packages/client/src/store/FilesStore.js @@ -32,7 +32,6 @@ import debounce from "lodash.debounce"; const { FilesFilter, RoomsFilter } = api; const storageViewAs = localStorage.getItem("viewAs"); -const storageCheckbox = JSON.parse(localStorage.getItem("createWithoutDialog")); let requestCounter = 0; @@ -56,7 +55,6 @@ class FilesStore { isLoaded = false; isLoading = false; - createWithoutDialog = storageCheckbox ? true : false; viewAs = isMobile && storageViewAs !== "tile" ? "row" : storageViewAs || "table"; @@ -569,11 +567,6 @@ class FilesStore { viewAs === "tile" && this.createThumbnails(); }; - setCreateWithoutDialog = (checked) => { - this.createWithoutDialog = checked; - localStorage.setItem("createWithoutDialog", JSON.stringify(checked)); - }; - setPageItemsLength = (pageItemsLength) => { this.pageItemsLength = pageItemsLength; }; diff --git a/packages/client/src/store/InviteLinksStore.js b/packages/client/src/store/InviteLinksStore.js index e460ee765c..39ff8f3bab 100644 --- a/packages/client/src/store/InviteLinksStore.js +++ b/packages/client/src/store/InviteLinksStore.js @@ -1,4 +1,4 @@ -import { makeAutoObservable } from "mobx"; +import { makeAutoObservable, runInAction } from "mobx"; import { getInvitationLinks, getShortenedLink, @@ -39,10 +39,12 @@ class InviteLinksStore { const links = await getInvitationLinks(); - this.setUserLink(links.userLink); - this.setGuestLink(links.guestLink); - this.setAdminLink(links.adminLink); - this.setCollaboratorLink(links.collaboratorLink); + runInAction(() => { + this.setUserLink(links.userLink); + this.setGuestLink(links.guestLink); + this.setAdminLink(links.adminLink); + this.setCollaboratorLink(links.collaboratorLink); + }); }; getShortenedLink = async (link, forUser = false) => { diff --git a/packages/client/src/store/SettingsStore.js b/packages/client/src/store/SettingsStore.js index c406b95da0..52cffa9dee 100644 --- a/packages/client/src/store/SettingsStore.js +++ b/packages/client/src/store/SettingsStore.js @@ -30,6 +30,7 @@ class SettingsStore { favoritesSection = null; recentSection = null; hideConfirmConvertSave = null; + keepNewFileName = null; chunkUploadSize = 1024 * 1023; // 1024 * 1023; //~0.999mb settingsIsLoaded = false; @@ -149,6 +150,12 @@ class SettingsStore { setStoreForcesave = (val) => (this.storeForcesave = val); + setKeepNewFileName = (data) => { + api.files + .changeKeepNewFileName(data) + .then((res) => this.setFilesSetting("keepNewFileName", res)); + }; + setEnableThirdParty = async (data, setting) => { const res = await api.files.thirdParty(data); this.setFilesSetting(setting, res); diff --git a/packages/client/src/store/UploadDataStore.js b/packages/client/src/store/UploadDataStore.js index a0fdc4563a..2e0a008af6 100644 --- a/packages/client/src/store/UploadDataStore.js +++ b/packages/client/src/store/UploadDataStore.js @@ -215,7 +215,31 @@ class UploadDataStore { this.setUploadData(newUploadData); }; - cancelCurrentUpload = (id) => { + cancelCurrentUpload = (id, t) => { + if (this.isParallel) { + runInAction(() => { + const uploadedFilesHistory = this.uploadedFilesHistory.filter( + (el) => el.uniqueId !== id + ); + + const canceledFile = this.files.find((f) => f.uniqueId === id); + const newPercent = this.getFilesPercent(canceledFile.file.size); + canceledFile.cancel = true; + canceledFile.percent = 100; + canceledFile.action = "uploaded"; + + this.currentUploadNumber -= 1; + this.uploadedFilesHistory = uploadedFilesHistory; + this.percent = newPercent; + const nextFileIndex = this.files.findIndex((f) => !f.inAction); + + if (nextFileIndex !== -1) { + this.startSessionFunc(nextFileIndex, t); + } + }); + return; + } + const newFiles = this.files.filter((el) => el.uniqueId !== id); const uploadedFilesHistory = this.uploadedFilesHistory.filter( (el) => el.uniqueId !== id @@ -543,7 +567,7 @@ class UploadDataStore { this.setConversionPercent(percent, !!error); if (!file.error && file.fileInfo.version > 2) { - this.filesStore.setHighlightFile({ + this.filesStore.setHighlightFile({ highlightFileId: file.fileInfo.id, isFileHasExst: !file.fileInfo.fileExst, }); diff --git a/packages/common/api/files/index.js b/packages/common/api/files/index.js index 6854cfe786..6ba5be8d84 100644 --- a/packages/common/api/files/index.js +++ b/packages/common/api/files/index.js @@ -703,6 +703,11 @@ export function forceSave(val) { return request({ method: "put", url: "files/forcesave", data }); } +export function changeKeepNewFileName(val) { + const data = { set: val }; + return request({ method: "put", url: "files/keepnewfilename", data }); +} + export function thirdParty(val) { const data = { set: val }; return request({ method: "put", url: "files/thirdparty", data }); diff --git a/packages/components/selection-area/SelectionArea.js b/packages/components/selection-area/SelectionArea.js index e2c80ebcec..c11f6486c0 100644 --- a/packages/components/selection-area/SelectionArea.js +++ b/packages/components/selection-area/SelectionArea.js @@ -265,7 +265,8 @@ class SelectionArea extends React.Component { e.target.closest(".tile-selected") || e.target.closest(".table-row-selected") || e.target.closest(".row-selected") || - !e.target.closest("#sectionScroll") + !e.target.closest("#sectionScroll") || + e.target.closest(".table-container_row-checkbox") ) return; @@ -292,7 +293,16 @@ class SelectionArea extends React.Component { y: scroll.scrollTop, }; - onMove && onMove({ added: [], removed: [], clear: true }); + const threshold = 10; + const { x1, y1 } = this.areaLocation; + + if ( + Math.abs(e.clientX - x1) >= threshold || + Math.abs(e.clientY - y1) >= threshold + ) { + onMove && onMove({ added: [], removed: [], clear: true }); + } + this.addListeners(); const itemsContainer = document.getElementsByClassName(itemsContainerClass);