refactor: migrate wechat to user attributes and enhance users list
Migrate the hardcoded wechat field to the new extensible user attributes system and improve the users management UI. Migration: - Add migration 019 to move wechat data to user_attribute_values - Remove wechat field from User entity, DTOs, and API contracts - Clean up wechat-related code from backend and frontend UsersView enhancements: - Add text labels to action buttons (Filter Settings, Column Settings, Attributes Config) for better UX - Change status column to show colored dot + Chinese text instead of English text - Add dynamic attribute columns support with batch loading - Add column visibility settings with localStorage persistence - Add filter settings modal for search and filter preferences - Update i18n translations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -434,9 +434,7 @@ export default {
|
||||
administrator: 'Administrator',
|
||||
user: 'User',
|
||||
username: 'Username',
|
||||
wechat: 'WeChat ID',
|
||||
enterUsername: 'Enter username',
|
||||
enterWechat: 'Enter WeChat ID',
|
||||
editProfile: 'Edit Profile',
|
||||
updateProfile: 'Update Profile',
|
||||
updating: 'Updating...',
|
||||
@@ -565,12 +563,10 @@ export default {
|
||||
email: 'Email',
|
||||
password: 'Password',
|
||||
username: 'Username',
|
||||
wechat: 'WeChat ID',
|
||||
notes: 'Notes',
|
||||
enterEmail: 'Enter email',
|
||||
enterPassword: 'Enter password',
|
||||
enterUsername: 'Enter username (optional)',
|
||||
enterWechat: 'Enter WeChat ID (optional)',
|
||||
enterNotes: 'Enter notes (admin only)',
|
||||
notesHint: 'This note is only visible to administrators',
|
||||
enterNewPassword: 'Enter new password (optional)',
|
||||
@@ -582,7 +578,6 @@ export default {
|
||||
columns: {
|
||||
user: 'User',
|
||||
username: 'Username',
|
||||
wechat: 'WeChat ID',
|
||||
notes: 'Notes',
|
||||
role: 'Role',
|
||||
subscriptions: 'Subscriptions',
|
||||
@@ -653,7 +648,67 @@ export default {
|
||||
failedToDeposit: 'Failed to deposit',
|
||||
failedToWithdraw: 'Failed to withdraw',
|
||||
useDepositWithdrawButtons: 'Please use deposit/withdraw buttons to adjust balance',
|
||||
insufficientBalance: 'Insufficient balance, balance cannot be negative after withdrawal'
|
||||
insufficientBalance: 'Insufficient balance, balance cannot be negative after withdrawal',
|
||||
// Settings Dropdowns
|
||||
filterSettings: 'Filter Settings',
|
||||
columnSettings: 'Column Settings',
|
||||
filterValue: 'Enter value',
|
||||
// User Attributes
|
||||
attributes: {
|
||||
title: 'User Attributes',
|
||||
description: 'Configure custom user attribute fields',
|
||||
configButton: 'Attributes',
|
||||
addAttribute: 'Add Attribute',
|
||||
editAttribute: 'Edit Attribute',
|
||||
deleteAttribute: 'Delete Attribute',
|
||||
deleteConfirm: "Are you sure you want to delete attribute '{name}'? All user values for this attribute will be deleted.",
|
||||
noAttributes: 'No custom attributes',
|
||||
noAttributesHint: 'Click the button above to add custom attributes',
|
||||
key: 'Attribute Key',
|
||||
keyHint: 'For programmatic reference, only letters, numbers and underscores',
|
||||
name: 'Display Name',
|
||||
nameHint: 'Name shown in forms',
|
||||
type: 'Attribute Type',
|
||||
fieldDescription: 'Description',
|
||||
fieldDescriptionHint: 'Description text for the attribute',
|
||||
placeholder: 'Placeholder',
|
||||
placeholderHint: 'Placeholder text for input field',
|
||||
required: 'Required',
|
||||
enabled: 'Enabled',
|
||||
options: 'Options',
|
||||
optionsHint: 'For select/multi-select types',
|
||||
addOption: 'Add Option',
|
||||
optionValue: 'Option Value',
|
||||
optionLabel: 'Display Text',
|
||||
validation: 'Validation Rules',
|
||||
minLength: 'Min Length',
|
||||
maxLength: 'Max Length',
|
||||
min: 'Min Value',
|
||||
max: 'Max Value',
|
||||
pattern: 'Regex Pattern',
|
||||
patternMessage: 'Validation Error Message',
|
||||
types: {
|
||||
text: 'Text',
|
||||
textarea: 'Textarea',
|
||||
number: 'Number',
|
||||
email: 'Email',
|
||||
url: 'URL',
|
||||
date: 'Date',
|
||||
select: 'Select',
|
||||
multi_select: 'Multi-Select'
|
||||
},
|
||||
created: 'Attribute created successfully',
|
||||
updated: 'Attribute updated successfully',
|
||||
deleted: 'Attribute deleted successfully',
|
||||
reordered: 'Attribute order updated successfully',
|
||||
failedToLoad: 'Failed to load attributes',
|
||||
failedToCreate: 'Failed to create attribute',
|
||||
failedToUpdate: 'Failed to update attribute',
|
||||
failedToDelete: 'Failed to delete attribute',
|
||||
failedToReorder: 'Failed to update order',
|
||||
keyExists: 'Attribute key already exists',
|
||||
dragToReorder: 'Drag to reorder'
|
||||
}
|
||||
},
|
||||
|
||||
// Groups
|
||||
|
||||
Reference in New Issue
Block a user