Skip to content

Commit de9ec1e

Browse files
committed
Confirmation when deleting files via dropdown menu; closes pterodactyl#2293
1 parent 981edb0 commit de9ec1e

File tree

1 file changed

+51
-38
lines changed

1 file changed

+51
-38
lines changed

resources/scripts/components/server/files/FileDropdownMenu.tsx

Lines changed: 51 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import useEventListener from '@/plugins/useEventListener';
2929
import compressFiles from '@/api/server/files/compressFiles';
3030
import decompressFiles from '@/api/server/files/decompressFiles';
3131
import isEqual from 'react-fast-compare';
32+
import ConfirmationModal from '@/components/elements/ConfirmationModal';
3233

3334
type ModalType = 'rename' | 'move';
3435

@@ -54,6 +55,7 @@ const FileDropdownMenu = ({ file }: { file: FileObject }) => {
5455
const onClickRef = useRef<DropdownMenu>(null);
5556
const [ showSpinner, setShowSpinner ] = useState(false);
5657
const [ modal, setModal ] = useState<ModalType | null>(null);
58+
const [ showConfirmation, setShowConfirmation ] = useState(false);
5759

5860
const uuid = ServerContext.useStoreState(state => state.server.data!.uuid);
5961
const { mutate } = useFileManagerSwr();
@@ -123,47 +125,58 @@ const FileDropdownMenu = ({ file }: { file: FileObject }) => {
123125
};
124126

125127
return (
126-
<DropdownMenu
127-
ref={onClickRef}
128-
renderToggle={onClick => (
129-
<div css={tw`p-3 hover:text-white`} onClick={onClick}>
130-
<FontAwesomeIcon icon={faEllipsisH}/>
131-
{!!modal &&
132-
<RenameFileModal
133-
visible
134-
appear
135-
files={[ file.name ]}
136-
useMoveTerminology={modal === 'move'}
137-
onDismissed={() => setModal(null)}
138-
/>
139-
}
140-
<SpinnerOverlay visible={showSpinner} fixed size={'large'}/>
141-
</div>
142-
)}
143-
>
144-
<Can action={'file.update'}>
145-
<Row onClick={() => setModal('rename')} icon={faPencilAlt} title={'Rename'}/>
146-
<Row onClick={() => setModal('move')} icon={faLevelUpAlt} title={'Move'}/>
147-
</Can>
148-
{file.isFile &&
149-
<Can action={'file.create'}>
150-
<Row onClick={doCopy} icon={faCopy} title={'Copy'}/>
151-
</Can>
152-
}
153-
{file.isArchiveType() ?
128+
<>
129+
<ConfirmationModal
130+
visible={showConfirmation}
131+
title={`Delete this ${file.isFile ? 'File' : 'Directory'}?`}
132+
buttonText={`Yes, Delete ${file.isFile ? 'File' : 'Directory'}`}
133+
onConfirmed={doDeletion}
134+
onModalDismissed={() => setShowConfirmation(false)}
135+
>
136+
Deleting files is a permanent operation, you cannot undo this action.
137+
</ConfirmationModal>
138+
<DropdownMenu
139+
ref={onClickRef}
140+
renderToggle={onClick => (
141+
<div css={tw`p-3 hover:text-white`} onClick={onClick}>
142+
<FontAwesomeIcon icon={faEllipsisH}/>
143+
{!!modal &&
144+
<RenameFileModal
145+
visible
146+
appear
147+
files={[ file.name ]}
148+
useMoveTerminology={modal === 'move'}
149+
onDismissed={() => setModal(null)}
150+
/>
151+
}
152+
<SpinnerOverlay visible={showSpinner} fixed size={'large'}/>
153+
</div>
154+
)}
155+
>
156+
<Can action={'file.update'}>
157+
<Row onClick={() => setModal('rename')} icon={faPencilAlt} title={'Rename'}/>
158+
<Row onClick={() => setModal('move')} icon={faLevelUpAlt} title={'Move'}/>
159+
</Can>
160+
{file.isFile &&
154161
<Can action={'file.create'}>
155-
<Row onClick={doUnarchive} icon={faBoxOpen} title={'Unarchive'}/>
162+
<Row onClick={doCopy} icon={faCopy} title={'Copy'}/>
156163
</Can>
157-
:
158-
<Can action={'file.archive'}>
159-
<Row onClick={doArchive} icon={faFileArchive} title={'Archive'}/>
164+
}
165+
{file.isArchiveType() ?
166+
<Can action={'file.create'}>
167+
<Row onClick={doUnarchive} icon={faBoxOpen} title={'Unarchive'}/>
168+
</Can>
169+
:
170+
<Can action={'file.archive'}>
171+
<Row onClick={doArchive} icon={faFileArchive} title={'Archive'}/>
172+
</Can>
173+
}
174+
<Row onClick={doDownload} icon={faFileDownload} title={'Download'}/>
175+
<Can action={'file.delete'}>
176+
<Row onClick={() => setShowConfirmation(true)} icon={faTrashAlt} title={'Delete'} $danger/>
160177
</Can>
161-
}
162-
<Row onClick={doDownload} icon={faFileDownload} title={'Download'}/>
163-
<Can action={'file.delete'}>
164-
<Row onClick={doDeletion} icon={faTrashAlt} title={'Delete'} $danger/>
165-
</Can>
166-
</DropdownMenu>
178+
</DropdownMenu>
179+
</>
167180
);
168181
};
169182

0 commit comments

Comments
 (0)