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:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user