- Menu page: auto-scan ViewSet APIs for a selected menu, preview & batch
create MenuButton records with inline name/value editing, grouped table
- Role page: group button permissions by Model > CRUD intent (Read/Write/
Delete/Other) with expand/collapse, indeterminate checkboxes
- Backend: new batch_set_role_menu_btn action + value field in serializer
- Frontend: 300ms debounced batch updates to avoid DB lock on rapid toggles
- i18n: add scan.* keys and role intent labels for zh-cn/en/zh-tw
- scan_get_apps: scan views/ subdirectories instead of apps registry
- scan_viewset: scan submodules in views/ directory using pkgutil
- Fix model name extraction using removesuffix instead of fixed slice
- Add class ID deduplication to avoid duplicate ViewSets
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add dvadmin.test_app with BlogViewSet and ProductViewSet for testing
- Fix scan_viewset to exclude base classes (CustomModelViewSet, etc.)
- ScanModal: upgrade to el-collapse grouped table (collapsible ViewSet groups)
- Add toolbar: select all / deselect all
- Group header checkbox with indeterminate state
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- scan_get_apps: list all scannable Django apps under dvadmin
- scan_viewset: scan ViewSet actions and return preview data
- scan_batch_create: bulk create MenuButton records
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add check_inquiry_published_notifications() task scanning status 3/4 inquiries every 1 min
- Add check_quote_completed_notifications() task scanning status 5 inquiries every 1 min
- Both respect 24h EmailNotice cooldown and follow existing check_quote_deadline_expired pattern
- Return dict with checked/sent/skipped/errors counts
- Add quoteDeadlineStart/End/Separator keys to pissupplier i18n
- Replace hardcoded Chinese date placeholders with i18n calls
- Replace hardcoded '币别' placeholder with i18n key
- Accept optional t param in commonCrudConfig
- Replace hardcoded Chinese placeholders with i18n calls
- Add system/common i18n files for en, zh-cn, zh-tw
- Update loginLog/crud.tsx to pass t to commonCrudConfig
- Add rfs_operation_logs i18n files for en, zh-cn, zh-tw
- Replace hardcoded Chinese labels with t() calls in crud.tsx
- Column titles, placeholders, and formatters now use i18n
- Add buyerDashboard and supplierDashboard i18n keys to home module
(zh-cn / en / zh-tw)
- Replace all hardcoded Chinese text in BuyerDashboard.vue and
SupplierDashboard.vue with $t() calls
- Update index.vue role switcher buttons to use i18n
- quickNav items, chart legend, KPI labels all now support i18n
The export keyword inside <script setup> caused a conflict with
vite-plugin-vue-setup-extend plugin. Removed export since
createCrudOptions is only used locally by useFs().
Apply PR 157 i18n pattern to formContent, associationTable, and crudTable:
- formContent: useI18n, $t() in template, themeConfig.globalI18n in API,
title_i18n fallback for display
- associationTable: $t() for labels and placeholders
- crudTable: useI18n for FastCRUD column titles and validation
- Modify formatAxis to return i18n keys instead of hardcoded strings
- Update account.vue and changePwd.vue to translate the greeting
- Add useI18n to personal/index.vue and translate the greeting
The login i18n files were exporting flat structures that didn't match
the expected key paths like message.pages.login.loginTitle.
Wrapped content in message.pages.login.* structure like other i18n modules.
Backend:
- Improve menu title language detection (query param, user lang, Accept-Language)
- Fix user language update to use correct update_datetime field
- Add menu i18n sync management command
- Add migrations for company/miscprocurement i18n fields
Frontend:
- Clear tagsView cache on language switch to reload titles in new language