From 3179754670bb7d54d172791ba4d44f65e20ab510 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 28 Oct 2026 15:33:49 +0800 Subject: [PATCH] feat(admin): polish badge, OAuth and payment gateway settings UX - Badge page: rewrite as collapsible sortable category/item cards with preset medal icon picker, dirty-tracked save bar and duplicate slug check; drop user_badge_* dual-read and legacy name/icon_url fallbacks - OAuth: provider config groups collapsible, expanded when provider is on; clogin visibility moved to group-level dependsOn - Gateway: expandWhen accepts dependsOn-style rules; select-gated groups no longer always expand ('null' was truthy); mark five gateway secrets as secret/password in JS and PHP; class-based notice list styling - Remove unused UserRuntime::parse_badge_dictionary Co-Authored-By: Claude Fable 5 --- assets/admin/src/components/form/AksField.vue | 6 + .../src/components/form/AksFormRenderer.vue | 17 +- assets/admin/src/pages/users/UsersBadge.vue | 263 +++++++----------- .../partials/badge/MedalCategoryCard.vue | 97 +++++++ .../users/partials/badge/MedalIconPicker.vue | 82 ++++++ .../users/partials/badge/MedalItemCard.vue | 79 ++++++ .../pages/users/partials/badge/badge-model.js | 63 +++++ .../src/schema/sections/payment/gateway.js | 27 +- .../admin/src/schema/sections/users/badge.js | 11 +- .../admin/src/schema/sections/users/oauth.js | 24 +- src/Admin/Schema/SchemaPayment.php | 32 +-- src/Admin/Schema/SchemaUsers.php | 26 +- src/Settings/UserRuntime.php | 14 +- 13 files changed, 502 insertions(+), 239 deletions(-) create mode 100644 assets/admin/src/pages/users/partials/badge/MedalCategoryCard.vue create mode 100644 assets/admin/src/pages/users/partials/badge/MedalIconPicker.vue create mode 100644 assets/admin/src/pages/users/partials/badge/MedalItemCard.vue create mode 100644 assets/admin/src/pages/users/partials/badge/badge-model.js diff --git a/assets/admin/src/components/form/AksField.vue b/assets/admin/src/components/form/AksField.vue index adf0a8c5..ef2e7636 100644 --- a/assets/admin/src/components/form/AksField.vue +++ b/assets/admin/src/components/form/AksField.vue @@ -948,6 +948,12 @@ function updateRepeaterItem(index, fieldKey, value) { line-height: 1.6; } +.aksrt-field__content :deep(ul) { + margin: 0; + padding-left: 18px; + line-height: 1.9; +} + /* Mobile */ @media (max-width: 768px) { .aksrt-field__link, diff --git a/assets/admin/src/components/form/AksFormRenderer.vue b/assets/admin/src/components/form/AksFormRenderer.vue index 61e0c382..921bd3c6 100644 --- a/assets/admin/src/components/form/AksFormRenderer.vue +++ b/assets/admin/src/components/form/AksFormRenderer.vue @@ -248,16 +248,21 @@ function isGroupVisible(group) { return matchDependsOn(group.dependsOn) } +/** + * expandWhen 与 dependsOn 同语法(表单 key 字符串或规则对象),规则成立时分组默认展开。 + * 下拉值如 'null' 也是真值,所以按选项判断的分组要写规则对象,不能只写 key。 + */ +function isGroupExpanded(group) { + return matchDependsOn(group.expandWhen) +} + /** * Collapse preference for a group. - * - expandWhen: form key; when truthy, start expanded (channel just enabled → open form) + * - expandWhen: rule; when matched, start expanded (channel just enabled → open form) * - defaultCollapsed: static default */ function resolveGroupCollapsed(group) { - if (group.expandWhen) { - const on = !!props.formData?.[group.expandWhen] - return !on - } + if (group.expandWhen) return !isGroupExpanded(group) return !!group.defaultCollapsed } @@ -265,7 +270,7 @@ function resolveGroupCollapsed(group) { function groupKey(group) { const base = group.key || group.title || 'group' if (group.expandWhen) { - return `${base}:${props.formData?.[group.expandWhen] ? 'on' : 'off'}` + return `${base}:${isGroupExpanded(group) ? 'on' : 'off'}` } return base } diff --git a/assets/admin/src/pages/users/UsersBadge.vue b/assets/admin/src/pages/users/UsersBadge.vue index cc05e113..a8896501 100644 --- a/assets/admin/src/pages/users/UsersBadge.vue +++ b/assets/admin/src/pages/users/UsersBadge.vue @@ -1,9 +1,6 @@