ledger list and modal
This commit is contained in:
@@ -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>
|
||||||
|
<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>
|
||||||
|
<div class="flex justify-end me-4 ms-2">
|
||||||
|
<button class="btn-icon" @click="addMember"><PlusIcon /></button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<select>
|
|
||||||
<option v-for="ledger in ledgers">{{ ledger.name}}</option>
|
|
||||||
</select>
|
|
||||||
</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>
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user