diff --git a/public/locales/en-US/application.json b/public/locales/en-US/application.json index 9264bd9..91e8255 100644 --- a/public/locales/en-US/application.json +++ b/public/locales/en-US/application.json @@ -475,6 +475,8 @@ "defaultEncoding": "Default", "chineseMajorEncoding": "", "selectEncoding": "ZIP file encoding", + "password": "Password", + "passwordDescription": "If the archive file is not encrypted, please leave this field empty.", "noEncodingSelected": "No encoding method selected", "listingFiles": "Listing files...", "listingFileError": "Failed to list files: {{message}}", diff --git a/public/locales/ja-JP/application.json b/public/locales/ja-JP/application.json index a4a83b8..baf3fed 100644 --- a/public/locales/ja-JP/application.json +++ b/public/locales/ja-JP/application.json @@ -475,6 +475,8 @@ "defaultEncoding": "デフォルト", "chineseMajorEncoding": "", "selectEncoding": "ZIPファイルエンコード", + "password": "圧縮ファイルパスワード", + "passwordDescription": "圧縮ファイルが暗号化されていない場合、ここは空のままにしてください。", "noEncodingSelected": "エンコード方式を選択していません", "listingFiles": "ファイル一覧取得中...", "listingFileError": "ファイル一覧取得中にエラーが発生しました:{{message}}", diff --git a/public/locales/zh-CN/application.json b/public/locales/zh-CN/application.json index 712041f..a5dc787 100644 --- a/public/locales/zh-CN/application.json +++ b/public/locales/zh-CN/application.json @@ -475,6 +475,8 @@ "defaultEncoding": "缺省", "chineseMajorEncoding": "简体中文常见编码", "selectEncoding": "ZIP 文件编码", + "password": "压缩文件密码", + "passwordDescription": "如果加压缩文件未加密,此处请留空。", "noEncodingSelected": "未选择编码方式", "listingFiles": "列取文件中...", "listingFileError": "列取文件时出错:{{message}}", diff --git a/public/locales/zh-TW/application.json b/public/locales/zh-TW/application.json index 21b38a4..07c2772 100644 --- a/public/locales/zh-TW/application.json +++ b/public/locales/zh-TW/application.json @@ -471,6 +471,8 @@ "defaultEncoding": "預設", "chineseMajorEncoding": "簡體中文常見編碼", "selectEncoding": "ZIP 檔案編碼", + "password": "壓縮檔案密碼", + "passwordDescription": "如果壓縮檔案未加密,此處請留空。", "noEncodingSelected": "未選擇編碼方式", "listingFiles": "列取檔案中...", "listingFileError": "列取檔案時出錯:{{message}}", diff --git a/src/api/workflow.ts b/src/api/workflow.ts index 65362d9..f6c0852 100644 --- a/src/api/workflow.ts +++ b/src/api/workflow.ts @@ -4,6 +4,7 @@ export interface ArchiveWorkflowService { src: string[]; dst: string; encoding?: string; + password?: string; } export interface TaskListResponse { diff --git a/src/component/FileManager/ContextMenu/useActionDisplayOpt.ts b/src/component/FileManager/ContextMenu/useActionDisplayOpt.ts index fda9fd8..9e29a02 100644 --- a/src/component/FileManager/ContextMenu/useActionDisplayOpt.ts +++ b/src/component/FileManager/ContextMenu/useActionDisplayOpt.ts @@ -11,7 +11,7 @@ import Boolset from "../../../util/boolset.ts"; import CrUri, { Filesystem } from "../../../util/uri.ts"; import { FileManagerIndex } from "../FileManager.tsx"; -const supportedArchiveTypes = ["zip", "gz", "xz", "tar", "rar"]; +const supportedArchiveTypes = ["zip", "gz", "xz", "tar", "rar", "7z", "bz2"]; export const canManageVersion = (file: FileResponse, bs: Boolset) => { return ( diff --git a/src/component/FileManager/Dialogs/ExtractArchive.tsx b/src/component/FileManager/Dialogs/ExtractArchive.tsx index cbef168..772a8ac 100644 --- a/src/component/FileManager/Dialogs/ExtractArchive.tsx +++ b/src/component/FileManager/Dialogs/ExtractArchive.tsx @@ -1,11 +1,12 @@ import { DialogContent, FormControl, + Grid2, InputAdornment, InputLabel, MenuItem, Select, - Stack, + TextField, useMediaQuery, useTheme, } from "@mui/material"; @@ -20,11 +21,11 @@ import { FileDisplayForm } from "../../Common/Form/FileDisplayForm.tsx"; import { PathSelectorForm } from "../../Common/Form/PathSelectorForm.tsx"; import { ViewTaskAction } from "../../Common/Snackbar/snackbar.tsx"; import DraggableDialog from "../../Dialogs/DraggableDialog.tsx"; +import Password from "../../Icons/Password.tsx"; import Translate from "../../Icons/Translate.tsx"; import { FileManagerIndex } from "../FileManager.tsx"; const encodings = [ - "gb18030", "ibm866", "iso8859_2", "iso8859_3", @@ -54,6 +55,7 @@ const encodings = [ "windows1258", "macintoshcyrillic", "gbk", + "gb18030", "big5", "eucjp", "iso2022jp", @@ -75,13 +77,21 @@ const ExtractArchive = () => { const [loading, setLoading] = useState(false); const [path, setPath] = useState(""); const [encoding, setEncoding] = useState(defaultEncodingValue); + const [password, setPassword] = useState(""); + const [showPassword, setShowPassword] = useState(false); const open = useAppSelector((state) => state.globalState.extractArchiveDialogOpen); const target = useAppSelector((state) => state.globalState.extractArchiveDialogFile); const current = useAppSelector((state) => state.fileManager[FileManagerIndex.main].pure_path); const showEncodingOption = useMemo(() => { - return fileExtension(target?.name ?? "") === "zip"; + const ext = fileExtension(target?.name ?? ""); + return ext === "zip"; + }, [target?.name]); + + const showPasswordOption = useMemo(() => { + const ext = fileExtension(target?.name ?? ""); + return ext === "zip" || ext === "7z"; }, [target?.name]); useEffect(() => { @@ -105,6 +115,7 @@ const ExtractArchive = () => { src: [getFileLinkedUri(target)], dst: path, encoding: showEncodingOption && encoding != defaultEncodingValue ? encoding : undefined, + password: showPasswordOption && password ? password : undefined, }), ) .then(() => { @@ -118,7 +129,7 @@ const ExtractArchive = () => { .finally(() => { setLoading(false); }); - }, [target, encoding, path, showEncodingOption]); + }, [target, encoding, path, showPasswordOption, showEncodingOption, password]); return ( { }} > - - - {target && } - {showEncodingOption && ( + + {target && ( + + + + )} + {showEncodingOption && ( + {t("modals.selectEncoding")} - )} - - + + )} + - - + + {showPasswordOption && ( + + + + + ), + }, + }} + fullWidth + placeholder={t("application:modals.passwordDescription")} + label={t("modals.password")} + value={password} + onChange={(e) => setPassword(e.target.value)} + /> + + )} + );