import type { DmsPermissionResource } from '#/api/x/dms/permission';
|
|
export interface FolderClipboard {
|
mode: 'copy' | 'cut';
|
source: DmsPermissionResource;
|
}
|
|
export interface FolderMenuAvailability {
|
canDelete: boolean;
|
canMoveDown: boolean;
|
canMoveUp: boolean;
|
canPaste: boolean;
|
}
|
|
export function folderMenuAvailability(
|
folder: DmsPermissionResource,
|
siblings: DmsPermissionResource[],
|
path: DmsPermissionResource[],
|
clipboard?: FolderClipboard,
|
): FolderMenuAvailability {
|
const index = siblings.findIndex((item) => item.id === folder.id);
|
const source = clipboard?.source;
|
const targetContainsSource = !!source && path.some((item) => item.id === source.id);
|
const sameParentMove = clipboard?.mode === 'cut' && source?.parentId === folder.id;
|
|
return {
|
canDelete: !!folder.parentId,
|
canMoveDown: index !== -1 && index < siblings.length - 1,
|
canMoveUp: index > 0,
|
canPaste: !!clipboard && clipboard.source.id !== folder.id && !targetContainsSource && !sameParentMove && !(clipboard.mode === 'cut' && !source?.parentId),
|
};
|
}
|
|
export function compareFolders(left: DmsPermissionResource, right: DmsPermissionResource) {
|
const sortDiff = (left.sortCode ?? Number.MAX_SAFE_INTEGER) - (right.sortCode ?? Number.MAX_SAFE_INTEGER);
|
return sortDiff || left.id.localeCompare(right.id);
|
}
|