Private
Public Access
1
0

Implement Phase 5: reconciliation, SignalR notifications, payees, splits & plugins

Add full frontend UI for five backend features: bank reconciliation (3-step
stepper workflow), payee management (CRUD with alias chips), transaction splits
(expandable rows + split editor), plugins (card grid), and real-time SignalR
notifications (bell dropdown with badge). Fix backend PayeeResponse to expose
alias IDs for deletion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Catherine Renelle
2026-02-08 14:14:23 -05:00
parent d0c3e3913c
commit eb49147080
14 changed files with 1084 additions and 18 deletions
+42 -1
View File
@@ -1,6 +1,47 @@
<template>
<div>
<h1 class="text-h4 mb-4">Plugins</h1>
<v-card><v-card-text><p class="text-medium-emphasis">Plugin marketplace coming in Phase 5. Extend Purrse with community-built integrations and features.</p></v-card-text></v-card>
<v-progress-linear v-if="loading" indeterminate color="primary" class="mb-4" />
<v-alert v-if="!loading && plugins.length === 0" type="info" variant="tonal" class="mb-4">
No plugins installed. Plugins extend Purrse with additional features and integrations.
</v-alert>
<v-row v-if="plugins.length > 0">
<v-col v-for="plugin in plugins" :key="plugin.id" cols="12" sm="6" md="4">
<v-card>
<v-card-item>
<template v-slot:prepend>
<v-icon size="large" color="primary">mdi-puzzle</v-icon>
</template>
<v-card-title>{{ plugin.name }}</v-card-title>
<v-card-subtitle>v{{ plugin.version }}</v-card-subtitle>
</v-card-item>
<v-card-text>{{ plugin.description }}</v-card-text>
</v-card>
</v-col>
</v-row>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { pluginsApi } from '@/services/plugins'
import type { Plugin } from '@/types'
const plugins = ref<Plugin[]>([])
const loading = ref(false)
onMounted(async () => {
loading.value = true
try {
const { data } = await pluginsApi.getAll()
plugins.value = data
} catch {
// silently handle - empty state shown
} finally {
loading.value = false
}
})
</script>