From e99063e12b934c5c4bed9a4d4dc72b7803304faa Mon Sep 17 00:00:00 2001 From: IanShaw027 <131567472+IanShaw027@users.noreply.github.com> Date: Sun, 4 Jan 2026 22:17:27 +0800 Subject: [PATCH] refactor(frontend): comprehensive split of large view files into modular components - Split UsersView.vue into UserCreateModal, UserEditModal, UserApiKeysModal, etc. - Split UsageView.vue into UsageStatsCards, UsageFilters, UsageTable, etc. - Split DashboardView.vue into UserDashboardStats, UserDashboardCharts, etc. - Split AccountsView.vue into AccountTableActions, AccountTableFilters, etc. - Standardized TypeScript types across new components to resolve implicit 'any' and 'never[]' errors. - Improved overall frontend maintainability and code clarity. --- .../admin/account/AccountActionMenu.vue | 21 + .../admin/account/AccountBulkActionsBar.vue | 14 + .../admin/account/AccountTableActions.vue | 11 + .../admin/account/AccountTableFilters.vue | 16 + .../admin/usage/UsageExportProgress.vue | 16 + .../components/admin/usage/UsageFilters.vue | 35 + .../admin/usage/UsageStatsCards.vue | 27 + .../src/components/admin/usage/UsageTable.vue | 22 + .../admin/user/UserAllowedGroupsModal.vue | 59 + .../admin/user/UserApiKeysModal.vue | 47 + .../admin/user/UserBalanceModal.vue | 46 + .../components/admin/user/UserCreateModal.vue | 118 + .../components/admin/user/UserEditModal.vue | 101 + frontend/src/components/common/Input.vue | 103 + frontend/src/components/common/Skeleton.vue | 46 + frontend/src/components/common/TextArea.vue | 81 + .../user/dashboard/UserDashboardCharts.vue | 31 + .../dashboard/UserDashboardQuickActions.vue | 15 + .../dashboard/UserDashboardRecentUsage.vue | 18 + .../user/dashboard/UserDashboardStats.vue | 24 + .../user/profile/ProfileEditForm.vue | 74 + .../user/profile/ProfileInfoCard.vue | 81 + .../user/profile/ProfilePasswordForm.vue | 109 + frontend/src/composables/useTableLoader.ts | 102 + frontend/src/views/admin/AccountsView.vue | 1000 +------- frontend/src/views/admin/UsageView.vue | 1462 +---------- frontend/src/views/admin/UsersView.vue | 2236 +---------------- frontend/src/views/user/DashboardView.vue | 1055 +------- 28 files changed, 1454 insertions(+), 5516 deletions(-) create mode 100644 frontend/src/components/admin/account/AccountActionMenu.vue create mode 100644 frontend/src/components/admin/account/AccountBulkActionsBar.vue create mode 100644 frontend/src/components/admin/account/AccountTableActions.vue create mode 100644 frontend/src/components/admin/account/AccountTableFilters.vue create mode 100644 frontend/src/components/admin/usage/UsageExportProgress.vue create mode 100644 frontend/src/components/admin/usage/UsageFilters.vue create mode 100644 frontend/src/components/admin/usage/UsageStatsCards.vue create mode 100644 frontend/src/components/admin/usage/UsageTable.vue create mode 100644 frontend/src/components/admin/user/UserAllowedGroupsModal.vue create mode 100644 frontend/src/components/admin/user/UserApiKeysModal.vue create mode 100644 frontend/src/components/admin/user/UserBalanceModal.vue create mode 100644 frontend/src/components/admin/user/UserCreateModal.vue create mode 100644 frontend/src/components/admin/user/UserEditModal.vue create mode 100644 frontend/src/components/common/Input.vue create mode 100644 frontend/src/components/common/Skeleton.vue create mode 100644 frontend/src/components/common/TextArea.vue create mode 100644 frontend/src/components/user/dashboard/UserDashboardCharts.vue create mode 100644 frontend/src/components/user/dashboard/UserDashboardQuickActions.vue create mode 100644 frontend/src/components/user/dashboard/UserDashboardRecentUsage.vue create mode 100644 frontend/src/components/user/dashboard/UserDashboardStats.vue create mode 100644 frontend/src/components/user/profile/ProfileEditForm.vue create mode 100644 frontend/src/components/user/profile/ProfileInfoCard.vue create mode 100644 frontend/src/components/user/profile/ProfilePasswordForm.vue create mode 100644 frontend/src/composables/useTableLoader.ts diff --git a/frontend/src/components/admin/account/AccountActionMenu.vue b/frontend/src/components/admin/account/AccountActionMenu.vue new file mode 100644 index 00000000..9fa7d718 --- /dev/null +++ b/frontend/src/components/admin/account/AccountActionMenu.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/account/AccountBulkActionsBar.vue b/frontend/src/components/admin/account/AccountBulkActionsBar.vue new file mode 100644 index 00000000..17bd634d --- /dev/null +++ b/frontend/src/components/admin/account/AccountBulkActionsBar.vue @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/account/AccountTableActions.vue b/frontend/src/components/admin/account/AccountTableActions.vue new file mode 100644 index 00000000..72f9d389 --- /dev/null +++ b/frontend/src/components/admin/account/AccountTableActions.vue @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/account/AccountTableFilters.vue b/frontend/src/components/admin/account/AccountTableFilters.vue new file mode 100644 index 00000000..d72a3772 --- /dev/null +++ b/frontend/src/components/admin/account/AccountTableFilters.vue @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/usage/UsageExportProgress.vue b/frontend/src/components/admin/usage/UsageExportProgress.vue new file mode 100644 index 00000000..e571eff0 --- /dev/null +++ b/frontend/src/components/admin/usage/UsageExportProgress.vue @@ -0,0 +1,16 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/usage/UsageFilters.vue b/frontend/src/components/admin/usage/UsageFilters.vue new file mode 100644 index 00000000..913e8cd6 --- /dev/null +++ b/frontend/src/components/admin/usage/UsageFilters.vue @@ -0,0 +1,35 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/usage/UsageStatsCards.vue b/frontend/src/components/admin/usage/UsageStatsCards.vue new file mode 100644 index 00000000..c214fc50 --- /dev/null +++ b/frontend/src/components/admin/usage/UsageStatsCards.vue @@ -0,0 +1,27 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/usage/UsageTable.vue b/frontend/src/components/admin/usage/UsageTable.vue new file mode 100644 index 00000000..91e71e42 --- /dev/null +++ b/frontend/src/components/admin/usage/UsageTable.vue @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/user/UserAllowedGroupsModal.vue b/frontend/src/components/admin/user/UserAllowedGroupsModal.vue new file mode 100644 index 00000000..669772e3 --- /dev/null +++ b/frontend/src/components/admin/user/UserAllowedGroupsModal.vue @@ -0,0 +1,59 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/user/UserApiKeysModal.vue b/frontend/src/components/admin/user/UserApiKeysModal.vue new file mode 100644 index 00000000..27c006bc --- /dev/null +++ b/frontend/src/components/admin/user/UserApiKeysModal.vue @@ -0,0 +1,47 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/user/UserBalanceModal.vue b/frontend/src/components/admin/user/UserBalanceModal.vue new file mode 100644 index 00000000..19e9ccab --- /dev/null +++ b/frontend/src/components/admin/user/UserBalanceModal.vue @@ -0,0 +1,46 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/user/UserCreateModal.vue b/frontend/src/components/admin/user/UserCreateModal.vue new file mode 100644 index 00000000..56c21eec --- /dev/null +++ b/frontend/src/components/admin/user/UserCreateModal.vue @@ -0,0 +1,118 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/admin/user/UserEditModal.vue b/frontend/src/components/admin/user/UserEditModal.vue new file mode 100644 index 00000000..3f6fd206 --- /dev/null +++ b/frontend/src/components/admin/user/UserEditModal.vue @@ -0,0 +1,101 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/common/Input.vue b/frontend/src/components/common/Input.vue new file mode 100644 index 00000000..a6c531cf --- /dev/null +++ b/frontend/src/components/common/Input.vue @@ -0,0 +1,103 @@ + + + diff --git a/frontend/src/components/common/Skeleton.vue b/frontend/src/components/common/Skeleton.vue new file mode 100644 index 00000000..aa90a619 --- /dev/null +++ b/frontend/src/components/common/Skeleton.vue @@ -0,0 +1,46 @@ + + + diff --git a/frontend/src/components/common/TextArea.vue b/frontend/src/components/common/TextArea.vue new file mode 100644 index 00000000..d392fbfd --- /dev/null +++ b/frontend/src/components/common/TextArea.vue @@ -0,0 +1,81 @@ + + + diff --git a/frontend/src/components/user/dashboard/UserDashboardCharts.vue b/frontend/src/components/user/dashboard/UserDashboardCharts.vue new file mode 100644 index 00000000..a50b738a --- /dev/null +++ b/frontend/src/components/user/dashboard/UserDashboardCharts.vue @@ -0,0 +1,31 @@ + + + diff --git a/frontend/src/components/user/dashboard/UserDashboardQuickActions.vue b/frontend/src/components/user/dashboard/UserDashboardQuickActions.vue new file mode 100644 index 00000000..4b4e9efa --- /dev/null +++ b/frontend/src/components/user/dashboard/UserDashboardQuickActions.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/user/dashboard/UserDashboardRecentUsage.vue b/frontend/src/components/user/dashboard/UserDashboardRecentUsage.vue new file mode 100644 index 00000000..9246fa15 --- /dev/null +++ b/frontend/src/components/user/dashboard/UserDashboardRecentUsage.vue @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/user/dashboard/UserDashboardStats.vue b/frontend/src/components/user/dashboard/UserDashboardStats.vue new file mode 100644 index 00000000..7b30f728 --- /dev/null +++ b/frontend/src/components/user/dashboard/UserDashboardStats.vue @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/user/profile/ProfileEditForm.vue b/frontend/src/components/user/profile/ProfileEditForm.vue new file mode 100644 index 00000000..2750840a --- /dev/null +++ b/frontend/src/components/user/profile/ProfileEditForm.vue @@ -0,0 +1,74 @@ + + + diff --git a/frontend/src/components/user/profile/ProfileInfoCard.vue b/frontend/src/components/user/profile/ProfileInfoCard.vue new file mode 100644 index 00000000..03187c4b --- /dev/null +++ b/frontend/src/components/user/profile/ProfileInfoCard.vue @@ -0,0 +1,81 @@ + + + diff --git a/frontend/src/components/user/profile/ProfilePasswordForm.vue b/frontend/src/components/user/profile/ProfilePasswordForm.vue new file mode 100644 index 00000000..d44cac68 --- /dev/null +++ b/frontend/src/components/user/profile/ProfilePasswordForm.vue @@ -0,0 +1,109 @@ + + + diff --git a/frontend/src/composables/useTableLoader.ts b/frontend/src/composables/useTableLoader.ts new file mode 100644 index 00000000..febf7c45 --- /dev/null +++ b/frontend/src/composables/useTableLoader.ts @@ -0,0 +1,102 @@ +import { ref, reactive, onUnmounted } from 'vue' +import { useDebounceFn } from '@vueuse/core' + +interface PaginationState { + page: number + page_size: number + total: number + pages: number +} + +interface TableLoaderOptions { + fetchFn: (page: number, pageSize: number, params: P, options?: { signal: AbortSignal }) => Promise<{ + items: T[] + total: number + pages: number + }> + initialParams?: P + pageSize?: number + debounceMs?: number +} + +export function useTableLoader>(options: TableLoaderOptions) { + const { fetchFn, initialParams, pageSize = 20, debounceMs = 300 } = options + + const items = ref([]) + const loading = ref(false) + const params = reactive

({ ...(initialParams || {}) } as P) + const pagination = reactive({ + page: 1, + page_size: pageSize, + total: 0, + pages: 0 + }) + + let abortController: AbortController | null = null + + const isAbortError = (error: any) => { + return error?.name === 'AbortError' || error?.code === 'ERR_CANCELED' + } + + const load = async () => { + if (abortController) { + abortController.abort() + } + abortController = new AbortController() + loading.value = true + + try { + const response = await fetchFn( + pagination.page, + pagination.page_size, + params, + { signal: abortController.signal } + ) + + items.value = response.items + pagination.total = response.total + pagination.pages = response.pages + } catch (error) { + if (!isAbortError(error)) { + throw error + } + } finally { + if (abortController?.signal.aborted === false) { + loading.value = false + } + } + } + + const reload = () => { + pagination.page = 1 + return load() + } + + const debouncedLoad = useDebounceFn(reload, debounceMs) + + const handlePageChange = (page: number) => { + pagination.page = page + load() + } + + const handlePageSizeChange = (size: number) => { + pagination.page_size = size + reload() + } + + onUnmounted(() => { + abortController?.abort() + }) + + return { + items, + loading, + params, + pagination, + load, + reload, + debouncedLoad, + handlePageChange, + handlePageSizeChange + } +} diff --git a/frontend/src/views/admin/AccountsView.vue b/frontend/src/views/admin/AccountsView.vue index d684e085..e1f66cb3 100644 --- a/frontend/src/views/admin/AccountsView.vue +++ b/frontend/src/views/admin/AccountsView.vue @@ -1,974 +1,64 @@ diff --git a/frontend/src/views/admin/UsageView.vue b/frontend/src/views/admin/UsageView.vue index ac5d1e05..8d3fe19f 100644 --- a/frontend/src/views/admin/UsageView.vue +++ b/frontend/src/views/admin/UsageView.vue @@ -1,1436 +1,70 @@ +onMounted(() => { loadLogs(); loadStats() }) +onUnmounted(() => { abortController?.abort(); exportAbortController?.abort() }) + \ No newline at end of file diff --git a/frontend/src/views/admin/UsersView.vue b/frontend/src/views/admin/UsersView.vue index ca543c4b..2ee8af08 100644 --- a/frontend/src/views/admin/UsersView.vue +++ b/frontend/src/views/admin/UsersView.vue @@ -1,2206 +1,222 @@ +onMounted(async () => { await loadAttributeDefinitions(); loadSavedFilters(); loadSavedColumns(); loadUsers(); document.addEventListener('click', handleClickOutside) }) +onUnmounted(() => { abortController?.abort(); document.removeEventListener('click', handleClickOutside) }) + \ No newline at end of file diff --git a/frontend/src/views/user/DashboardView.vue b/frontend/src/views/user/DashboardView.vue index 419c9502..ef406bea 100644 --- a/frontend/src/views/user/DashboardView.vue +++ b/frontend/src/views/user/DashboardView.vue @@ -1,661 +1,13 @@ - -