Skip to content

fix: overview perm - #7850

Merged
wangdan-fit2cloud merged 1 commit into
v3from
pr@v3@feat_overview_perm
Nov 12, 2026
Merged

wangdan-fit2cloud merged 1 commit into
v3from
pr@v3@feat_overview_perm

Conversation

@shaohuzhang1

Copy link
Copy Markdown
Contributor

fix: overview perm

<template v-for="application in applicationsList" :key="application.id">
<el-option :label="application.name" :value="application.id">
<div class="flex-align-center gap-2">
<ApplicationIcon :icon="application.icon" :size="20" class="shrink-0" />

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is an analysis of the code changes, highlighting potential issues, irregularities, and optimization suggestions:

1. Critical Issue: Broken Initialization Logic

  • Observation: The call void loadApplications() inside onMounted has been commented out. Consequently, applicationsList will remain empty ([]) on component mount.
  • Impact: The dropdown for "Monitoring Agent Filtering" will show no options initially. Users cannot select any agent until they manually trigger a remote search (if remote-filterable allows it without initial data) or unless other lifecycle hooks are missing from the snippet.
  • Suggestion: Un-comment the line or implement an alternative initialization strategy if the permission check prevents immediate loading. If the intention is to only load after permission check or user interaction, ensure the UX supports an empty state gracefully.

2. Security & Permission Check Side Effects

  • Observation: perm.application.workspace.isShare() is added inside loadApplications.
  • Issue: loadApplications returns early if permission is denied. However, applicationsLoading is set to false only in .finally(), which is never reached due to the return statement. While technically safe (stays false), it lacks explicit clarity. More importantly, if this function is called multiple times concurrently, there's no cancellation logic for the API request.
  • Optimization:
    function loadApplications(query = '') {
      if (!perm.application.workspace.isShare()) return; 
      applicationsLoading.value = true;
      
      // Consider using abort signals if switching routes/filters rapidly
      return ApplicationApi.getApplicationPage({ currentPage: 1, pageSize: 200 }, { name: query })
        .then((result) => {
          // Prevent overwriting with stale data if multiple requests are in flight
          applicationsList.value = result.records; 
        })
        .catch((err) => {
           console.error("Failed to load applications", err);
           // Optionally clear list or show error
        })
        .finally(() => {
          applicationsLoading.value = false;
        });
    }

3. Variable Naming Consistency

  • Observation: applications -> applicationsList.
  • Comment: Good refactor. applicationsList better reflects that it holds a list, distinguishing it from potentially singular concepts or API responses. Maintain consistency across the template and script.

4. Type Safety in handleApplicationChange

  • Observation: Parameter changed from value: string to value: string | undefined. This correctly handles the clearable behavior of el-select.
  • Logic Check:
    applicationId.value = value || 'all'; // Sets to 'all' if cleared
    selectedApplication.value = applicationsList.value.find(...) // Will find 'all'? No.
    • Potential Bug: selectedApplication.value will become undefined when cleared because no application ID matches 'all'. This is likely intended behavior (resetting selected item), but ensure downstream components relying on selectedApplication can handle undefined.

5. Template Optimization (el-option rendering)

  • Observation: The loop changed to v-for="application in applicationsList".
  • Performance Note: Since filterable and remote are used, ensure that displaying all records from the page API is acceptable UX. If the dataset grows large beyond 200 items, consider using virtual scrolling or ensuring pagination logic aligns with user expectations.
  • Small Improvement: In <template v-for="...">, Vue 3 recommends placing :key on the same element as the v-for directive or inside the slot content directly within a fragment wrapper. Placing key on <template> is valid and recommended.

6. Missing Dependency Consideration

  • The loadApplications function depends on external state/APIs. It’s good practice to debounce rapid successive calls to ApplicationApi.getApplicationPage during typing/filtering to avoid excess network traffic.

Recommended Final Fixes Code Snippet:

 <script setup>
 // Existing imports...
 import perm from '@/permission'
 
-const applications = ref<ApplicationDetail[]>([])
+const applicationsList = ref<ApplicationDetail[]>([])

@@ -13,24 +14,26 @@ const workspaceId = computed(() => String(route.params.workspaceId))
 
 /* 监控智能体筛选 */
 const applicationId = ref('all')
-const applications = ref<ApplicationDetail[]>([])
+const applicationsList = ref<ApplicationDetail[]>([])
 const applicationsLoading = ref(false)
 const selectedApplication = ref<ApplicationDetail>()
 function loadApplications(query = '') {
   if (!perm.application.workspace.isShare()) return;
   
   applicationsLoading.value = true;
-  
-  return ApplicationApi.getApplicationPage({ currentPage: 1, pageSize: 200 }, { name: query })
+  const requestParams = { currentPage: 1, pageSize: 200 };
+  
+  return ApplicationApi.getApplicationPage(requestParams, { name: query })
     .then((result) => {
       applicationsList.value = result.records;
     })
     .catch(err => {
       console.error("[HomeStatistics] Failed to fetch apps:", err);
     })
     .finally(() => {
       applicationsLoading.value = false;
     });
 }
 function handleApplicationChange(value: string | undefined) {
   // Handle clearing selection
   if (!value) {
       applicationId.value = 'all';
       selectedApplication.value = undefined;
       return;
   }
   
   applicationId.value = value;
   selectedApplication.value = applicationsList.value.find(
       (application) => application.id === value
   );
 }
 
 onMounted(() => {
-  // void loadApplications()
+  // Re-enable or conditionally enable initial load based on requirements
+  // If load is needed on mount despite permission checks:
+  if (perm.application.workspace.isShare()) {
+      void loadApplications(); 
+  }
 })
 </script>
 
 <template>
@@ -43,8 +46,10 @@ onMounted(() => {
     <!-- 监控 -->
     <HomeStatistics class="mt-4" :workspace-id="workspaceId" :application-id="applicationId" :api="HomepageApi">
       <template #application="{ loading }">
-        <el-select
+        <!-- Note: Added placeholder if needed -->
+        <el-select
           v-model="applicationId"
+          :loading="applicationsLoading" 
           clearable
           filterable
-          remote
+          remote
           fit-input-width
           @change="handleApplicationChange"
+          :remote-method="loadApplications" <!-- Ensure remote-method is linked if needed -->
         >

@wangdan-fit2cloud
wangdan-fit2cloud merged commit 6213680 into v3 Nov 12, 2026
3 of 4 checks passed
@wangdan-fit2cloud
wangdan-fit2cloud deleted the pr@v3@feat_overview_perm branch November 12, 2026 03:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants