Small fixes
This commit is contained in:
		@@ -113,6 +113,7 @@ function createNewFolderDialog() {
 | 
			
		||||
		</n-gi>
 | 
			
		||||
		<n-gi span="2">
 | 
			
		||||
			<DirViewerTable
 | 
			
		||||
				:current-node="node"
 | 
			
		||||
				:nodes="nodes"
 | 
			
		||||
				:show-preview="showPreview"
 | 
			
		||||
				@reloadNode="emit('reloadNode')"
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ import type {
 | 
			
		||||
import type { SummaryCell } from 'naive-ui/es/data-table/src/interface';
 | 
			
		||||
import { inject, ref, nextTick, Suspense } from 'vue';
 | 
			
		||||
import filesize from 'filesize';
 | 
			
		||||
import { check_token, FS } from '@/api';
 | 
			
		||||
import { check_token, FS, isErrorResponse } from '@/api';
 | 
			
		||||
import { loadingMsgWrapper } from '@/utils';
 | 
			
		||||
import {
 | 
			
		||||
	useMessage,
 | 
			
		||||
@@ -31,7 +31,8 @@ import {
 | 
			
		||||
	FolderParent,
 | 
			
		||||
	DocumentBlank,
 | 
			
		||||
	Delete,
 | 
			
		||||
	Download
 | 
			
		||||
	Download,
 | 
			
		||||
	Cut
 | 
			
		||||
} from '@vicons/carbon';
 | 
			
		||||
import semaphore from 'semaphore';
 | 
			
		||||
import NLink from '@/components/NLink.vue';
 | 
			
		||||
@@ -56,6 +57,7 @@ type DropdownOptionsType = Array<
 | 
			
		||||
>;
 | 
			
		||||
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
	currentNode: Responses.GetNode;
 | 
			
		||||
	nodes: Responses.GetNodeEntry[];
 | 
			
		||||
	showPreview: boolean;
 | 
			
		||||
}>();
 | 
			
		||||
@@ -65,6 +67,7 @@ const checkedRows = ref<number[]>([]);
 | 
			
		||||
const deleteNodes = ref<number[]>([]);
 | 
			
		||||
const deleteDialog = ref();
 | 
			
		||||
const deleteDialogShow = ref(false);
 | 
			
		||||
const cutNodes = ref<number[]>([]);
 | 
			
		||||
 | 
			
		||||
const dropdownX = ref(0);
 | 
			
		||||
const dropdownY = ref(0);
 | 
			
		||||
@@ -82,6 +85,15 @@ const dropdownOptionsFolder: DropdownOptionsType = [
 | 
			
		||||
			</NIcon>
 | 
			
		||||
		)
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		label: () => <NText>Cut</NText>,
 | 
			
		||||
		key: 'cut',
 | 
			
		||||
		icon: () => (
 | 
			
		||||
			<NIcon>
 | 
			
		||||
				<Cut />
 | 
			
		||||
			</NIcon>
 | 
			
		||||
		)
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		label: () => <NText type="error">Delete</NText>,
 | 
			
		||||
		key: 'delete',
 | 
			
		||||
@@ -102,6 +114,15 @@ const dropdownOptionsFile: DropdownOptionsType = [
 | 
			
		||||
			</NIcon>
 | 
			
		||||
		)
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		label: () => <NText>Cut</NText>,
 | 
			
		||||
		key: 'cut',
 | 
			
		||||
		icon: () => (
 | 
			
		||||
			<NIcon>
 | 
			
		||||
				<Cut />
 | 
			
		||||
			</NIcon>
 | 
			
		||||
		)
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		label: () => <NText type="error">Delete</NText>,
 | 
			
		||||
		key: 'delete',
 | 
			
		||||
@@ -124,6 +145,9 @@ const dropdownSelect = loadingMsgWrapper(message, async (key: string) => {
 | 
			
		||||
				await FS.download_file(token, dropdownCurrentNode.id);
 | 
			
		||||
			else createZipDialog([dropdownCurrentNode.id], dialog, jwt);
 | 
			
		||||
			break;
 | 
			
		||||
		case 'cut':
 | 
			
		||||
			cutNodes.value = [dropdownCurrentNode.id];
 | 
			
		||||
			break;
 | 
			
		||||
		case 'delete':
 | 
			
		||||
			dialog.warning({
 | 
			
		||||
				title: 'Really delete?',
 | 
			
		||||
@@ -269,19 +293,45 @@ const massDelete = loadingMsgWrapper(message, async () => {
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function massCut() {
 | 
			
		||||
	cutNodes.value = checkedRows.value;
 | 
			
		||||
	checkedRows.value = [];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const pasteNodes = loadingMsgWrapper(message, async () => {
 | 
			
		||||
	const token = await check_token(jwt);
 | 
			
		||||
	if (!token) return;
 | 
			
		||||
	const res = await FS.move(token, cutNodes.value, props.currentNode.id);
 | 
			
		||||
	cutNodes.value = [];
 | 
			
		||||
	if (isErrorResponse(res)) {
 | 
			
		||||
		message.error(`Failed to move nodes: ${res.message}`);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	emit('reloadNode');
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const selectionCell = (): SummaryCell => {
 | 
			
		||||
	return {
 | 
			
		||||
		value:
 | 
			
		||||
			checkedRows.value.length != 0 ? (
 | 
			
		||||
				<NButtonGroup>
 | 
			
		||||
					<NButton onClick={massDownload}>Download</NButton>
 | 
			
		||||
					<NButton onClick={massDelete} type="error">
 | 
			
		||||
						Delete
 | 
			
		||||
					</NButton>
 | 
			
		||||
				</NButtonGroup>
 | 
			
		||||
			) : (
 | 
			
		||||
				''
 | 
			
		||||
			),
 | 
			
		||||
		value: (
 | 
			
		||||
			<NButtonGroup>
 | 
			
		||||
				{cutNodes.value.length != 0 ? (
 | 
			
		||||
					<NButton onClick={pasteNodes}>Paste</NButton>
 | 
			
		||||
				) : (
 | 
			
		||||
					''
 | 
			
		||||
				)}
 | 
			
		||||
				{checkedRows.value.length != 0 ? (
 | 
			
		||||
					<>
 | 
			
		||||
						<NButton onClick={massDownload}>Download</NButton>
 | 
			
		||||
						<NButton onClick={massCut}>Cut</NButton>
 | 
			
		||||
						<NButton onClick={massDelete} type="error">
 | 
			
		||||
							Delete
 | 
			
		||||
						</NButton>
 | 
			
		||||
					</>
 | 
			
		||||
				) : (
 | 
			
		||||
					''
 | 
			
		||||
				)}
 | 
			
		||||
			</NButtonGroup>
 | 
			
		||||
		),
 | 
			
		||||
		colSpan: props.showPreview ? 2 : 1
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user