|
@@ -1,12 +1,17 @@
|
|
import styles from "./DuplicateFile.module.less";
|
|
import styles from "./DuplicateFile.module.less";
|
|
-import { Col, Row, Button, message, Table, Select, Space, Modal, Input } from "antd";
|
|
|
|
|
|
+import { Col, Row, Button, message, Table, Select, Space, Modal, Input, Checkbox, GetProp } from "antd";
|
|
import { useEffect, useState } from "react";
|
|
import { useEffect, useState } from "react";
|
|
const { Option } = Select;
|
|
const { Option } = Select;
|
|
|
|
+import { open } from "@tauri-apps/api/dialog";
|
|
|
|
+import File from "@/plugins/tauri-plugin-file/file";
|
|
import { historyListType, insertSearchFilesPasamsType } from "@/types/files";
|
|
import { historyListType, insertSearchFilesPasamsType } from "@/types/files";
|
|
import { CopyText } from "@/components/Table/CopyText";
|
|
import { CopyText } from "@/components/Table/CopyText";
|
|
-import { PlusCircleOutlined } from '@ant-design/icons';
|
|
|
|
|
|
+import { PlusCircleOutlined, RedoOutlined } from '@ant-design/icons';
|
|
|
|
+import { appDataDir } from "@tauri-apps/api/path";
|
|
|
|
+import { File_APPLICATION_TYPE, File_AUDIO_TYPE, File_COMPRESSED_TYPE, File_DOCUMENT_TYPE, File_IMAGE_TYPE, File_VIDEO_TYPE } from "@/config";
|
|
|
|
|
|
const { Search } = Input;
|
|
const { Search } = Input;
|
|
|
|
+const { TextArea } = Input;
|
|
|
|
|
|
export default function DuplicateFile() {
|
|
export default function DuplicateFile() {
|
|
const [usePath, setUsePath] = useState<string>(
|
|
const [usePath, setUsePath] = useState<string>(
|
|
@@ -55,10 +60,53 @@ export default function DuplicateFile() {
|
|
),
|
|
),
|
|
},
|
|
},
|
|
];
|
|
];
|
|
|
|
+ const fileTypeList = [
|
|
|
|
+ {
|
|
|
|
+ name: '音频',
|
|
|
|
+ valus: File_AUDIO_TYPE
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: '视频',
|
|
|
|
+ valus: File_VIDEO_TYPE
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: '文档',
|
|
|
|
+ valus: File_DOCUMENT_TYPE
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: '图片',
|
|
|
|
+ valus: File_IMAGE_TYPE
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: '应用程序',
|
|
|
|
+ valus: File_APPLICATION_TYPE
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ name: '压缩包',
|
|
|
|
+ valus: File_COMPRESSED_TYPE
|
|
|
|
+ }
|
|
|
|
+ ]
|
|
|
|
|
|
|
|
|
|
- function sort() {
|
|
|
|
|
|
+ async function getDir() {
|
|
|
|
+ // 打开本地的系统目录,暂时不支持多选
|
|
|
|
+ const selected = await open({
|
|
|
|
+ directory: true,
|
|
|
|
+ multiple: false,
|
|
|
|
+ defaultPath: await appDataDir(),
|
|
|
|
+ });
|
|
|
|
|
|
|
|
+ if (selected && selected.length) {
|
|
|
|
+ setFileInfo({
|
|
|
|
+ ...fileInfo,
|
|
|
|
+ path: selected
|
|
|
|
+ })
|
|
|
|
+ // setUsePath(`${selected}`);
|
|
|
|
+ // 最多记录 100 条用户操作的历史数据
|
|
|
|
+ // const files = await File.getAllList(`${selected}`);
|
|
|
|
+ }
|
|
|
|
+ // await invoke("file_sort", { path: selected });
|
|
|
|
+ // setFile([...fileStr, await invoke("file_sort", { path: selected })]);
|
|
}
|
|
}
|
|
|
|
|
|
function historyHandleChange() {
|
|
function historyHandleChange() {
|
|
@@ -67,17 +115,121 @@ export default function DuplicateFile() {
|
|
|
|
|
|
function opens() {}
|
|
function opens() {}
|
|
function handleOk() {}
|
|
function handleOk() {}
|
|
- function handleCancel() {}
|
|
|
|
|
|
+ function handleCancel() {
|
|
|
|
+ setFileInfo({});
|
|
|
|
+ setIsModalOpen(false);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const onTypesChange: GetProp<typeof Checkbox.Group, 'onChange'> = (checkedValues) => {
|
|
|
|
+ console.log('checked = ', checkedValues);
|
|
|
|
+ setFileInfo({
|
|
|
|
+ ...fileInfo,
|
|
|
|
+ checkedTypeValues: checkedValues
|
|
|
|
+ })
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ const onAddTypeChange = (types: string) => {
|
|
|
|
+ setFileInfo({
|
|
|
|
+ ...fileInfo,
|
|
|
|
+ addType: types
|
|
|
|
+ })
|
|
|
|
+ };
|
|
|
|
+ const onPassTypeChange = (types: string) => {
|
|
|
|
+ setFileInfo({
|
|
|
|
+ ...fileInfo,
|
|
|
|
+ passType: types
|
|
|
|
+ })
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ const checkboxAll = () => {
|
|
|
|
+ const otherTypes = ['其他所有带扩展名的类型', '其他所有无扩展名的类型', '指定', '排除'];
|
|
|
|
+ const checkedValues = fileTypeList.map(typeInfo => typeInfo.name)
|
|
|
|
+ setFileInfo({
|
|
|
|
+ ...fileInfo,
|
|
|
|
+ checkboxAll: !fileInfo.checkboxAll,
|
|
|
|
+ checkedTypeValues: fileInfo.checkboxAll ? []: [...checkedValues, ...otherTypes]
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
|
|
return (
|
|
return (
|
|
<div className={styles.DuplicateFileBox}>
|
|
<div className={styles.DuplicateFileBox}>
|
|
-
|
|
|
|
<Modal title="添加目录" open={isModalOpen} onOk={handleOk} onCancel={handleCancel}>
|
|
<Modal title="添加目录" open={isModalOpen} onOk={handleOk} onCancel={handleCancel}>
|
|
<Row align="middle">
|
|
<Row align="middle">
|
|
<span>文件路径:</span>
|
|
<span>文件路径:</span>
|
|
<Row justify="space-around" align="middle">
|
|
<Row justify="space-around" align="middle">
|
|
- <span>{fileInfo.path || ''}</span>
|
|
|
|
- <Col><PlusCircleOutlined /></Col>
|
|
|
|
|
|
+ <span className={styles.filePath}>{fileInfo.path || ''}</span>
|
|
|
|
+ <Col>
|
|
|
|
+ {
|
|
|
|
+ fileInfo.path ? <RedoOutlined className={styles.iconHover} onClick={() => getDir()}/> : <PlusCircleOutlined className={styles.iconHover} onClick={() => getDir()}/>
|
|
|
|
+ }
|
|
|
|
+ </Col>
|
|
|
|
+ </Row>
|
|
|
|
+ </Row>
|
|
|
|
+ <Row align="top">
|
|
|
|
+ <span>文件类型:</span>
|
|
|
|
+ <Row style={{
|
|
|
|
+ flex: 1,
|
|
|
|
+ padding: '2px 12px'
|
|
|
|
+ }}>
|
|
|
|
+ <Row style={{flex: 1}}><Checkbox onChange={() => checkboxAll() } value={'全选/不选'}>全选/不选</Checkbox></Row>
|
|
|
|
+ <Checkbox.Group onChange={onTypesChange} value={fileInfo.checkedTypeValues}>
|
|
|
|
+ {
|
|
|
|
+ fileTypeList.map((typeInfo) => (
|
|
|
|
+ <Col span={7} >
|
|
|
|
+ <Checkbox value={typeInfo.name}>{typeInfo.name}</Checkbox>
|
|
|
|
+ </Col>
|
|
|
|
+ ))
|
|
|
|
+ }
|
|
|
|
+ <Col span={24} >
|
|
|
|
+ <Checkbox value={'其他所有带扩展名的类型'}>其他所有带扩展名的类型</Checkbox>
|
|
|
|
+ </Col>
|
|
|
|
+ <Col span={24} >
|
|
|
|
+ <Checkbox value={'其他所有无扩展名的类型'}>其他所有无扩展名的类型</Checkbox>
|
|
|
|
+ </Col>
|
|
|
|
+ <Col span={24}>
|
|
|
|
+ <Row style={{flex: 1, marginTop: '8px'}}>
|
|
|
|
+ <Col span={4}>
|
|
|
|
+ <Checkbox value={'指定'}>指定</Checkbox>
|
|
|
|
+ </Col>
|
|
|
|
+ <Col span={20}>
|
|
|
|
+ <TextArea
|
|
|
|
+ value={fileInfo.addType}
|
|
|
|
+ onChange={(e) => onAddTypeChange(e.target.value)}
|
|
|
|
+ placeholder="格式:.扩展名1.扩展名2…"
|
|
|
|
+ autoSize={{ minRows: 3, maxRows: 5 }}
|
|
|
|
+ />
|
|
|
|
+ </Col>
|
|
|
|
+ </Row>
|
|
|
|
+ </Col>
|
|
|
|
+ <Col span={24}>
|
|
|
|
+ <Row style={{flex: 1, marginTop: '8px'}}>
|
|
|
|
+ <Col span={4}>
|
|
|
|
+ <Checkbox value={'排除'}>排除</Checkbox>
|
|
|
|
+ </Col>
|
|
|
|
+ <Col span={20}>
|
|
|
|
+ <TextArea
|
|
|
|
+ value={fileInfo.passType}
|
|
|
|
+ onChange={(e) => onPassTypeChange(e.target.value)}
|
|
|
|
+ placeholder="格式:.扩展名1.扩展名2…"
|
|
|
|
+ autoSize={{ minRows: 3, maxRows: 5 }}
|
|
|
|
+ />
|
|
|
|
+ </Col>
|
|
|
|
+ </Row>
|
|
|
|
+ </Col>
|
|
|
|
+ </Checkbox.Group>
|
|
|
|
+
|
|
|
|
+ </Row>
|
|
|
|
+ </Row>
|
|
|
|
+ <Row align="middle">
|
|
|
|
+ <span>文件大小:</span>
|
|
|
|
+ <Row justify="space-around" align="middle">
|
|
|
|
+ <span className={styles.filePath}>{fileInfo.path || ''}</span>
|
|
|
|
+ <Col>
|
|
|
|
+ {
|
|
|
|
+ fileInfo.path ? <RedoOutlined className={styles.iconHover} onClick={() => getDir()}/> : <PlusCircleOutlined className={styles.iconHover} onClick={() => getDir()}/>
|
|
|
|
+ }
|
|
|
|
+ </Col>
|
|
</Row>
|
|
</Row>
|
|
</Row>
|
|
</Row>
|
|
</Modal>
|
|
</Modal>
|