diff --git a/apps/desktop/src/components/nacos/NacosAdminConsole.vue b/apps/desktop/src/components/nacos/NacosAdminConsole.vue index 9f8924ba57..47687c16f1 100644 --- a/apps/desktop/src/components/nacos/NacosAdminConsole.vue +++ b/apps/desktop/src/components/nacos/NacosAdminConsole.vue @@ -178,6 +178,7 @@ const importSourceName = ref(""); const configEditorTheme = new Compartment(); const configEditorFontTheme = new Compartment(); const configEditorLanguage = new Compartment(); +const configListRequestGuard = createNacosLatestRequestGuard(); const configDetailRequestGuard = createNacosLatestRequestGuard(); let configEditorGeneration = 0; let configEditorSessionId = 0; @@ -389,6 +390,7 @@ function buildConfigSelector(scope: NacosConfigSelectionScope): NacosConfigSelec ? { namespace: namespace.value || undefined, group: configGroup.value.trim() || undefined, + groupContains: true, dataId: configDataId.value.trim() || undefined, appName: configAppName.value.trim() || undefined, } @@ -656,36 +658,69 @@ async function loadInfo() { } } -async function loadConfigs(page = configPageNo.value) { +async function loadConfigs(page = configPageNo.value): Promise { + const requestId = configListRequestGuard.begin(); + const connectionId = props.connectionId; + const requestNamespace = namespace.value; + const requestGroup = configGroup.value.trim(); + const requestDataId = configDataId.value.trim(); + const requestAppName = configAppName.value.trim(); + const requestPageSize = configPageSize.value; + const isCurrentRequest = () => + configListRequestGuard.isCurrent(requestId) && + connectionId === props.connectionId && + requestNamespace === namespace.value && + requestGroup === configGroup.value.trim() && + requestDataId === configDataId.value.trim() && + requestAppName === configAppName.value.trim() && + requestPageSize === configPageSize.value; configLoading.value = true; configError.value = ""; configPageNo.value = page; try { - const result = await api.nacosListConfigs(props.connectionId, { - namespace: namespace.value || undefined, - group: configGroup.value.trim() || undefined, - dataId: configDataId.value.trim() || undefined, - appName: configAppName.value.trim() || undefined, - pageNo: configPageNo.value, - pageSize: configPageSize.value, + const result = await api.nacosListConfigs(connectionId, { + namespace: requestNamespace || undefined, + group: requestGroup || undefined, + groupContains: true, + dataId: requestDataId || undefined, + appName: requestAppName || undefined, + pageNo: page, + pageSize: requestPageSize, }); + if (!isCurrentRequest()) return false; configs.value = applyKnownConfigFormats(result.items.map(normalizeConfigItemFormat)); configTotal.value = result.totalCount; + return true; } catch (error) { - await handleRNacosConsoleError(error, () => loadConfigs(page), "config"); + if (!isCurrentRequest()) return false; + await handleRNacosConsoleError( + error, + async () => { + await loadConfigs(page); + }, + "config", + ); + return true; } finally { - configLoading.value = false; + if (configListRequestGuard.isCurrent(requestId)) configLoading.value = false; } } async function loadConfigsWithRetry(page = configPageNo.value) { for (let attempt = 0; ; attempt += 1) { - await loadConfigs(page); - if (!isConnectionNotFoundError(configError.value) || attempt >= CONNECTION_NOT_FOUND_RETRY_DELAYS_MS.length) return; + const current = await loadConfigs(page); + if (!current || !isConnectionNotFoundError(configError.value) || attempt >= CONNECTION_NOT_FOUND_RETRY_DELAYS_MS.length) return; await delay(CONNECTION_NOT_FOUND_RETRY_DELAYS_MS[attempt]); } } +function clearConfigFilter(filter: "dataId" | "group" | "appName") { + if (filter === "dataId") configDataId.value = ""; + else if (filter === "group") configGroup.value = ""; + else configAppName.value = ""; + void loadConfigsWithRetry(1); +} + function closePendingConfigMutationConfirmations() { pendingConfigSave.value = false; if (!deletingConfig.value) pendingDeleteConfig.value = null; @@ -1552,6 +1587,12 @@ async function loadServicesWithRetry(page = servicePageNo.value) { } } +function clearServiceFilter(filter: "name" | "group") { + if (filter === "name") serviceName.value = ""; + else serviceGroup.value = ""; + void loadServicesWithRetry(1); +} + async function selectService(service: NacosServiceInfo) { serviceMutationSequence += 1; instanceUpdateSequence += 1; @@ -2092,6 +2133,7 @@ watch( () => [props.connectionId, props.namespace] as const, async () => { closePendingConfigMutationConfirmations(); + configListRequestGuard.invalidate(); configDetailRequestGuard.invalidate(); configEditorSessionId += 1; latestConfigSaveRequestId += 1; @@ -2141,6 +2183,7 @@ onMounted(async () => { }); onBeforeUnmount(() => { + configListRequestGuard.invalidate(); configDetailRequestGuard.invalidate(); servicesRequestGuard.invalidate(); serviceDetailRequestGuard.invalidate(); @@ -2210,9 +2253,45 @@ onBeforeUnmount(() => {
- - - +
+ + +
+
+ + +
+
+ + +
+
+
+ + +