From d9d777c4311a034991fc0bd69e81a69ee2d03a75 Mon Sep 17 00:00:00 2001 From: joshuaboud Date: Wed, 25 May 2022 16:12:15 -0300 Subject: [PATCH] work on selection and print escaped names --- .../src/components/DirectoryEntry.vue | 131 ++++++++++++------ 1 file changed, 87 insertions(+), 44 deletions(-) diff --git a/navigator-vue/src/components/DirectoryEntry.vue b/navigator-vue/src/components/DirectoryEntry.vue index 331f8ae..e695dd4 100644 --- a/navigator-vue/src/components/DirectoryEntry.vue +++ b/navigator-vue/src/components/DirectoryEntry.vue @@ -3,42 +3,58 @@ - -
-
- - -
- -
{{ entry.name }}
-
-
- - +
+
+
+ +
-
{{ entry.target?.rawPath ?? '' }}
+ +
+
+
+ + +
+
+
- {{ entry.modeStr }} - {{ entry.owner }} - {{ entry.group }} - {{ entry.sizeHuman }} - {{ entry.ctime?.toLocaleString() ?? '-' }} - {{ entry.mtime?.toLocaleString() ?? '-' }} - {{ entry.atime?.toLocaleString() ?? '-' }} + {{ entry.modeStr }} + {{ entry.owner }} + {{ entry.group }} + {{ entry.sizeHuman }} + {{ entry.ctime?.toLocaleString() ?? '-' }} + {{ entry.mtime?.toLocaleString() ?? '-' }} + {{ entry.atime?.toLocaleString() ?? '-' }} @@ -61,22 +78,23 @@ v-else v-show="show" @dblclick.stop="doubleClickCallback" - @click.stop="$emit('toggleSelected')" - class="flex flex-col items-center w-20 overflow-hidden" + @click.stop.prevent="$emit('toggleSelected', { ctrlKey: $event.ctrlKey, shiftKey: $event.shiftKey })" > -
- -
- +
+
+ +
+ +
+
{{ entry.name }}
-
{{ entry.name }}
@@ -98,6 +116,7 @@ export default { default: null, }, level: Number, + neighboursSelected: Object, }, setup(props, { emit }) { const settings = inject(settingsInjectionKey); @@ -106,6 +125,8 @@ export default { const showEntries = ref(false); const directoryViewRef = ref(); + const selectedClasses = ref([]); + const doubleClickCallback = () => { if (directoryLike.value) { emit('cd', props.entry.path); @@ -128,6 +149,16 @@ export default { const getSelected = () => directoryViewRef.value?.getSelected?.() ?? []; + const selectAll = () => { + directoryViewRef.value?.selection.selectAll(); + } + + const deselectAllForward = () => { + directoryViewRef.value?.selection.deselectAllForward(); + } + + const escapeName = (string) => string.replace(/[^ -~]/gi, c => `${JSON.stringify(c).replace(/^['"]|['"]$/g, '')}`) + watch(props.entry, () => { if (props.entry.type === 'directory' || (props.entry.type === 'symbolic link' && props.entry.target?.type === 'directory')) { icon.value = FolderIcon; @@ -138,16 +169,27 @@ export default { } }, { immediate: true }); + watch([() => props.neighboursSelected, () => props.entry.selected, () => settings.directoryView?.view], () => selectedClasses.value = [ + 'border-dashed border-red-600/50 first:border-l-2 last:border-r-2', + props.entry.selected ? 'bg-red-600/5 first:border-l-red-600/50 last:border-r-red-600/50' : 'first:border-l-transparent last:border-r-transparent', + props.entry.selected && (!props.neighboursSelected.above || settings.directoryView?.view !== 'list') ? 'border-t-2' : 'border-t-0', + props.entry.selected && (!props.neighboursSelected.below || settings.directoryView?.view !== 'list') ? 'border-b-2' : 'border-b-0', + ], { immediate: true, deep: true }); + return { settings, icon, directoryLike, + selectedClasses, showEntries, directoryViewRef, doubleClickCallback, getEntries, toggleShowEntries, getSelected, + selectAll, + deselectAllForward, + escapeName, DirectoryEntryList, nextTick, } @@ -169,6 +211,7 @@ export default { 'toggleSelected', 'startProcessing', 'stopProcessing', + 'deselectAll', ] }