feat(versions): shared identity/UI/settings tabs and denser desktop form

Keep the same pill nav on all three Khanegi version pages, tighten the identity form on desktop, and split catalog add/delete into separate modals.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-17 21:39:50 +03:30
co-authored by Cursor
parent b879d085d3
commit 6dbb15c6e1
8 changed files with 512 additions and 281 deletions
+41 -21
View File
@@ -4,6 +4,7 @@ import { useRoute, useRouter } from 'vue-router'
import { message } from 'ant-design-vue'
import { ArrowRightOutlined } from '@ant-design/icons-vue'
import api from '@/api/http'
import VersionPageTabs from '@/components/VersionPageTabs.vue'
import { useAuthStore } from '@/stores/auth'
const route = useRoute()
@@ -153,34 +154,41 @@ onMounted(load)
<a-button type="text" @click="router.push({ name: 'product-versions', params: { product: 'khanegi' } })">
<ArrowRightOutlined />
</a-button>
<div style="flex: 1">
<div class="head-text">
<h1 class="page-title">ظاهر اپ خانگی — ماژولار</h1>
<p class="page-sub">
{{ tenantName || 'نسخه' }}
<template v-if="domain"> · {{ domain }}</template>
</p>
</div>
<a-space>
<a-select
:value="uiVariant"
style="width: 180px"
:options="[
{ value: 'modular', label: 'Modular' },
{ value: 'newTheme', label: 'New theme' },
]"
:disabled="!canWrite || switching || saving || loading"
@change="(v: string) => v === 'newTheme' && switchToNewTheme()"
<div class="head-aside">
<VersionPageTabs
active="ui"
:tenant-id="String(route.params.id)"
ui-route-name="version-ui-modular"
/>
<a-button
v-if="canWrite"
type="primary"
size="large"
:loading="saving"
@click="save"
>
ذخیره
</a-button>
</a-space>
<a-space wrap>
<a-select
:value="uiVariant"
style="width: 180px"
:options="[
{ value: 'modular', label: 'Modular' },
{ value: 'newTheme', label: 'New theme' },
]"
:disabled="!canWrite || switching || saving || loading"
@change="(v: string) => v === 'newTheme' && switchToNewTheme()"
/>
<a-button
v-if="canWrite"
type="primary"
size="large"
:loading="saving"
@click="save"
>
ذخیره
</a-button>
</a-space>
</div>
</div>
<a-spin :spinning="loading || switching">
@@ -269,8 +277,20 @@ onMounted(load)
display: flex;
align-items: flex-start;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 16px;
}
.head-text {
flex: 1 1 180px;
min-width: 0;
}
.head-aside {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin-inline-start: auto;
}
.hint {
color: #64748b;
margin: 0 0 16px;