Showing
2 changed files
with
44 additions
and
3 deletions
| ... | @@ -7,15 +7,18 @@ import { FileListPopover } from "./FileListPopover"; | ... | @@ -7,15 +7,18 @@ import { FileListPopover } from "./FileListPopover"; |
| 7 | export type FileItemActionsProps = { | 7 | export type FileItemActionsProps = { |
| 8 | item: FileItem; | 8 | item: FileItem; |
| 9 | onMove: (id: number, to: number) => void; | 9 | onMove: (id: number, to: number) => void; |
| 10 | + onCopy: (id: number, to: number) => void; | ||
| 10 | onDelete: (id: number) => void; | 11 | onDelete: (id: number) => void; |
| 11 | }; | 12 | }; |
| 12 | 13 | ||
| 13 | export function FileItemActions({ | 14 | export function FileItemActions({ |
| 14 | item, | 15 | item, |
| 15 | onMove, | 16 | onMove, |
| 17 | + onCopy, | ||
| 16 | onDelete, | 18 | onDelete, |
| 17 | }: FileItemActionsProps) { | 19 | }: FileItemActionsProps) { |
| 18 | const [move, setMove] = useState<boolean>(false); | 20 | const [move, setMove] = useState<boolean>(false); |
| 21 | + const [copy, setCopy] = useState<boolean>(false); | ||
| 19 | 22 | ||
| 20 | return ( | 23 | return ( |
| 21 | <div className={styles.actions}> | 24 | <div className={styles.actions}> |
| ... | @@ -48,9 +51,26 @@ export function FileItemActions({ | ... | @@ -48,9 +51,26 @@ export function FileItemActions({ |
| 48 | 이동 | 51 | 이동 |
| 49 | </Button> | 52 | </Button> |
| 50 | </Popover> | 53 | </Popover> |
| 51 | - <Button type="link" size="small"> | 54 | + <Popover |
| 52 | - 복사 | 55 | + title="복사할 폴더를 선택하세요" |
| 53 | - </Button> | 56 | + content={ |
| 57 | + <FileListPopover | ||
| 58 | + root={item.parent} | ||
| 59 | + onSelect={(to: number) => { | ||
| 60 | + onCopy(item.id, to); | ||
| 61 | + setCopy(false); | ||
| 62 | + }} | ||
| 63 | + onCancel={() => setCopy(false)} | ||
| 64 | + /> | ||
| 65 | + } | ||
| 66 | + trigger="click" | ||
| 67 | + visible={copy} | ||
| 68 | + onVisibleChange={setCopy} | ||
| 69 | + > | ||
| 70 | + <Button type="link" size="small"> | ||
| 71 | + 복사 | ||
| 72 | + </Button> | ||
| 73 | + </Popover> | ||
| 54 | <Popconfirm | 74 | <Popconfirm |
| 55 | title="정말로 삭제하시겠습니까?" | 75 | title="정말로 삭제하시겠습니까?" |
| 56 | onConfirm={() => onDelete(item.id)} | 76 | onConfirm={() => onDelete(item.id)} | ... | ... |
| ... | @@ -34,6 +34,23 @@ export function FileList() { | ... | @@ -34,6 +34,23 @@ export function FileList() { |
| 34 | [api, reload] | 34 | [api, reload] |
| 35 | ); | 35 | ); |
| 36 | 36 | ||
| 37 | + const handleCopy = useCallback( | ||
| 38 | + async (id: number, to: number) => { | ||
| 39 | + try { | ||
| 40 | + const body = new URLSearchParams(); | ||
| 41 | + body.set("parent", to.toString(10)); | ||
| 42 | + | ||
| 43 | + await api.post(`/items/${id}/copy/`, { body }); | ||
| 44 | + await reload(); | ||
| 45 | + | ||
| 46 | + message.info("복사되었습니다"); | ||
| 47 | + } catch { | ||
| 48 | + message.error("파일 복사에 실패했습니다"); | ||
| 49 | + } | ||
| 50 | + }, | ||
| 51 | + [api, reload] | ||
| 52 | + ); | ||
| 53 | + | ||
| 37 | const handleDelete = useCallback( | 54 | const handleDelete = useCallback( |
| 38 | async (id: number) => { | 55 | async (id: number) => { |
| 39 | try { | 56 | try { |
| ... | @@ -81,6 +98,7 @@ export function FileList() { | ... | @@ -81,6 +98,7 @@ export function FileList() { |
| 81 | rowKey="id" | 98 | rowKey="id" |
| 82 | columns={getColumns({ | 99 | columns={getColumns({ |
| 83 | handleMove, | 100 | handleMove, |
| 101 | + handleCopy, | ||
| 84 | handleDelete, | 102 | handleDelete, |
| 85 | })} | 103 | })} |
| 86 | dataSource={list} | 104 | dataSource={list} |
| ... | @@ -92,11 +110,13 @@ export function FileList() { | ... | @@ -92,11 +110,13 @@ export function FileList() { |
| 92 | 110 | ||
| 93 | type GetColumnsParams = { | 111 | type GetColumnsParams = { |
| 94 | handleMove: (id: number, to: number) => void; | 112 | handleMove: (id: number, to: number) => void; |
| 113 | + handleCopy: (id: number, to: number) => void; | ||
| 95 | handleDelete: (id: number) => void; | 114 | handleDelete: (id: number) => void; |
| 96 | }; | 115 | }; |
| 97 | 116 | ||
| 98 | function getColumns({ | 117 | function getColumns({ |
| 99 | handleMove, | 118 | handleMove, |
| 119 | + handleCopy, | ||
| 100 | handleDelete, | 120 | handleDelete, |
| 101 | }: GetColumnsParams): ColumnsType<FileItem> { | 121 | }: GetColumnsParams): ColumnsType<FileItem> { |
| 102 | return [ | 122 | return [ |
| ... | @@ -124,6 +144,7 @@ function getColumns({ | ... | @@ -124,6 +144,7 @@ function getColumns({ |
| 124 | <FileItemActions | 144 | <FileItemActions |
| 125 | item={item} | 145 | item={item} |
| 126 | onMove={handleMove} | 146 | onMove={handleMove} |
| 147 | + onCopy={handleCopy} | ||
| 127 | onDelete={handleDelete} | 148 | onDelete={handleDelete} |
| 128 | /> | 149 | /> |
| 129 | ), | 150 | ), | ... | ... |
-
Please register or login to post a comment