feat(settings): allow Danger Zone for any owner regardless of company count

Removes three layered gates that kept the Danger Zone completely hidden unless the current user had more than one company:

1. SettingsLayoutView's showDangerZone computed no longer checks companies.length > 1 — just is_owner. 2. DangerZoneView drops the v-if that wrapped the delete button with the same check. 3. Admin\\CompaniesController::destroy() drops the companies_count <= 1 early-return that was enforcing the rule server-side (translation key You_cannot_delete_all_companies was inline in the controller, not in lang files or tests, so nothing else needs cleanup).

The reasoning behind the old gate was that a user with zero companies would be stranded. That's a misread of how the app degrades: /admin/no-company already exists as a graceful fallback view, and the user can create a fresh company from there to recover. Hiding the entire delete flow just to avoid that fallback UX was overkill — the name-confirmation modal already prevents accidental deletion.
This commit is contained in:
Darko Gjorgjijoski
2026-04-11 08:00:00 +02:00
parent 31a2a66127
commit 5c11147e95
3 changed files with 2 additions and 13 deletions

View File

@@ -1,11 +1,9 @@
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
import { useCompanyStore } from '../../../../stores/company.store'
import { useModalStore } from '../../../../stores/modal.store'
import DeleteCompanyModal from '../components/DeleteCompanyModal.vue'
const { t } = useI18n()
const companyStore = useCompanyStore()
const modalStore = useModalStore()
function removeCompany(): void {
@@ -22,7 +20,7 @@ function removeCompany(): void {
:title="$t('settings.company_info.danger_zone')"
:description="$t('settings.company_info.delete_company_description')"
>
<div v-if="companyStore.companies.length > 1" class="mt-6">
<div class="mt-6">
<BaseButton
variant="danger"
type="button"

View File

@@ -3,7 +3,6 @@ import { ref, computed, watchEffect } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { useGlobalStore } from '../../../../stores/global.store'
import { useCompanyStore } from '../../../../stores/company.store'
import { useUserStore } from '../../../../stores/user.store'
interface SettingMenuItem {
@@ -18,16 +17,12 @@ interface DropdownMenuItem extends SettingMenuItem {
const { t } = useI18n()
const globalStore = useGlobalStore()
const companyStore = useCompanyStore()
const userStore = useUserStore()
const route = useRoute()
const router = useRouter()
const showDangerZone = computed<boolean>(() => {
return (
userStore.currentUser?.is_owner === true &&
companyStore.companies.length > 1
)
return userStore.currentUser?.is_owner === true
})
const currentSetting = ref<DropdownMenuItem | undefined>(undefined)