Fix Bug 67422 - Settings: Data Import. When starting a migration, add an alert if user quota is enabled.

This commit is contained in:
Elyor Djalilov 2024-08-02 14:33:22 +05:00
parent 37cbfe9e6a
commit 42f1c02a0e
8 changed files with 271 additions and 37 deletions

View File

@ -258,6 +258,7 @@
"Statistics": "Statistics",
"StorageManagement": "Storage management",
"StoragePeriod": "Storage period",
"StorageQuotaWarningDescription": "Storage quota of {{quotaLimit}} is enabled for users of this {{productName}}. Limitations can occur during data import.",
"StudioTimeLanguageSettings": "Language and Time Zone Settings",
"Submit": "Submit",
"SuccessfullySaveGreetingSettingsMessage": "Welcome Page settings have been successfully saved",
@ -307,6 +308,7 @@
"UseUpperCase": "Use capital letters",
"WantToCancelDataImport": "Do you want to cancel data import?",
"WantToCancelUpload": "Do you want to cancel the upload?",
"WantToContinue": "Do you want to continue or change the user storage quota?",
"WhiteLabel": "Logo settings",
"WhiteLabelHelper": "Use images with a transparent background. (PNG, SVG, JPG)",
"WhiteLabelSubtitle": "Enter your company name, upload the logo, and customize the styling to match your branding.",

View File

@ -0,0 +1,78 @@
// (c) Copyright Ascensio System SIA 2009-2024
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
import {
ModalDialog,
ModalDialogType,
} from "@docspace/shared/components/modal-dialog";
import { convertBytes } from "@docspace/client/src/pages/PortalSettings/utils/convertBytes";
import { Button, ButtonSize } from "@docspace/shared/components/button";
import { Text } from "@docspace/shared/components/text";
import { WarningQuotaDialogProps } from "./WarningQuotaDialog.types";
export const WarningQuotaDialog = ({
t,
visible,
onClickRedirect,
onCloseDialog,
defaultQuota,
}: WarningQuotaDialogProps) => {
return (
<ModalDialog
autoMaxHeight
visible={visible}
onClose={onCloseDialog}
displayType={ModalDialogType.modal}
>
<ModalDialog.Header>{t("Common:Warning")}</ModalDialog.Header>
<ModalDialog.Body>
<Text noSelect style={{ marginBottom: "16px" }}>
{t("Settings:StorageQuotaWarningDescription", {
quotaLimit: convertBytes(defaultQuota),
productName: t("Common:ProductName"),
})}
</Text>
<Text noSelect>{t("Settings:WantToContinue")}</Text>
</ModalDialog.Body>
<ModalDialog.Footer>
<Button
label={t("Common:ChangeQuota")}
size={ButtonSize.normal}
primary
onClick={onClickRedirect}
scale
/>
<Button
label={t("Common:ContinueButton")}
size={ButtonSize.normal}
onClick={onCloseDialog}
scale
/>
</ModalDialog.Footer>
</ModalDialog>
);
};

View File

@ -0,0 +1,35 @@
// (c) Copyright Ascensio System SIA 2009-2024
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
import { TTranslation } from "@docspace/shared/types";
export interface WarningQuotaDialogProps {
t: TTranslation;
visible: boolean;
onCloseDialog: () => void;
onClickRedirect: () => void;
defaultQuota: number;
}

View File

@ -0,0 +1,26 @@
// (c) Copyright Ascensio System SIA 2009-2024
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
export { WarningQuotaDialog } from "./WarningQuotaDialog";

View File

