Add temporary button to go back to previous note

This commit is contained in:
Joscha 2025-02-11 20:10:56 +01:00
parent 5bc62d12f4
commit 7d6f610be0
3 changed files with 57 additions and 5 deletions

View file

@ -2,7 +2,12 @@
import { Note, useNotesStore } from "@/stores/notes"; import { Note, useNotesStore } from "@/stores/notes";
import { useReposStore } from "@/stores/repos"; import { useReposStore } from "@/stores/repos";
import { useUiStore } from "@/stores/ui"; import { useUiStore } from "@/stores/ui";
import { RiDeleteBinFill, RiNodeTree, RiSettings3Fill } from "@remixicon/vue"; import {
RiArrowLeftDoubleLine,
RiDeleteBinFill,
RiNodeTree,
RiSettings3Fill,
} from "@remixicon/vue";
import { onMounted } from "vue"; import { onMounted } from "vue";
import CNavbarButton from "./CNavbarButton.vue"; import CNavbarButton from "./CNavbarButton.vue";
import CNavbarDropdown from "./CNavbarDropdown.vue"; import CNavbarDropdown from "./CNavbarDropdown.vue";
@ -32,7 +37,7 @@ function createSomeNotes(): void {
const root = mkNote("root", n1.id, n2.id, n3.id, n4.id, n5.id, n2.id); const root = mkNote("root", n1.id, n2.id, n3.id, n4.id, n5.id, n2.id);
ui.anchorId = root.id; ui.pushAnchorId(root.id);
// Shuffle children of root // Shuffle children of root
root.children = root.children root.children = root.children
@ -54,6 +59,11 @@ onMounted(() => {
<CNavbarDropdown /> <CNavbarDropdown />
</div> </div>
<!-- Temporary back button -->
<CNavbarButton title="Go back" @click="ui.popAnchorId()">
<RiArrowLeftDoubleLine size="16px" class="inline" />
</CNavbarButton>
<!-- Temporary button for testing --> <!-- Temporary button for testing -->
<CNavbarButton title="Create dummy note tree" @click="createSomeNotes"> <CNavbarButton title="Create dummy note tree" @click="createSomeNotes">
<RiNodeTree size="16px" class="inline" /> <RiNodeTree size="16px" class="inline" />

View file

@ -132,7 +132,7 @@ function onCreateEditorFinish(text: string): void {
} }
function onMoveButtonClick(): void { function onMoveButtonClick(): void {
ui.anchorId = props.segment.id; ui.pushAnchorId(props.segment.id);
} }
</script> </script>

View file

@ -1,11 +1,21 @@
import { Segment, Path as UiPath } from "@/lib/path"; import { Segment, Path as UiPath } from "@/lib/path";
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { ref, watchEffect } from "vue"; import { computed, ref, watchEffect } from "vue";
export const useUiStore = defineStore("ui", () => { export const useUiStore = defineStore("ui", () => {
const anchorId = ref<string>(); const history = ref<
{
anchorId: string;
focusPath: UiPath;
openPaths: Set<string>;
}[]
>([]);
const _anchorId = ref<string>();
const anchorId = computed(() => _anchorId.value);
const focusPath = ref<UiPath>(new UiPath()); const focusPath = ref<UiPath>(new UiPath());
const openPaths = ref<Set<string>>(new Set()); const openPaths = ref<Set<string>>(new Set());
const pinned = ref<{ segment: Segment; parentId?: string }>(); const pinned = ref<{ segment: Segment; parentId?: string }>();
// Ensure all nodes on the focusPath are unfolded. // Ensure all nodes on the focusPath are unfolded.
@ -16,6 +26,36 @@ export const useUiStore = defineStore("ui", () => {
} }
}); });
function pushAnchorId(id: string): void {
if (_anchorId.value) {
history.value.push({
anchorId: _anchorId.value,
focusPath: focusPath.value,
openPaths: openPaths.value,
});
}
_anchorId.value = id;
focusPath.value = new UiPath();
openPaths.value = new Set();
}
function popAnchorId(): void {
// Temporary solution until I implement some UI for anchorId===undefined
if (history.value.length === 0) return;
const entry = history.value.pop();
if (entry) {
_anchorId.value = entry.anchorId;
focusPath.value = entry.focusPath;
openPaths.value = entry.openPaths;
} else {
_anchorId.value = undefined;
focusPath.value = new UiPath();
openPaths.value = new Set();
}
}
function isOpen(path: UiPath): boolean { function isOpen(path: UiPath): boolean {
return openPaths.value.has(path.fmt()); return openPaths.value.has(path.fmt());
} }
@ -53,6 +93,8 @@ export const useUiStore = defineStore("ui", () => {
return { return {
anchorId, anchorId,
focusPath, focusPath,
pushAnchorId,
popAnchorId,
isOpen, isOpen,
setOpen, setOpen,
toggleOpen, toggleOpen,