Showing
2 changed files
with
80 additions
and
32 deletions
1 | -import React from "react"; | 1 | +import React, { useCallback } from "react"; |
2 | -import { Table } from "antd"; | 2 | +import { Table, Popconfirm, message } from "antd"; |
3 | import { ColumnsType } from "antd/lib/table"; | 3 | import { ColumnsType } from "antd/lib/table"; |
4 | import filesize from "filesize"; | 4 | import filesize from "filesize"; |
5 | 5 | ||
6 | import { useParams } from "react-router-dom"; | 6 | import { useParams } from "react-router-dom"; |
7 | import { useFileList, FileItem } from "./useFileList"; | 7 | import { useFileList, FileItem } from "./useFileList"; |
8 | +import { useApi } from "util/useApi"; | ||
8 | import { FileListItem } from "./FileListItem"; | 9 | import { FileListItem } from "./FileListItem"; |
9 | 10 | ||
10 | import styles from "./FileList.module.scss"; | 11 | import styles from "./FileList.module.scss"; |
11 | 12 | ||
12 | -const columns: ColumnsType<FileItem> = [ | 13 | +export function FileList() { |
14 | + const id = useParams<{ id: string }>().id; | ||
15 | + const { data, reload } = useFileList(id); | ||
16 | + | ||
17 | + const api = useApi(); | ||
18 | + | ||
19 | + const handleDelete = useCallback( | ||
20 | + async (id: number) => { | ||
21 | + await api.delete(`/items/${id}/`); | ||
22 | + await reload(); | ||
23 | + message.info("삭제되었습니다"); | ||
24 | + }, | ||
25 | + [api, reload] | ||
26 | + ); | ||
27 | + | ||
28 | + if (!data) { | ||
29 | + return null; | ||
30 | + } | ||
31 | + | ||
32 | + const list = [...data.list].sort((itemA, itemB) => | ||
33 | + itemA.is_folder === itemB.is_folder ? 0 : itemA.is_folder ? -1 : 1 | ||
34 | + ); | ||
35 | + | ||
36 | + if (data.parent !== null) { | ||
37 | + list.unshift(({ | ||
38 | + id: data.parent, | ||
39 | + is_folder: true, | ||
40 | + name: "..", | ||
41 | + file_type: "folder", | ||
42 | + } as unknown) as FileItem); | ||
43 | + } | ||
44 | + | ||
45 | + return ( | ||
46 | + <div> | ||
47 | + {data.parent !== null && <h3>{data.name}</h3>} | ||
48 | + <Table | ||
49 | + rowKey="id" | ||
50 | + columns={getColumns({ | ||
51 | + handleDelete, | ||
52 | + })} | ||
53 | + dataSource={list} | ||
54 | + pagination={false} | ||
55 | + /> | ||
56 | + </div> | ||
57 | + ); | ||
58 | +} | ||
59 | + | ||
60 | +type GetColumnsParams = { | ||
61 | + handleDelete: (id: number) => void; | ||
62 | +}; | ||
63 | + | ||
64 | +function getColumns({ handleDelete }: GetColumnsParams): ColumnsType<FileItem> { | ||
65 | + return [ | ||
13 | { | 66 | { |
14 | title: "파일명", | 67 | title: "파일명", |
68 | + key: "name", | ||
15 | dataIndex: "name", | 69 | dataIndex: "name", |
16 | render: (_name: string, item) => <FileListItem item={item} />, | 70 | render: (_name: string, item) => <FileListItem item={item} />, |
17 | }, | 71 | }, |
18 | { | 72 | { |
19 | title: "크기", | 73 | title: "크기", |
74 | + key: "size", | ||
20 | dataIndex: "size", | 75 | dataIndex: "size", |
21 | width: 120, | 76 | width: 120, |
22 | render: (bytes: number, item) => | 77 | render: (bytes: number, item) => |
... | @@ -24,6 +79,7 @@ const columns: ColumnsType<FileItem> = [ | ... | @@ -24,6 +79,7 @@ const columns: ColumnsType<FileItem> = [ |
24 | }, | 79 | }, |
25 | { | 80 | { |
26 | title: "", | 81 | title: "", |
82 | + key: "action", | ||
27 | dataIndex: "", | 83 | dataIndex: "", |
28 | width: 200, | 84 | width: 200, |
29 | render: (__: any, item) => | 85 | render: (__: any, item) => |
... | @@ -32,37 +88,16 @@ const columns: ColumnsType<FileItem> = [ | ... | @@ -32,37 +88,16 @@ const columns: ColumnsType<FileItem> = [ |
32 | <a>공유</a> | 88 | <a>공유</a> |
33 | <a>이동</a> | 89 | <a>이동</a> |
34 | <a>복사</a> | 90 | <a>복사</a> |
91 | + <Popconfirm | ||
92 | + title="정말로 삭제하시겠습니까?" | ||
93 | + onConfirm={() => handleDelete(item.id)} | ||
94 | + okText="삭제" | ||
95 | + cancelText="취소" | ||
96 | + > | ||
35 | <a>삭제</a> | 97 | <a>삭제</a> |
98 | + </Popconfirm> | ||
36 | </div> | 99 | </div> |
37 | ), | 100 | ), |
38 | }, | 101 | }, |
39 | -]; | 102 | + ]; |
40 | - | ||
41 | -export function FileList() { | ||
42 | - const id = useParams<{ id: string }>().id; | ||
43 | - const { data } = useFileList(id); | ||
44 | - | ||
45 | - if (!data) { | ||
46 | - return null; | ||
47 | - } | ||
48 | - | ||
49 | - const list = [...data.list].sort((itemA, itemB) => | ||
50 | - itemA.is_folder === itemB.is_folder ? 0 : itemA.is_folder ? -1 : 1 | ||
51 | - ); | ||
52 | - | ||
53 | - if (data.parent !== null) { | ||
54 | - list.unshift(({ | ||
55 | - id: data.parent, | ||
56 | - is_folder: true, | ||
57 | - name: "..", | ||
58 | - file_type: "folder", | ||
59 | - } as unknown) as FileItem); | ||
60 | - } | ||
61 | - | ||
62 | - return ( | ||
63 | - <div> | ||
64 | - {data.parent !== null && <h3>{data.name}</h3>} | ||
65 | - <Table columns={columns} dataSource={list} pagination={false} /> | ||
66 | - </div> | ||
67 | - ); | ||
68 | } | 103 | } | ... | ... |
-
Please register or login to post a comment