@ -25,11 +25,13 @@
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
import { useState, useRef, useEffect, useCallback } from "react";
import { useNavigate } from "react-router-dom";
import { inject, observer } from "mobx-react";
import { CancelUploadDialog } from "SRC_DIR/components/dialogs";
import { isMobile, isTablet, mobile } from "@docspace/shared/utils/device";
import styled from "styled-components";
import { WarningQuotaDialog } from "SRC_DIR/components/dialogs/WarningQuotaDialog";
import { Text } from "@docspace/shared/components/text";
import { Button, ButtonSize } from "@docspace/shared/components/button";
import { FileInput } from "@docspace/shared/components/file-input";
@ -154,14 +156,18 @@ const SelectFileStep = (props: SelectFileStepProps) => {
migratingWorkspace,
setMigratingWorkspace,
uploadFiles,
defaultUsersQuota,
isDefaultUsersQuotaSet,
warningQuotaDialogVisible,
setWarningQuotaDialogVisible,
} = props as InjectedSelectFileStepProps;
const [isSaveDisabled, setIsSaveDisabled] = useState(
migratorName === migratingWorkspace,
);
const [progress, setProgress] = useState(0);
const [defaultQuota, setDefaultQuota] = useState(0);
const [isInfiniteProgress, setIsInfiniteProgress] = useState(true);
const [isNetworkError, setIsNetworkError] = useState(false);
const [isFileError, setIsFileError] = useState(false);
const [isBackupEmpty, setIsBackupEmpty] = useState(false);
@ -173,6 +179,16 @@ const SelectFileStep = (props: SelectFileStepProps) => {
const [failTries, setFailTries] = useState(FAIL_TRIES);
const uploadInterval = useRef<number>();
const navigate = useNavigate();
useEffect(() => {
setWarningQuotaDialogVisible(isDefaultUsersQuotaSet);
setDefaultQuota(defaultUsersQuota ?? 0);
}, [isDefaultUsersQuotaSet, setWarningQuotaDialogVisible, defaultUsersQuota]);
const onClickRedirect = () => {
navigate("/portal-settings/management/disk-space");
};
const handleError = useCallback(
(message?: string) => {
@ -477,44 +493,66 @@ const SelectFileStep = (props: SelectFileStepProps) => {
isSixthStep={false}
/>
)}
{warningQuotaDialogVisible && (
<WarningQuotaDialog
t={t}
visible={warningQuotaDialogVisible}
onCloseDialog={() => setWarningQuotaDialogVisible(false)}
onClickRedirect={onClickRedirect}
defaultQuota={defaultQuota}
/>
)}
</Wrapper>
);
};
export default inject<TStore>(({ dialogsStore, importAccountsStore }) => {
const {
initMigrations,
getMigrationStatus,
setUsers,
fileLoadingStatus,
setLoadingStatus,
cancelMigration,
setWorkspace,
incrementStep,
files,
setFiles,
migratingWorkspace,
setMigratingWorkspace,
uploadFiles,
} = importAccountsStore;
const { cancelUploadDialogVisible, setCancelUploadDialogVisible } =
dialogsStore;
export default inject<TStore>(
({ dialogsStore, importAccountsStore, currentQuotaStore }) => {
const {
initMigrations,
getMigrationStatus,
setUsers,
fileLoadingStatus,
setLoadingStatus,
cancelMigration,
setWorkspace,
incrementStep,
files,
setFiles,
migratingWorkspace,
setMigratingWorkspace,
uploadFiles,
} = importAccountsStore;
const {
cancelUploadDialogVisible,
setCancelUploadDialogVisible,
warningQuotaDialogVisible,
setWarningQuotaDialogVisible,
} = dialogsStore;
return {
initMigrations,
getMigrationStatus,
setUsers,
fileLoadingStatus,
setLoadingStatus,
cancelMigration,
cancelUploadDialogVisible,
setCancelUploadDialogVisible,
setWorkspace,
incrementStep,
files,
setFiles,
migratingWorkspace,
setMigratingWorkspace,
uploadFiles,
};
})(observer(SelectFileStep));
const { isDefaultUsersQuotaSet, defaultUsersQuota } = currentQuotaStore;
return {
initMigrations,
getMigrationStatus,
setUsers,
fileLoadingStatus,
setLoadingStatus,
cancelMigration,
cancelUploadDialogVisible,
setCancelUploadDialogVisible,
setWorkspace,
incrementStep,
files,
setFiles,
migratingWorkspace,
setMigratingWorkspace,
uploadFiles,
defaultUsersQuota,
isDefaultUsersQuotaSet,
warningQuotaDialogVisible,
setWarningQuotaDialogVisible,
};
},
)(observer(SelectFileStep));

View File

@ -70,6 +70,10 @@ export interface InjectedSelectFileStepProps extends SelectFileStepProps {
migratingWorkspace: TStore["importAccountsStore"]["migratingWorkspace"];
setMigratingWorkspace: TStore["importAccountsStore"]["setMigratingWorkspace"];
uploadFiles: TStore["importAccountsStore"]["uploadFiles"];
defaultUsersQuota: TStore["currentQuotaStore"]["defaultUsersQuota"];
isDefaultUsersQuotaSet: TStore["currentQuotaStore"]["isDefaultUsersQuotaSet"];
warningQuotaDialogVisible: TStore["dialogsStore"]["warningQuotaDialogVisible"];
setWarningQuotaDialogVisible: TStore["dialogsStore"]["setWarningQuotaDialogVisible"];
}
export interface DataImportProps {}

View File

@ -0,0 +1,45 @@
// (c) Copyright Ascensio System SIA 2009-2024
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
export const convertBytes = (bytes: number) => {
if (bytes < 1024) {
return `${bytes} bytes`;
}
const kilobytes = bytes / 1024;
if (kilobytes < 1024) {
return `${Math.floor(kilobytes)} KB`;
}
const megabytes = kilobytes / 1024;
if (megabytes < 1024) {
return `${Math.floor(megabytes)} MB`;
}
const gigabytes = megabytes / 1024;
if (gigabytes < 1024) {
return `${Math.floor(gigabytes)} GB`;
}
const terabytes = gigabytes / 1024;
return `${Math.floor(terabytes)} TB`;
};

View File

@ -128,6 +128,8 @@ class DialogsStore {
file: null,
};
warningQuotaDialogVisible = false;
constructor(
authStore,
treeFoldersStore,
@ -549,6 +551,10 @@ class DialogsStore {
file,
};
};
setWarningQuotaDialogVisible = (visible) => {
this.warningQuotaDialogVisible = visible;
};
}
export default DialogsStore;