20260808172837

This commit is contained in:
oneao committed 2026-08-08 17:28:38 +08:00
1 parent fa510854b4
commit 4fbfea82f2
32 files changed
+517 -16019

No files matched your search

@@ -42,6 +42,7 @@ const expandedTreeKeys = ref([]);
const selectedModuleId = ref(null);
const skipLoad = ref(false);
const activeTab = ref("basic");
const tabItems = computed(() => visibleTabs.value.map((t) => ({ key: t.key, label: t.tab })));
const treeSearch = ref("");
function filterTree(nodes, keyword) {
@@ -1165,106 +1166,92 @@ void permissionStore
</div>
</div>
<!-- 顶部栏:tab 导航 -->
<div class="mm-tab-bar">
<nav class="mm-tab-nav">
<button
v-for="tab in visibleTabs"
:key="tab.key"
type="button"
class="mm-tab-nav__item"
:class="{ active: activeTab === tab.key }"
@click="activeTab = tab.key"
>
{{ tab.tab }}
</button>
</nav>
</div>
<!-- 面板内容 -->
<div class="mm-body">
<ModuleBasicPanel
v-if="activeTab === 'basic'"
:module-id="String(selectedModule.b_id)"
:data="drafts.module"
:parent-name="parentModuleName"
:loading="busy"
@update="(v) => onUpdate('module', v)"
@i18n-saved="onI18nSaved"
/>
<ModuleFieldsPanel
v-else-if="activeTab === 'fields'"
:module-id="String(selectedModule.b_id)"
:module-code="selectedModule?.b_code || ''"
:fields="drafts.fields"
:loading="busy"
@update="onFieldsUpdate"
@i18n-saved="onI18nSaved"
@sync-fields="syncFields"
/>
<ModuleListConfigPanel
v-else-if="activeTab === 'list'"
:module-id="String(selectedModule.b_id)"
:list-config="drafts.listConfig"
:edit-config="drafts.editConfig"
:query-config="drafts.queryConfig"
:fields="drafts.fields"
:groups="drafts.groups"
:referenced-group-ids="referencedGroupIds"
:loading="busy"
@update="(v) => onUpdate('listConfig', v)"
@groups-saved="onGroupsSaved"
@sync-edit="(v) => onUpdate('editConfig', v)"
@sync-query="(v) => onUpdate('queryConfig', v)"
/>
<ModuleEditConfigPanel
v-else-if="activeTab === 'edit'"
:module-id="String(selectedModule.b_id)"
:edit-config="drafts.editConfig"
:list-config="drafts.listConfig"
:query-config="drafts.queryConfig"
:fields="drafts.fields"
:groups="drafts.groups"
:referenced-group-ids="referencedGroupIds"
:loading="busy"
@update="(v) => onUpdate('editConfig', v)"
@groups-saved="onGroupsSaved"
@sync-list="(v) => onUpdate('listConfig', v)"
@sync-query="(v) => onUpdate('queryConfig', v)"
/>
<ModuleQueryConfigPanel
v-else-if="activeTab === 'query'"
:module-id="String(selectedModule.b_id)"
:query-config="drafts.queryConfig"
:fields="drafts.fields"
:loading="busy"
@update="(v) => onUpdate('queryConfig', v)"
/>
<ModuleAutoCodePanel
v-else-if="activeTab === 'auto-code'"
:module-id="String(selectedModule.b_id)"
:auto-code="drafts.autoCode"
:fields="drafts.fields"
:loading="busy"
@update="onAutoCodeUpdate"
/>
<ModulePowersPanel
v-else-if="activeTab === 'powers'"
:module-id="String(selectedModule.b_id)"
:module-code="selectedModule?.b_code || ''"
:powers="drafts.powers"
:loading="busy"
@update="(v) => onUpdate('powers', v)"
@i18n-saved="onI18nSaved"
/>
<ModuleI18nPanel
v-else-if="activeTab === 'i18n'"
:ref="setI18nPanelRef"
:module-id="String(selectedModule.b_id)"
:i18n-items="i18nItems"
:loading="busy"
/>
</div>
<!-- Tab 导航 + 面板 -->
<a-tabs v-model:activeKey="activeTab" :items="tabItems" class="mm-tabs">
<template #contentRender="{ item }">
<ModuleBasicPanel
v-if="item.key === 'basic'"
:module-id="String(selectedModule.b_id)"
:data="drafts.module"
:parent-name="parentModuleName"
:loading="busy"
@update="(v) => onUpdate('module', v)"
@i18n-saved="onI18nSaved"
/>
<ModuleFieldsPanel
v-else-if="item.key === 'fields'"
:module-id="String(selectedModule.b_id)"
:module-code="selectedModule?.b_code || ''"
:fields="drafts.fields"
:loading="busy"
@update="onFieldsUpdate"
@i18n-saved="onI18nSaved"
@sync-fields="syncFields"
/>
<ModuleListConfigPanel
v-else-if="item.key === 'list'"
:module-id="String(selectedModule.b_id)"
:list-config="drafts.listConfig"
:edit-config="drafts.editConfig"
:query-config="drafts.queryConfig"
:fields="drafts.fields"
:groups="drafts.groups"
:referenced-group-ids="referencedGroupIds"
:loading="busy"
@update="(v) => onUpdate('listConfig', v)"
@groups-saved="onGroupsSaved"
@sync-edit="(v) => onUpdate('editConfig', v)"
@sync-query="(v) => onUpdate('queryConfig', v)"
/>
<ModuleEditConfigPanel
v-else-if="item.key === 'edit'"
:module-id="String(selectedModule.b_id)"
:edit-config="drafts.editConfig"
:list-config="drafts.listConfig"
:query-config="drafts.queryConfig"
:fields="drafts.fields"
:groups="drafts.groups"
:referenced-group-ids="referencedGroupIds"
:loading="busy"
@update="(v) => onUpdate('editConfig', v)"
@groups-saved="onGroupsSaved"
@sync-list="(v) => onUpdate('listConfig', v)"
@sync-query="(v) => onUpdate('queryConfig', v)"
/>
<ModuleQueryConfigPanel
v-else-if="item.key === 'query'"
:module-id="String(selectedModule.b_id)"
:query-config="drafts.queryConfig"
:fields="drafts.fields"
:loading="busy"
@update="(v) => onUpdate('queryConfig', v)"
/>
<ModuleAutoCodePanel
v-else-if="item.key === 'auto-code'"
:module-id="String(selectedModule.b_id)"
:auto-code="drafts.autoCode"
:fields="drafts.fields"
:loading="busy"
@update="onAutoCodeUpdate"
/>
<ModulePowersPanel
v-else-if="item.key === 'powers'"
:module-id="String(selectedModule.b_id)"
:module-code="selectedModule?.b_code || ''"
:powers="drafts.powers"
:loading="busy"
@update="(v) => onUpdate('powers', v)"
@i18n-saved="onI18nSaved"
/>
<ModuleI18nPanel
v-else-if="item.key === 'i18n'"
:ref="setI18nPanelRef"
:module-id="String(selectedModule.b_id)"
:i18n-items="i18nItems"
:loading="busy"
/>
</template>
</a-tabs>
</template>
<!-- 未选中模块 -->
@@ -1354,6 +1341,7 @@ void permissionStore
min-height: 0;
flex-direction: column;
overflow: hidden;
padding: 0 20px;
background: var(--fms-surface);
}
@@ -1365,7 +1353,6 @@ void permissionStore
justify-content: flex-start;
gap: 16px;
min-height: 48px;
padding: 0 20px;
&__switches {
display: flex;
@@ -1375,14 +1362,28 @@ void permissionStore
}
}
/* ---- 顶部栏:tab 导航 ---- */
.mm-tab-bar {
/* ---- antdv a-tabs 容器 ---- */
.mm-tabs {
flex: 1;
min-height: 0;
display: flex;
flex: none;
align-items: center;
height: 44px;
padding: 0 20px;
border-bottom: 1px solid #e4e4e7;
flex-direction: column;
overflow: hidden;
:deep(.ant-tabs-nav) {
margin-bottom: 0;
flex: none;
}
:deep(.ant-tabs-content) {
flex: 1;
min-height: 0;
overflow-y: auto;
}
:deep(.ant-tabs-tabpane) {
padding-top: 16px;
}
}
.mm-switch {
@@ -1394,73 +1395,6 @@ void permissionStore
cursor: pointer;
}
/* ---- 自定义 tab 导航 ---- */
.mm-tab-nav {
display: flex;
flex: 1;
min-width: 0;
align-self: stretch;
align-items: center;
gap: 2px;
overflow-x: auto;
scrollbar-width: none;
&::-webkit-scrollbar {
display: none;
}
&__item {
display: inline-flex;
align-self: stretch;
align-items: center;
padding: 0 12px;
border: 0;
border-radius: 6px;
background: transparent;
color: #71717a;
cursor: pointer;
font-size: 13px;
position: relative;
transition:
background-color 0.15s ease,
color 0.15s ease;
&:hover {
background: #f4f4f5;
color: #3f3f46;
}
&.active {
color: #3f3f46;
font-weight: 500;
background: transparent;
&::after {
content: '';
position: absolute;
left: 12px;
right: 12px;
bottom: -1px;
height: 2px;
border-radius: 2px;
background: #3f3f46;
}
&:hover {
background: #f4f4f5;
color: #3f3f46;
}
}
}
}
.mm-body {
flex: 1;
min-height: 0;
overflow: hidden;
padding: 16px 20px 0;
}
.mm-loading {
display: flex;
align-items: center;