ledger list and modal

This commit is contained in:
Sirttas
2026-05-17 19:53:55 +02:00
parent 8005e7a45b
commit 2332ad2216
3 changed files with 40 additions and 14 deletions
+32 -9
View File
@@ -1,18 +1,33 @@
<script setup lang="ts"> <script setup lang="ts">
import {ref} from "vue"; import {computed, ref} from "vue";
import {COMBINING_LEDGER, Ledger, LedgerType, MAIN_LEDGER, useLedgersStore} from "./ledger"; import {COMBINING_LEDGER, Ledger, LedgerType, MAIN_LEDGER, useLedgersStore} from "./ledger";
import {Modal} from "@/components"; import {Modal} from "@/components";
import LedgerLine from "@/ledger/LedgerLine.vue"; import LedgerLine from "./LedgerLine.vue";
import {PlusIcon, TrashIcon} from '@heroicons/vue/24/outline';
const {ledgers, createMain, createCombining} = useLedgersStore();
const modalOpen = ref<boolean>(false); const modalOpen = ref<boolean>(false);
const type = ref<LedgerType>(MAIN_LEDGER); const type = ref<LedgerType>(MAIN_LEDGER);
const name = ref(""); const name = ref("");
const members = ref<Ledger[]>([]); const members = ref<Ledger[]>([]);
const {ledgers, createMain, createCombining} = useLedgersStore(); const selectedLedger = ref<Ledger | undefined>();
const availableLedgers = computed(() => ledgers.filter(l => !members.value.includes(l)));
const open = () => modalOpen.value = true; const addMember = () => {
if (selectedLedger.value && !members.value.includes(selectedLedger.value)) {
members.value = [...members.value, selectedLedger.value];
}
}
const open = () => {
type.value = MAIN_LEDGER;
name.value = "";
members.value = [];
modalOpen.value = true;
}
const create = () => { const create = () => {
if (type.value === MAIN_LEDGER) { if (type.value === MAIN_LEDGER) {
@@ -45,14 +60,22 @@ defineExpose({ open });
<input type="text" v-model="name" /> <input type="text" v-model="name" />
</div> </div>
</div> </div>
<div v-if="type === COMBINING_LEDGER" class="mb-4"> <div v-if="type === COMBINING_LEDGER" class="ms-4 mb-4">
Member Ledgers: Member Ledgers:
<div v-for="ledger in members"> <div v-for="ledger in members" class="flex">
<LedgerLine ledger="ledger" /> <LedgerLine class="flex grow" :ledger="ledger" />
<div class="flex justify-end me-4 ms-2">
<button class="btn-icon " @click="members = members.filter(m => m !== ledger)"><TrashIcon /></button>
</div> </div>
<select> </div>
<option v-for="ledger in ledgers">{{ ledger.name}}</option> <div v-if="availableLedgers.length" class="flex">
<select v-model="selectedLedger" class="grow">
<option v-for="ledger in availableLedgers" :value="ledger">{{ ledger.name }}</option>
</select> </select>
<div class="flex justify-end me-4 ms-2">
<button class="btn-icon" @click="addMember"><PlusIcon /></button>
</div>
</div>
</div> </div>
<div class="flex justify-end"> <div class="flex justify-end">
<button class="me-4" @click="create">Create</button> <button class="me-4" @click="create">Create</button>
+3 -3
View File
@@ -11,9 +11,9 @@ const props = defineProps<Props>();
</script> </script>
<template> <template>
<div class="flex"> <div class="flex ms-2 mb-2">
<FolderOpenIcon v-if="ledger.type === COMBINING_LEDGER" class="w-6" /> <FolderOpenIcon v-if="ledger.type === COMBINING_LEDGER" class="w-4 me-1" />
<div v-else class="w-6"/> <div v-else class="w-4 me-1"/>
<span>{{ ledger.name }}</span> <span>{{ ledger.name }}</span>
</div> </div>
</template> </template>
+4 -1
View File
@@ -14,9 +14,12 @@
button, a.button { button, a.button {
@apply py-0.5 px-2 border rounded bg-slate-600 hover:bg-slate-700; @apply py-0.5 px-2 border rounded bg-slate-600 hover:bg-slate-700;
} }
input { input, select {
@apply border bg-slate-500 rounded px-1; @apply border bg-slate-500 rounded px-1;
} }
option {
@apply bg-slate-500;
}
textarea { textarea {
@apply border rounded bg-slate-500 w-full; @apply border rounded bg-slate-500 w-full;
} }