fix(ui): show customer feature settings open, not collapsed

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-24 16:28:24 +03:30
co-authored by Cursor
parent a6dbc995c1
commit 7f3e537c24
+115 -51
View File
@@ -454,17 +454,33 @@ async function purgeNonOwned() {
} }
} }
const collapsedSettingGroups = computed(() =>
visibleSettingGroups.value.filter((g) => g.id !== 'customer_features'),
)
const customerFeaturesGroup = computed(() =>
visibleSettingGroups.value.find((g) => g.id === 'customer_features') ?? null,
)
const customerFeaturesRows = computed(
() => groupedFiltered.value.customer_features ?? [],
)
const hasAnyVisibleSettings = computed(
() => visibleSettingGroups.value.length > 0,
)
const defaultOpenGroupId = computed(() => { const defaultOpenGroupId = computed(() => {
const visibleIds = visibleSettingGroups.value.map((g) => g.id) const visibleIds = collapsedSettingGroups.value.map((g) => g.id)
const preferred = ['customer_features', 'chart', 'pricing', 'payping', 'store', 'general'] const preferred = ['chart', 'pricing', 'payping', 'store', 'general']
return preferred.find((id) => visibleIds.includes(id)) ?? visibleIds[0] return preferred.find((id) => visibleIds.includes(id)) ?? visibleIds[0]
}) })
watch( watch(
visibleSettingGroups, collapsedSettingGroups,
(groups) => { (groups) => {
const ids = new Set(groups.map((g) => g.id)) const ids = new Set(groups.map((g) => g.id))
if (activeKey.value && !ids.has(activeKey.value)) { if (activeKey.value && !ids.has(String(activeKey.value))) {
activeKey.value = groups[0]?.id activeKey.value = groups[0]?.id
} }
if (!activeKey.value && groups.length) { if (!activeKey.value && groups.length) {
@@ -620,52 +636,19 @@ onMounted(load)
</div> </div>
</div> </div>
<a-collapse <template v-if="hasAnyVisibleSettings">
v-if="visibleSettingGroups.length" <section v-if="customerFeaturesGroup && customerFeaturesRows.length" class="features-open-section">
v-model:activeKey="activeKey" <div class="features-open-section__head">
accordion <component :is="GROUP_ICONS.customer_features || TeamOutlined" class="settings-collapse-icon" />
class="settings-collapse" <span class="settings-collapse-title">{{ customerFeaturesGroup.title }}</span>
:bordered="false" <a-badge
> :count="customerFeaturesRows.length"
<a-collapse-panel v-for="group in visibleSettingGroups" :key="group.id"> :number-style="{ backgroundColor: '#d4af37', color: '#fff', fontSize: '11px' }"
<template #header> />
<div class="settings-collapse-header"> </div>
<component :is="GROUP_ICONS[group.id] || EllipsisOutlined" class="settings-collapse-icon" /> <a-row :gutter="[16, 16]" class="settings-grid">
<span class="settings-collapse-title">{{ group.title }}</span>
<a-badge
:count="groupedFiltered[group.id].length"
:number-style="{ backgroundColor: '#d4af37', color: '#fff', fontSize: '11px' }"
/>
</div>
</template>
<template v-if="group.subsections?.length">
<div v-for="block in subsectionBlocks(group)" :key="block.id" class="settings-subsection">
<h3 class="settings-subsection__title">{{ block.title }}</h3>
<a-row :gutter="[16, 16]" class="settings-grid">
<a-col
v-for="row in block.rows"
:key="rowKey(row)"
:xs="24"
:sm="12"
:lg="rowColSpan(row)"
>
<SettingCard
:row="row"
:model-value="draftValue(row)"
:disabled="!canWrite"
:saving="isSaving(row)"
:saved-flash="isSavedFlash(row)"
@update:value="onValueChange(row, $event)"
@blur="onFieldBlur(row)"
/>
</a-col>
</a-row>
</div>
</template>
<a-row v-else :gutter="[16, 16]" class="settings-grid">
<a-col <a-col
v-for="row in groupedFiltered[group.id]" v-for="row in customerFeaturesRows"
:key="rowKey(row)" :key="rowKey(row)"
:xs="24" :xs="24"
:sm="12" :sm="12"
@@ -682,8 +665,73 @@ onMounted(load)
/> />
</a-col> </a-col>
</a-row> </a-row>
</a-collapse-panel> </section>
</a-collapse>
<a-collapse
v-if="collapsedSettingGroups.length"
v-model:activeKey="activeKey"
accordion
class="settings-collapse"
:bordered="false"
>
<a-collapse-panel v-for="group in collapsedSettingGroups" :key="group.id">
<template #header>
<div class="settings-collapse-header">
<component :is="GROUP_ICONS[group.id] || EllipsisOutlined" class="settings-collapse-icon" />
<span class="settings-collapse-title">{{ group.title }}</span>
<a-badge
:count="groupedFiltered[group.id].length"
:number-style="{ backgroundColor: '#d4af37', color: '#fff', fontSize: '11px' }"
/>
</div>
</template>
<template v-if="group.subsections?.length">
<div v-for="block in subsectionBlocks(group)" :key="block.id" class="settings-subsection">
<h3 class="settings-subsection__title">{{ block.title }}</h3>
<a-row :gutter="[16, 16]" class="settings-grid">
<a-col
v-for="row in block.rows"
:key="rowKey(row)"
:xs="24"
:sm="12"
:lg="rowColSpan(row)"
>
<SettingCard
:row="row"
:model-value="draftValue(row)"
:disabled="!canWrite"
:saving="isSaving(row)"
:saved-flash="isSavedFlash(row)"
@update:value="onValueChange(row, $event)"
@blur="onFieldBlur(row)"
/>
</a-col>
</a-row>
</div>
</template>
<a-row v-else :gutter="[16, 16]" class="settings-grid">
<a-col
v-for="row in groupedFiltered[group.id]"
:key="rowKey(row)"
:xs="24"
:sm="12"
:lg="rowColSpan(row)"
>
<SettingCard
:row="row"
:model-value="draftValue(row)"
:disabled="!canWrite"
:saving="isSaving(row)"
:saved-flash="isSavedFlash(row)"
@update:value="onValueChange(row, $event)"
@blur="onFieldBlur(row)"
/>
</a-col>
</a-row>
</a-collapse-panel>
</a-collapse>
</template>
<a-empty <a-empty
v-else v-else
:description=" :description="
@@ -787,6 +835,22 @@ onMounted(load)
.settings-collapse { .settings-collapse {
background: transparent; background: transparent;
} }
.features-open-section {
margin-bottom: 16px;
padding: 16px 18px 8px;
background: var(--admin-bg-elevated);
border: 1px solid var(--admin-border);
border-radius: 10px;
box-shadow: 0 1px 3px var(--admin-shadow);
}
.features-open-section__head {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 14px;
padding-bottom: 12px;
border-bottom: 1px solid var(--admin-border);
}
.settings-collapse :deep(.ant-collapse-item) { .settings-collapse :deep(.ant-collapse-item) {
margin-bottom: 12px; margin-bottom: 12px;
background: var(--admin-bg-elevated); background: var(--admin-bg-elevated);