Files
InvoiceShelf/resources/scripts/admin/components/ImpersonationBanner.vue
Darko Gjorgjijoski 9432da467e Add super-admin Administration section and restructure global vs company settings
- Add Administration sidebar section (super-admin only) with Companies, Users, and Global Settings pages
- Add super-admin middleware, controllers, and API routes under /api/v1/super-admin/
- Allow super-admins to manage all companies and users across tenants
- Add user impersonation with short-lived tokens, audit logging, and UI banner
- Move system-level settings (Mail, PDF, Backup, Update, File Disk) from per-company to Administration > Global Settings
- Convert save_pdf_to_disk from CompanySetting to global Setting
- Add per-company mail configuration overrides (optional, falls back to global)
- Add CompanyMailConfigService to apply company mail config before sending emails
2026-04-03 10:35:40 +02:00

42 lines
1.2 KiB
Vue

<template>
<div
v-if="isImpersonating"
class="fixed top-0 left-0 right-0 z-50 flex items-center justify-center px-4 py-2 text-sm font-medium text-white bg-orange-600"
>
<BaseIcon name="ExclamationTriangleIcon" class="w-4 h-4 mr-2" />
<span>{{ $t('administration.users.impersonating_banner') }}</span>
<button
class="ml-4 px-3 py-1 text-xs font-semibold text-orange-600 bg-white rounded hover:bg-orange-50"
:disabled="isStopping"
@click="stopImpersonating"
>
{{ $t('administration.users.stop_impersonating') }}
</button>
</div>
</template>
<script setup>
import { computed, ref } from 'vue'
import Ls from '@/scripts/services/ls.js'
import { useAdministrationStore } from '@/scripts/admin/stores/administration'
const administrationStore = useAdministrationStore()
let isStopping = ref(false)
const isImpersonating = computed(() => {
return Ls.get('admin.impersonating') === 'true'
})
async function stopImpersonating() {
isStopping.value = true
try {
await administrationStore.stopImpersonating()
} catch {
// Token already cleaned up in store action
}
window.location.href = '/admin/administration/users'
}
</script>