Files
Joris Slagter 791aebc346
Some checks failed
continuous-integration/drone/push Build is failing
Initial Nuxt frontend import
- Complete GGZ Ecademy Nuxt.js user portal
- Learning products browser and management
- Member management interface
- User authentication and roles
- Multi-language support (NL/EN)
- Vuex store for state management
- Component-based architecture
2025-12-02 17:48:48 +01:00

203 lines
5.6 KiB
Vue

<template>
<div>
<page-header class="d-flex justify-space-between">
<span>
{{ $t('learning.quality_standards') }}
</span>
<v-btn
depressed
:to="localePath('/manager/learning/quality-standards/new')"
color="accent"
rounded
>
<v-icon left>mdi-plus</v-icon>
<small>{{ $t('general.add') }}</small>
</v-btn>
</page-header>
<v-data-table
:headers="headers"
:items="filter.items"
:items-per-page="10"
class="pa-4 secondary"
>
<!-- Translates dynamically headers -->
<template v-for="h in headers" v-slot:[`header.${h.value}`]="{ header }">
{{ $t(h.text) }}
</template>
<template v-slot:item.name="{ item }">
<strong class="txt--text" v-text="item.name"></strong>
</template>
<template v-slot:item.actions="{ item }">
<v-menu offset-y>
<template v-slot:activator="{ on }">
<v-hover v-slot:default="{ hover }">
<v-btn
v-on="on"
depressed
:outlined="hover"
small
fab
:color="hover ? 'info' : ''"
>
<v-icon>mdi-dots-horizontal</v-icon>
</v-btn>
</v-hover>
</template>
<v-list width="200">
<v-list-item
nuxt
:to="localePath(`/manager/learning/quality-standards/${item.id}`)"
>
<v-list-item-icon class="mr-1">
<v-icon small>mdi-pencil</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-subtitle>
{{ $t('general.edit') | capitalize }}
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item>
<v-list-item-icon class="mr-1">
<v-icon small>icon-link</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-subtitle>
Link naar informatie
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-dialog max-width="740" persistent v-model="dialog">
<template v-slot:activator="{ on }">
<v-list-item v-on="on">
<v-list-item-icon class="mr-1">
<v-icon small>icon-remove</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-subtitle>{{
$t('general.delete') | capitalize
}}</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
</template>
<v-card class="primary pa-10" flat>
<v-card-title class="headline">
{{
$t('learning.product_overview.delete_confirmation', {
productName: item.title,
})
}}
</v-card-title>
<v-card-actions>
<div class="ma-4">
<v-btn
@click="deleteItem(item.id)"
class="mx-2"
color="accent"
depressed
rounded
>{{ $t('general.delete') }}</v-btn
>
<v-btn
@click="close"
class="mx-2"
color="info"
depressed
rounded
>{{ $t('general.cancel') }}</v-btn
>
</div>
</v-card-actions>
</v-card>
</v-dialog>
</v-list>
</v-menu>
</template>
</v-data-table>
</div>
</template>
<script>
import PageHeader from '~/components/UI/PageHeader/PageHeader'
import accordionCard from '@/components/UI/AccordionCard/AccordionCard'
export default {
layout: `${process.env.CUSTOMER}Admin`,
components: {
PageHeader,
accordionCard,
},
data() {
return {
headers: [
{ text: 'naam', sortable: false, value: 'title' },
{ text: '', value: 'actions' },
],
filter: {},
dialog: false,
}
},
async asyncData({ $axios }) {
try {
const { data } = await $axios.get(`/filters`)
const qualityStandards = data.find((f) => f.title === 'quality_standards')
return { filter: { ...qualityStandards } }
} catch (error) {
console.log(error)
}
},
methods: {
close() {
this.dialog = false
},
async deleteItem(itemId) {
if (!itemId) {
this.$notifier.showMessage({
content: `No item to delete selected`,
color: 'error',
icon: 'icon-message',
})
}
this.$nextTick(() => this.$nuxt.$loading.start())
try {
await this.$axios.delete(`/filter-items/${itemId}`)
this.dialog = false
this.filter.items = this.filter.items.filter((i) => i.id !== itemId)
this.$nuxt.$loading.finish()
this.$notifier.showMessage({
content: `Filter Item deleted`,
color: 'success',
icon: 'mdi-delete',
})
} catch (error) {
this.dialog = false
this.$nuxt.$loading.finish()
this.$notifier.showMessage({
content: `Error trying to delete the selected Filter Item`,
color: 'error',
icon: 'mdi-delete',
})
}
},
},
}
</script>