diff --git a/src/FiscalOS.Web/src/components/TransactionCard.vue b/src/FiscalOS.Web/src/components/TransactionCard.vue index abc41d3..a4dfbe5 100644 --- a/src/FiscalOS.Web/src/components/TransactionCard.vue +++ b/src/FiscalOS.Web/src/components/TransactionCard.vue @@ -5,6 +5,10 @@ transaction: Transaction; }>(); + const emit = defineEmits<{ + delete: [id: string]; + }>(); + function formatDate(date: string) { const formatter = new Intl.DateTimeFormat('en-US', { year: 'numeric', @@ -39,6 +43,14 @@

{{ transaction.description }}

+
+ +
@@ -69,4 +81,26 @@ font-size: 0.875rem; color: #666666; } + + .actions { + display: flex; + justify-content: flex-end; + gap: 0.5rem; + padding-top: 0.5rem; + } + + .delete-btn { + background: none; + border: 0.0625rem solid var(--state-error); + border-radius: 0.25rem; + color: var(--state-error); + cursor: pointer; + font-size: 0.75rem; + padding: 0.25rem 0.5rem; + } + + .delete-btn:hover { + background: var(--state-error); + color: var(--text-primary); + } diff --git a/src/FiscalOS.Web/src/services/transactionService.ts b/src/FiscalOS.Web/src/services/transactionService.ts index e2ba0c3..156a7cc 100644 --- a/src/FiscalOS.Web/src/services/transactionService.ts +++ b/src/FiscalOS.Web/src/services/transactionService.ts @@ -20,6 +20,7 @@ export class TransactionServiceFactory implements ITransactionServiceFactory { export interface ITransactionService { get: (pageNumber?: number, pageSize?: number) => Promise, Error[]>>; + deleteById: (id: string) => Promise>; } export class TransactionService implements ITransactionService { @@ -32,6 +33,24 @@ export class TransactionService implements ITransactionService { this.client = client; } + async deleteById(id: string): Promise> { + const url = this.endpoints.get + '/' + id; + const request = new ClientRequest(url); + + try { + const res = await this.client.delete(request); + + if (res.ok === false) { + return Err([new Error('Failed to delete transaction.')]); + } + + return Ok(true); + } catch (error) { + console.error(error); + return Err([new Error('Failed to delete transaction.')]); + } + } + async get(pageNumber: number = 1, pageSize: number = 500) { const queryParams = new URLSearchParams({ pageNumber: pageNumber.toString(), diff --git a/src/FiscalOS.Web/src/views/TransactionsView.vue b/src/FiscalOS.Web/src/views/TransactionsView.vue index 1502111..99c08c6 100644 --- a/src/FiscalOS.Web/src/views/TransactionsView.vue +++ b/src/FiscalOS.Web/src/views/TransactionsView.vue @@ -10,6 +10,17 @@ const transactions = ref([]); + async function handleDelete(id: string) { + const result = await transactionService.deleteById(id); + + if (result.err) { + alert(result.val.map(e => e.message).join('\n')); + return; + } + + transactions.value = transactions.value.filter(t => t.id !== id); + } + onMounted(async () => { const result = await transactionService.get(); @@ -30,7 +41,10 @@ v-for="transaction in transactions" :key="transaction.id" > - +