diff --git a/web/src/components/CreateStorageServiceDialog.tsx b/web/src/components/CreateStorageServiceDialog.tsx index f0916d86..4664ef22 100644 --- a/web/src/components/CreateStorageServiceDialog.tsx +++ b/web/src/components/CreateStorageServiceDialog.tsx @@ -2,14 +2,16 @@ import { useTranslation } from "react-i18next"; import Icon from "./Icon"; import { generateDialog } from "./Dialog"; import { Button, Input, Typography } from "@mui/joy"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { useStorageStore } from "../store/module"; import toastHelper from "./Toast"; -type Props = DialogProps; +interface Props extends DialogProps { + storage?: Storage; +} const CreateStorageServiceDialog: React.FC = (props: Props) => { - const { destroy } = props; + const { destroy, storage } = props; const { t } = useTranslation(); const storageStore = useStorageStore(); const [storageCreate, setStorageCreate] = useState({ @@ -21,6 +23,13 @@ const CreateStorageServiceDialog: React.FC = (props: Props) => { bucket: "", urlPrefix: "", }); + const isCreating = storage === undefined; + + useEffect(() => { + if (storage) { + setStorageCreate({ ...storage }); + } + }, []); const handleCloseBtnClick = () => { destroy(); @@ -42,7 +51,14 @@ const CreateStorageServiceDialog: React.FC = (props: Props) => { const handleConfirmBtnClick = async () => { try { - await storageStore.createStorage(storageCreate); + if (isCreating) { + await storageStore.createStorage(storageCreate); + } else { + await storageStore.patchStorage({ + id: storage.id, + ...storageCreate, + }); + } } catch (error: any) { console.error(error); toastHelper.error(error.response.data.message); @@ -109,7 +125,9 @@ const CreateStorageServiceDialog: React.FC = (props: Props) => { return ( <>
-

{t("setting.storage-section.create-a-service")}

+

+ {isCreating ? t("setting.storage-section.create-a-service") : t("setting.storage-section.update-a-service")} +

@@ -148,7 +166,7 @@ const CreateStorageServiceDialog: React.FC = (props: Props) => { Cancel
@@ -156,13 +174,14 @@ const CreateStorageServiceDialog: React.FC = (props: Props) => { ); }; -function showCreateStorageServiceDialog() { +function showCreateStorageServiceDialog(storage?: Storage) { generateDialog( { className: "create-storage-service-dialog", dialogName: "create-storage-service-dialog", }, - CreateStorageServiceDialog + CreateStorageServiceDialog, + { storage } ); } diff --git a/web/src/components/SettingDialog.tsx b/web/src/components/SettingDialog.tsx index 20d08639..8e351c64 100644 --- a/web/src/components/SettingDialog.tsx +++ b/web/src/components/SettingDialog.tsx @@ -58,12 +58,6 @@ const SettingDialog: React.FC = (props: Props) => { <> {t("common.admin")}
- handleSectionSelectorItemClick("storage")} - className={`section-item ${state.selectedSection === "storage" ? "selected" : ""}`} - > - 🗃️ {t("setting.storage")} - handleSectionSelectorItemClick("member")} className={`section-item ${state.selectedSection === "member" ? "selected" : ""}`} @@ -76,6 +70,12 @@ const SettingDialog: React.FC = (props: Props) => { > 🛠️ {t("setting.system")} + handleSectionSelectorItemClick("storage")} + className={`section-item ${state.selectedSection === "storage" ? "selected" : ""}`} + > + 💾 {t("setting.storage")} +
) : null} diff --git a/web/src/components/Settings/StorageSection.tsx b/web/src/components/Settings/StorageSection.tsx index c34422fb..20ce07d7 100644 --- a/web/src/components/Settings/StorageSection.tsx +++ b/web/src/components/Settings/StorageSection.tsx @@ -4,8 +4,6 @@ import { useTranslation } from "react-i18next"; import { useGlobalStore, useStorageStore } from "../../store/module"; import * as api from "../../helpers/api"; import showCreateStorageServiceDialog from "../CreateStorageServiceDialog"; -import showUpdateStorageServiceDialog from "../UpdateStorageServiceDialog"; -import "../../less/settings/storage-section.less"; const StorageSection = () => { const { t } = useTranslation(); @@ -35,29 +33,29 @@ const StorageSection = () => { const handleStorageServiceUpdate = async (event: React.MouseEvent, storage: Storage) => { event.preventDefault(); - showUpdateStorageServiceDialog(storage); + showCreateStorageServiceDialog(storage); }; return ( -
-

{t("setting.storage-section.storage-services-list")}

+
+
+ {t("setting.storage-section.storage-services-list")} + +
{storages.map((storage) => ( -
); }; diff --git a/web/src/components/UpdateStorageServiceDialog.tsx b/web/src/components/UpdateStorageServiceDialog.tsx deleted file mode 100644 index e7ba2038..00000000 --- a/web/src/components/UpdateStorageServiceDialog.tsx +++ /dev/null @@ -1,189 +0,0 @@ -import { Button, Input, Typography } from "@mui/joy"; -import { useTranslation } from "react-i18next"; -import { useState } from "react"; -import Icon from "./Icon"; -import { generateDialog } from "./Dialog"; -import { showCommonDialog } from "./Dialog/CommonDialog"; -import { useStorageStore } from "../store/module"; -import toastHelper from "./Toast"; - -interface Props extends DialogProps { - storage: StoragePatch; -} - -const UpdateStorageServiceDialog: React.FC = (props: Props) => { - const { storage, destroy } = props; - const { t } = useTranslation(); - const storageStore = useStorageStore(); - const [storagePatch, setStoragePatch] = useState(storage); - - const handleCloseBtnClick = () => { - destroy(); - }; - - const allowConfirmAction = () => { - if ( - storagePatch.name === "" || - storagePatch.endPoint === "" || - storagePatch.region === "" || - storagePatch.accessKey === "" || - storagePatch.bucket === "" || - storagePatch.bucket === "" - ) { - return false; - } - return true; - }; - - const handleConfirmBtnClick = async () => { - try { - await storageStore.patchStorage(storagePatch); - } catch (error: any) { - console.error(error); - toastHelper.error(error.response.data.message); - } - destroy(); - }; - - const handleDeleteBtnClick = async () => { - const warningText = t("setting.storage-section.warning-text"); - showCommonDialog({ - title: t("setting.storage-section.delete-storage"), - content: warningText, - style: "warning", - dialogName: "delete-storage-dialog", - onConfirm: async () => { - try { - await storageStore.deleteStorageById(storagePatch.id); - } catch (error: any) { - console.error(error); - toastHelper.error(error.response.data.message); - } - destroy(); - }, - }); - }; - - const handleNameChange = (event: React.ChangeEvent) => { - const name = event.target.value; - setStoragePatch({ - ...storagePatch, - name, - }); - }; - - const handleEndPointChange = (event: React.ChangeEvent) => { - const endPoint = event.target.value; - setStoragePatch({ - ...storagePatch, - endPoint, - }); - }; - - const handleRegionChange = (event: React.ChangeEvent) => { - const region = event.target.value; - setStoragePatch({ - ...storagePatch, - region, - }); - }; - - const handleAccessKeyChange = (event: React.ChangeEvent) => { - const accessKey = event.target.value; - setStoragePatch({ - ...storagePatch, - accessKey, - }); - }; - - const handleSecretKeyChange = (event: React.ChangeEvent) => { - const secretKey = event.target.value; - setStoragePatch({ - ...storagePatch, - secretKey, - }); - }; - - const handleBucketChange = (event: React.ChangeEvent) => { - const bucket = event.target.value; - setStoragePatch({ - ...storagePatch, - bucket, - }); - }; - - const handleURLPrefixChange = (event: React.ChangeEvent) => { - const urlPrefix = event.target.value; - setStoragePatch({ - ...storagePatch, - urlPrefix, - }); - }; - - return ( - <> -
-

{t("setting.storage-section.update-a-service")}

- -
-
- - Name - - - - EndPoint - - - - Region - - - - AccessKey - - - - SecretKey - - - - Bucket - - - - URLPrefix - - -
- -
- - -
-
-
- - ); -}; - -function showUpdateStorageServiceDialog(storage: Storage) { - generateDialog( - { - className: "update-storage-service-dialog", - dialogName: "update-storage-service-dialog", - }, - UpdateStorageServiceDialog, - { storage } - ); -} - -export default showUpdateStorageServiceDialog; diff --git a/web/src/less/settings/storage-section.less b/web/src/less/settings/storage-section.less deleted file mode 100644 index 4389a9b5..00000000 --- a/web/src/less/settings/storage-section.less +++ /dev/null @@ -1,14 +0,0 @@ -.storage-section-container { - > .title-text { - @apply mt-4 first:mt-1; - } - - > .form-label.selector { - @apply mb-2 flex flex-row justify-between items-center; - - > .normal-text { - @apply mr-2 text-sm; - } - } - } - \ No newline at end of file