diff --git a/api/src/services/flashcard-decks/destroy-service.ts b/api/src/services/flashcard-decks/destroy-service.ts index 618a459..ea46074 100644 --- a/api/src/services/flashcard-decks/destroy-service.ts +++ b/api/src/services/flashcard-decks/destroy-service.ts @@ -1,3 +1,4 @@ +import db from "@/db/db-client" import { FlashcardDeck } from "@/models" import BaseService from "@/services/base-service" @@ -7,7 +8,13 @@ export class DestroyService extends BaseService { } async perform(): Promise { - return this.flashcardDeck.destroy() + await db.transaction(async (transaction) => { + await FlashcardDeck.update( + { parentDeckId: null }, + { where: { parentDeckId: this.flashcardDeck.id }, transaction } + ) + await this.flashcardDeck.destroy({ transaction }) + }) } } diff --git a/web/src/components/flashcard-decks/FlashcardDeckKebab.vue b/web/src/components/flashcard-decks/FlashcardDeckKebab.vue new file mode 100644 index 0000000..b59f057 --- /dev/null +++ b/web/src/components/flashcard-decks/FlashcardDeckKebab.vue @@ -0,0 +1,239 @@ + + + diff --git a/web/src/components/flashcard-decks/FlashcardDeckTree.vue b/web/src/components/flashcard-decks/FlashcardDeckTree.vue index 9ac7dbb..3ff9ac1 100644 --- a/web/src/components/flashcard-decks/FlashcardDeckTree.vue +++ b/web/src/components/flashcard-decks/FlashcardDeckTree.vue @@ -35,7 +35,9 @@ :selected-id="selectedId" @select="onSelect" @move="handleMove" - @add-child="openCreateDialog" + @created="fetch()" + @updated="fetch()" + @deleted="fetch()" /> @@ -46,7 +48,7 @@ variant="text" prepend-icon="mdi-plus" text="Add Deck" - @click="openCreateDialog(null)" + @click="openCreateDialog" /> - {{ activeParentId !== null ? "Add Sub-Deck" : "Add Deck" }} + Add Deck (null) const newDeckName = ref("") const isCreating = ref(false) const formRef = ref | null>(null) -function openCreateDialog(parentId: number | null) { - activeParentId.value = parentId +function openCreateDialog() { newDeckName.value = "" showCreateDialog.value = true } @@ -190,7 +190,7 @@ async function createDeck() { isCreating.value = true await flashcardDecksApi.create({ name: newDeckName.value, - parentDeckId: activeParentId.value, + parentDeckId: null, }) showCreateDialog.value = false await fetch() diff --git a/web/src/components/flashcard-decks/FlashcardDeckTreeNode.vue b/web/src/components/flashcard-decks/FlashcardDeckTreeNode.vue index 1b6b034..74c0f53 100644 --- a/web/src/components/flashcard-decks/FlashcardDeckTreeNode.vue +++ b/web/src/components/flashcard-decks/FlashcardDeckTreeNode.vue @@ -30,20 +30,14 @@ > {{ deck.name }} - - - +
@@ -76,6 +72,7 @@ import { ref, computed } from "vue" import draggable from "vuedraggable" import type { DeckNode } from "@/components/flashcard-decks/FlashcardDeckTree.vue" +import FlashcardDeckKebab from "@/components/flashcard-decks/FlashcardDeckKebab.vue" const props = defineProps<{ deck: DeckNode @@ -87,7 +84,9 @@ const children = defineModel("children", { required: true }) const emit = defineEmits<{ select: [deck: DeckNode] move: [payload: { deckId: number; newParentId: number | null }] - "add-child": [parentId: number] + created: [flashcardDeckId: number] + updated: [flashcardDeckId: number] + deleted: [flashcardDeckId: number] }>() const expanded = ref(false) @@ -115,12 +114,12 @@ function onChange(event: { added?: { element: DeckNode } }) { background: rgb(var(--v-theme-lightprimary)); } -.add-btn { +.kebab-btn { opacity: 0; transition: opacity 0.15s; } -.deck-node:hover .add-btn { +.deck-node:hover .kebab-btn { opacity: 1; }