From aea69a30773433974dcd768fb3928e0194a01732 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Tue, 18 Jan 2022 18:08:27 +0300 Subject: [PATCH] Fixed Bug 54884 - Client.Files. Removed the possibility of simultaneous operations with files. --- .../components/Article/Body/TreeFolders.js | 4 +- .../dialogs/ConflictResolveDialog/index.js | 43 +++++- .../dialogs/ModalDialogContainer.js | 10 -- .../dialogs/ThirdPartyMoveDialog/index.js | 46 +++++- .../panels/OperationsPanel/index.js | 140 ++++++++++++------ .../Client/src/store/FilesActionsStore.js | 31 ++-- 6 files changed, 190 insertions(+), 84 deletions(-) diff --git a/products/ASC.Files/Client/src/components/Article/Body/TreeFolders.js b/products/ASC.Files/Client/src/components/Article/Body/TreeFolders.js index c0f5bb2eb03..b5b6011d324 100644 --- a/products/ASC.Files/Client/src/components/Article/Body/TreeFolders.js +++ b/products/ASC.Files/Client/src/components/Article/Body/TreeFolders.js @@ -436,13 +436,13 @@ class TreeFolders extends React.Component { const { selectedKeys, isLoading, - setIsLoading, onSelect, dragging, expandedKeys, expandedPanelKeys, treeFolders, data, + disabled, } = this.props; return ( @@ -450,7 +450,7 @@ class TreeFolders extends React.Component { className="files-tree-menu" checkable={false} draggable={dragging} - disabled={isLoading} + disabled={isLoading || disabled} multiple={false} showIcon switcherIcon={this.switcherIcon} diff --git a/products/ASC.Files/Client/src/components/dialogs/ConflictResolveDialog/index.js b/products/ASC.Files/Client/src/components/dialogs/ConflictResolveDialog/index.js index 6efab2f9fb3..d71895efc1f 100644 --- a/products/ASC.Files/Client/src/components/dialogs/ConflictResolveDialog/index.js +++ b/products/ASC.Files/Client/src/components/dialogs/ConflictResolveDialog/index.js @@ -1,6 +1,5 @@ import React, { useState } from "react"; import { withRouter } from "react-router"; -import ModalDialogContainer from "../ModalDialogContainer"; import ModalDialog from "@appserver/components/modal-dialog"; import RadioButtonGroup from "@appserver/components/radio-button-group"; import Button from "@appserver/components/button"; @@ -9,6 +8,26 @@ import { withTranslation } from "react-i18next"; import { inject, observer } from "mobx-react"; import { ConflictResolveType } from "@appserver/common/constants"; import toastr from "studio/toastr"; +import styled from "styled-components"; + +const StyledModalDialog = styled(ModalDialog)` + .conflict-resolve-dialog-text { + padding-bottom: 8px; + } + + .conflict-resolve-radio-button { + svg { + overflow: visible; + } + } + + .modal-dialog-aside-footer { + display: grid; + grid-template-columns: 1fr 1fr; + grid-gap: 10px; + width: 90%; + } +`; const ConflictResolveDialog = (props) => { const { @@ -21,6 +40,8 @@ const ConflictResolveDialog = (props) => { itemOperationToFolder, activeFiles, setActiveFiles, + setMoveToPanelVisible, + setThirdPartyMoveDialogVisible, } = props; const { @@ -37,6 +58,11 @@ const ConflictResolveDialog = (props) => { const onSelectResolveType = (e) => setResolveType(e.target.value); const onClose = () => setConflictResolveDialogVisible(false); + const onClosePanels = () => { + setConflictResolveDialogVisible(false); + setMoveToPanelVisible(false); + setThirdPartyMoveDialogVisible(false); + }; const onCloseDialog = () => { let newActiveFiles = activeFiles; @@ -75,7 +101,7 @@ const ConflictResolveDialog = (props) => { } setActiveFiles(newActiveFiles); - if (!folderIds.length && !newFileIds.length) return onClose(); + if (!folderIds.length && !newFileIds.length) return onClosePanels(); const data = { destFolderId, @@ -87,7 +113,7 @@ const ConflictResolveDialog = (props) => { translations, }; - onClose(); + onClosePanels(); try { await itemOperationToFolder(data); } catch (error) { @@ -131,10 +157,11 @@ const ConflictResolveDialog = (props) => { const file = items[0].title; return ( - {t("ConflictResolveTitle")} @@ -167,6 +194,7 @@ const ConflictResolveDialog = (props) => { label={t("Common:OKButton")} size="medium" primary + scale onClick={onAcceptType} //isLoading={isLoading} /> @@ -175,11 +203,12 @@ const ConflictResolveDialog = (props) => { key="CancelButton" label={t("Common:CancelButton")} size="medium" + scale onClick={onCloseDialog} //isLoading={isLoading} /> - + ); }; @@ -189,6 +218,8 @@ export default inject(({ dialogsStore, uploadDataStore, filesStore }) => { setConflictResolveDialogVisible, conflictResolveDialogData, conflictResolveDialogItems: items, + setMoveToPanelVisible, + setThirdPartyMoveDialogVisible, } = dialogsStore; const { itemOperationToFolder } = uploadDataStore; @@ -202,6 +233,8 @@ export default inject(({ dialogsStore, uploadDataStore, filesStore }) => { itemOperationToFolder, activeFiles, setActiveFiles, + setMoveToPanelVisible, + setThirdPartyMoveDialogVisible, }; })( withRouter( diff --git a/products/ASC.Files/Client/src/components/dialogs/ModalDialogContainer.js b/products/ASC.Files/Client/src/components/dialogs/ModalDialogContainer.js index 476dd3720a3..5ddffcd8e06 100644 --- a/products/ASC.Files/Client/src/components/dialogs/ModalDialogContainer.js +++ b/products/ASC.Files/Client/src/components/dialogs/ModalDialogContainer.js @@ -147,16 +147,6 @@ const ModalDialogContainer = styled(ModalDialog)` width: 90%; } } - - .conflict-resolve-dialog-text { - padding-bottom: 8px; - } - - .conflict-resolve-radio-button { - svg { - overflow: visible; - } - } `; export default ModalDialogContainer; diff --git a/products/ASC.Files/Client/src/components/dialogs/ThirdPartyMoveDialog/index.js b/products/ASC.Files/Client/src/components/dialogs/ThirdPartyMoveDialog/index.js index 12a9f81f596..01e6c4a2d49 100644 --- a/products/ASC.Files/Client/src/components/dialogs/ThirdPartyMoveDialog/index.js +++ b/products/ASC.Files/Client/src/components/dialogs/ThirdPartyMoveDialog/index.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState } from "react"; import styled from "styled-components"; import { withTranslation } from "react-i18next"; @@ -6,11 +6,17 @@ import ModalDialog from "@appserver/components/modal-dialog"; import Text from "@appserver/components/text"; import Button from "@appserver/components/button"; import { inject, observer } from "mobx-react"; +import toastr from "@appserver/components/toast/toastr"; const StyledOperationDialog = styled(ModalDialog)` .operation-button { margin-right: 8px; } + + .modal-dialog-aside-footer { + display: flex; + width: 90%; + } `; const PureThirdPartyMoveContainer = ({ @@ -21,13 +27,16 @@ const PureThirdPartyMoveContainer = ({ selection, destFolderId, setDestFolderId, - checkOperationConflict, + checkFileConflicts, + setConflictDialogData, setThirdPartyMoveDialogVisible, setBufferSelection, }) => { const zIndex = 310; const deleteAfter = false; // TODO: get from settings + const [isLoading, setIsLoading] = useState(false); + const onClose = () => { setBufferSelection(null); setDestFolderId(false); @@ -59,8 +68,22 @@ const PureThirdPartyMoveContainer = ({ }, }; - checkOperationConflict(data); - onClose(); + setIsLoading(true); + checkFileConflicts(destFolderId, folderIds, fileIds) + .then(async (conflicts) => { + if (conflicts.length) { + setConflictDialogData(conflicts, data); + setIsLoading(false); + } else { + setIsLoading(false); + onClose(); + await itemOperationToFolder(data); + } + }) + .catch((err) => toastr.error(err)) + .finally(() => { + setIsLoading(false); + }); }; return ( @@ -69,6 +92,7 @@ const PureThirdPartyMoveContainer = ({ visible={visible} zIndex={zIndex} onClose={onClose} + displayType="aside" > {t("MoveConfirmation")} @@ -82,21 +106,30 @@ const PureThirdPartyMoveContainer = ({ className="operation-button" label={t("Translations:Move")} size="big" + scale primary onClick={startOperation} + isLoading={isLoading} + isDisabled={isLoading} />