Skip to content

Commit

Permalink
also use double click to append items to the view
Browse files Browse the repository at this point in the history
  • Loading branch information
rouk1 committed Sep 30, 2024
1 parent e7aefed commit 4639815
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 17 deletions.
2 changes: 1 addition & 1 deletion frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"markdown-it-highlightjs": "^4.1.0",
"markdown-it-sub": "^2.0.0",
"markdown-it-sup": "^2.0.0",
"mitt": "^3.0.1",
"pinia": "^2.2.2",
"plotly.js-dist-min": "^2.35.2",
"simplebar-vue": "^2.3.5",
Expand Down
33 changes: 29 additions & 4 deletions frontend/src/components/TreeAccordion.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,49 @@
export interface TreeAccordionNode {
name: string;
children?: TreeAccordionNode[];
isRoot?: boolean;
}
export type AccordionEvent = {
doubleClick: string;
};
</script>

<script setup lang="ts">
import TreeAccordionItem from "./TreeAccordionItem.vue";
import mitt from "mitt";
import TreeAccordionItem from "@/components/TreeAccordionItem.vue";
import { onMounted, onUnmounted } from "vue";
const props = defineProps<{ nodes: TreeAccordionNode[] }>();
const emit = defineEmits<{
doubleClick: [key: string];
}>();
const eventBus = mitt<AccordionEvent>();
function onAccordionItemDoubleClick(key: string) {
console.log("TreeAccordion double-click", key);
emit("doubleClick", key);
}
onMounted(() => {
eventBus.on("doubleClick", onAccordionItemDoubleClick);
});
onUnmounted(() => {
eventBus.off("doubleClick", onAccordionItemDoubleClick);
});
</script>

<template>
<div class="accordion">
<TreeAccordionItem
v-for="(node, index) in props.nodes"
:key="index"
:name="node.name"
:children="node.children"
:node="node"
:is-root="true"
:event-bus="eventBus"
/>
</div>
</template>
Expand Down
34 changes: 23 additions & 11 deletions frontend/src/components/TreeAccordionItem.vue
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
<script setup lang="ts">
import { computed, ref } from "vue";
import { type TreeAccordionNode } from "@/components/TreeAccordion.vue";
import { type AccordionEvent, type TreeAccordionNode } from "@/components/TreeAccordion.vue";
import type { Emitter } from "mitt";
const props = defineProps<TreeAccordionNode>();
const props = defineProps<{
node: TreeAccordionNode;
eventBus: Emitter<AccordionEvent>;
isRoot: boolean;
}>();
const isCollapsed = ref(false);
const isDraggable = ref(false);
const hasChildren = computed(() => props.children?.length);
const hasChildren = computed(() => props.node.children?.length);
const label = computed(() => {
const segment = props.name.split("/");
const segment = props.node.name.split("/");
return segment[segment.length - 1];
});
Expand All @@ -31,20 +36,26 @@ function countChildrenRecursively(node: TreeAccordionNode): number {
}
const totalChildrenCount = computed(() => {
return countChildrenRecursively(props);
return countChildrenRecursively(props.node);
});
function onDragStart(event: DragEvent) {
if (event.dataTransfer) {
event.dataTransfer.setData("key", props.name);
event.dataTransfer.setData("key", props.node.name);
}
}
function onDoubleClick() {
if (!hasChildren.value) {
props.eventBus.emit("doubleClick", props.node.name);
}
}
</script>

<template>
<div
class="tree-accordion-item"
:class="{ first: isRoot }"
:class="{ first: props.isRoot }"
:style="{ '--children-count': totalChildrenCount }"
>
<div class="label-container" @click="toggleChildren">
Expand All @@ -53,11 +64,12 @@ function onDragStart(event: DragEvent) {
:class="{ 'has-children': hasChildren }"
:draggable="isDraggable && !hasChildren"
@dragstart="onDragStart($event)"
@dblclick="onDoubleClick"
@mousedown="isDraggable = true"
@mouseup="isDraggable = false"
@mouseleave="isDraggable = false"
>
<span class="children-indicator icon-branch" v-if="!isRoot" />
<span class="children-indicator icon-branch" v-if="!props.isRoot" />
<span class="icon icon-pill" />
<span class="text">{{ label }}</span>
</div>
Expand All @@ -73,10 +85,10 @@ function onDragStart(event: DragEvent) {
<Transition name="toggle-children">
<div class="children" v-if="hasChildren && !isCollapsed">
<TreeAccordionItem
v-for="(child, index) in props.children"
v-for="(child, index) in props.node.children"
:key="index"
:name="child.name"
:children="child.children"
:node="child"
:event-bus="props.eventBus"
:is-root="false"
/>
</div>
Expand Down
9 changes: 8 additions & 1 deletion frontend/src/views/ReportBuilderView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ function onDragLeave(event: DragEvent) {
}
}
function onAccordionItemDoubleClick(key: string) {
reportStore.displayKey(key);
}
onMounted(() => {
reportStore.startBackendPolling();
});
Expand All @@ -63,7 +67,10 @@ onBeforeUnmount(() => reportStore.stopBackendPolling());
<div class="items" v-if="reportStore.items && !isInFocusMode">
<SectionHeader title="Elements" icon="icon-pie-chart" />
<Simplebar class="key-list">
<TreeAccordion :nodes="reportStore.keysAsTree()" />
<TreeAccordion
:nodes="reportStore.keysAsTree()"
@double-click="onAccordionItemDoubleClick"
/>
</Simplebar>
</div>

Expand Down

0 comments on commit 4639815

Please sign in to comment.