UI upgrade

This commit is contained in:
2026-06-26 02:12:22 -07:00
parent 8030e98d90
commit 4b91ba0936
3 changed files with 98 additions and 10 deletions
@@ -0,0 +1,31 @@
<template>
<v-pagination
v-model="page"
:length="totalPages"
/>
</template>
<script lang="ts">
/**
* Use in conjuction with `useRouteQueryPagination` composable.
*/
</script>
<script setup lang="ts">
import { computed } from "vue"
const page = defineModel<number>({
required: true,
default: 1,
})
const perPage = defineModel<number>("perPage", {
default: 10,
})
const props = defineProps<{
totalCount: number
}>()
const totalPages = computed(() => Math.ceil(props.totalCount / perPage.value))
</script>
@@ -0,0 +1,27 @@
<template>
<v-card class="pa-5">
<div
class="face-content text-h5 text-center"
v-html="renderMarkdown(flashcard.front)"
/>
</v-card>
</template>
<script setup lang="ts">
import { type Flashcard } from "@/api/flashcards-api"
import renderMarkdown from "@/utils/render-markdown"
defineProps<{ flashcard: Flashcard }>()
</script>
<style scoped>
.face-content {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
line-height: 1.5;
white-space: pre-line;
}
</style>
+40 -10
View File
@@ -34,18 +34,30 @@
<v-divider class="my-5" /> <v-divider class="my-5" />
<v-card :border="true"> <v-row>
<FlashcardsDataTableServer <v-col
ref="flashcardsTable" v-for="flashcard in flashcards"
:where="{ flashcardDeckId: selectedDeck.id }" :key="flashcard.id"
/> cols="12"
</v-card> md="6"
lg="4"
>
<FlashcardCard :flashcard="flashcard" />
</v-col>
</v-row>
<EnhancedPagination
v-model="page"
v-model:per-page="perPage"
:total-count="totalCount"
class="mt-4"
/>
<FlashcardCreateDialog <FlashcardCreateDialog
v-if="selectedDeck" v-if="selectedDeck"
ref="flashcardCreateDialog" ref="flashcardCreateDialog"
:flashcard-deck-id="selectedDeck.id" :flashcard-deck-id="selectedDeck.id"
@created="flashcardsTable?.refresh()" @created="refreshFlashcards"
/> />
</template> </template>
@@ -60,22 +72,40 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from "vue" import { computed, ref } from "vue"
import useBreadcrumbs from "@/use/use-breadcrumbs" import useBreadcrumbs from "@/use/use-breadcrumbs"
import useFlashcards from "@/use/use-flashcards"
import useRouteQueryPagination from "@/use/utils/use-route-query-pagination"
import FlashcardDeckTree, { import FlashcardDeckTree, {
type DeckNode, type DeckNode,
} from "@/components/flashcard-decks/FlashcardDeckTree.vue" } from "@/components/flashcard-decks/FlashcardDeckTree.vue"
import FlashcardsDataTableServer from "@/components/flashcards/FlashcardsDataTableServer.vue" import FlashcardCard from "@/components/flashcards/FlashcardCard.vue"
import FlashcardCreateDialog from "@/components/flashcards/FlashcardCreateDialog.vue" import FlashcardCreateDialog from "@/components/flashcards/FlashcardCreateDialog.vue"
import FlashcardDeckStartReviewBtn from "@/components/flashcard-decks/FlashcardDeckStartReviewBtn.vue" import FlashcardDeckStartReviewBtn from "@/components/flashcard-decks/FlashcardDeckStartReviewBtn.vue"
import EnhancedPagination from "@/components/common/EnhancedPagination.vue"
const deckTree = ref<InstanceType<typeof FlashcardDeckTree> | null>(null) const deckTree = ref<InstanceType<typeof FlashcardDeckTree> | null>(null)
const selectedDeck = ref<DeckNode | null>(null) const selectedDeck = ref<DeckNode | null>(null)
const flashcardsTable = ref<InstanceType<typeof FlashcardsDataTableServer> | null>(null)
const flashcardCreateDialog = ref<InstanceType<typeof FlashcardCreateDialog> | null>(null) const flashcardCreateDialog = ref<InstanceType<typeof FlashcardCreateDialog> | null>(null)
const { page, perPage } = useRouteQueryPagination({ perPage: 4 })
const flashcardsQueryOptions = computed(() => ({
where: { flashcardDeckId: selectedDeck.value?.id },
page: page.value,
perPage: perPage.value,
}))
const {
flashcards,
totalCount,
refresh: refreshFlashcards,
} = useFlashcards(flashcardsQueryOptions, {
skipWatchIf: () => selectedDeck.value === null,
})
function onDeckSelected(deck: DeckNode) { function onDeckSelected(deck: DeckNode) {
selectedDeck.value = deck selectedDeck.value = deck
} }