<template lang='pug'> q-page.admin-locale .row.q-pa-md.items-center .col-auto img.admin-icon.animated.fadeInLeft(src='/_assets/icons/fluent-change-theme.svg') .col.q-pl-md .text-h5.text-primary.animated.fadeInLeft {{ t('admin.sites.title') }} .text-subtitle1.text-grey.animated.fadeInLeft.wait-p2s {{ t('admin.sites.subtitle') }} .col-auto q-btn.q-mr-sm.acrylic-btn( icon='las la-question-circle' flat color='grey' type='a' :href='siteStore.docsBase + `/admin/sites`' target='_blank' ) q-btn.q-mr-sm.acrylic-btn( icon='las la-redo-alt' flat color='secondary' @click='refresh' ) q-btn( unelevated icon='las la-plus' :label='t(`admin.sites.new`)' color='primary' @click='createSite' ) q-separator(inset) .row.q-pa-md.q-col-gutter-md .col-12 q-card.shadow-1 q-list(separator) q-item( v-for='site of adminStore.sites' :key='site.id' ) q-item-section(side) q-icon(name='las la-chalkboard', color='primary') q-item-section strong {{site.title}} q-item-section div q-chip.q-mx-none( v-if='site.hostname !== `*`' square color='blue-7' text-color='white' size='sm' ) q-avatar( icon='las la-angle-right' color='blue-5' text-color='white' ) span {{site.hostname}} q-chip.q-mx-none( v-else square color='indigo-7' text-color='white' size='sm' ) q-avatar( icon='las la-asterisk' color='indigo-5' text-color='white' ) span catch-all q-item-section(side) q-toggle( :model-value='site.isEnabled' color='primary' checked-icon='las la-check' unchecked-icon='las la-times' :label='t(`admin.sites.isActive`)' :aria-label='t(`admin.sites.isActive`)' @update:model-value ='(val) => { toggleSiteState(site, val) }' ) q-separator.q-ml-md(vertical) q-item-section(side, style='flex-direction: row; align-items: center;') q-btn.acrylic-btn.q-mr-sm( flat @click='editSite(site)' icon='las la-pen' color='indigo' :label='t(`common.actions.edit`)' no-caps ) q-btn.acrylic-btn( flat icon='las la-trash' color='negative' @click='deleteSite(site)' ) </template> <script setup> import { useMeta, useQuasar } from 'quasar' import { useI18n } from 'vue-i18n' import { nextTick, onMounted } from 'vue' import { useRouter } from 'vue-router' import { useAdminStore } from '../stores/admin' import { useSiteStore } from 'src/stores/site' // COMPONENTS import SiteActivateDialog from '../components/SiteActivateDialog.vue' import SiteCreateDialog from '../components/SiteCreateDialog.vue' import SiteDeleteDialog from '../components/SiteDeleteDialog.vue' // QUASAR const $q = useQuasar() // STORES const adminStore = useAdminStore() const siteStore = useSiteStore() // ROUTER const router = useRouter() // I18N const { t } = useI18n() // META useMeta({ title: t('admin.sites.title') }) // METHODS async function refresh () { await adminStore.fetchSites() $q.notify({ type: 'positive', message: t('admin.sites.refreshSuccess') }) } function createSite () { $q.dialog({ component: SiteCreateDialog }) } function editSite (st) { adminStore.$patch({ currentSiteId: st.id }) nextTick(() => { router.push(`/_admin/${st.id}/general`) }) } function toggleSiteState (st, newState) { console.info(newState) $q.dialog({ component: SiteActivateDialog, componentProps: { site: st, targetState: newState } }) } function deleteSite (st) { $q.dialog({ component: SiteDeleteDialog, componentProps: { site: st } }) } // MOUNTED onMounted(async () => { await adminStore.fetchSites() }) </script>