diff --git a/src/views/app/AppMarket.vue b/src/views/app/AppMarket.vue index eaecd41..4de2688 100644 --- a/src/views/app/AppMarket.vue +++ b/src/views/app/AppMarket.vue @@ -25,6 +25,11 @@ const isAdmin = computed(() => userStore.isAdmin) const market = ref([]) const loading = ref(false) +/** 应用详情抽屉:是否展开 */ +const detailVisible = ref(false) +/** 当前在抽屉中查看的应用 */ +const detailApp = ref(null) + /** 可管理公司列表(仅管理员) */ const manageableCompanies = ref([]) /** 权限范围:all=跨租户 / tenant=租户内 / company=指定公司 */ @@ -50,6 +55,10 @@ async function loadMarket(): Promise { try { const r = await appApi.market() market.value = r.list + // 抽屉打开时同步指向最新数据(loadMarket 会重建列表对象,旧引用会失效) + if (detailApp.value) { + detailApp.value = r.list.find((x) => x.AppUUID === detailApp.value!.AppUUID) || detailApp.value + } } catch { /* 拦截器已提示 */ } finally { loading.value = false } @@ -108,34 +117,20 @@ async function onConfirmInstall(): Promise { } } -/** 租户管理员:安装/停用企业功能。 - * 管理范围内已装(含非本公司)→ 打开管理弹窗(公司级开关);未装 → 打开安装弹窗 */ -async function toggleInstall(a: AppItem): Promise { - try { - if (hasManageableInstall(a)) { - await openManageDialog(a) - return - } - await openInstallDialog(a) - } catch { /* 拦截器已提示或取消 */ } -} - -// ==================== 管理弹窗(公司级安装/停用) ==================== -const manageDialogVisible = ref(false) -const manageDialogLoading = ref(false) +// ==================== 安装管理(公司级安装/停用,内联于应用详情抽屉) ==================== +const manageLoading = ref(false) const manageTargetApp = ref(null) /** 可管理公司列表(含各公司安装状态 Installed) */ const manageCompaniesList = ref([]) /** 当前勾选(已装)的公司 UUID 列表 */ const manageSelected = ref([]) -/** 打开管理弹窗:拉取该应用在各可管理公司的安装状态 */ -async function openManageDialog(a: AppItem): Promise { +/** 拉取该应用在各可管理公司的安装状态(抽屉内联「安装管理」) */ +async function LoadManageData(a: AppItem): Promise { manageTargetApp.value = a manageSelected.value = [] manageCompaniesList.value = [] - manageDialogVisible.value = true - manageDialogLoading.value = true + manageLoading.value = true try { const r = await appApi.manageCompanies(a.AppUUID) manageCompaniesList.value = r.Companies || [] @@ -144,7 +139,7 @@ async function openManageDialog(a: AppItem): Promise { .map((c) => c.CompanyUUID) manageScope.value = r.Scope || '' } catch { /* 拦截器已提示 */ } finally { - manageDialogLoading.value = false + manageLoading.value = false } } @@ -161,14 +156,15 @@ async function stopTenantInstall(): Promise { } catch { return } - manageDialogLoading.value = true + manageLoading.value = true try { await appApi.uninstall(a.AppUUID, [], true) // TenantOnly=仅停用全租户(公司级记录不动) ElMessage.success('已停用全租户安装') - manageDialogVisible.value = false await loadMarket() + // 抽屉内联管理:刷新公司级安装状态,保持勾选与「已装」标记一致 + if (detailVisible.value && detailApp.value) await LoadManageData(detailApp.value) } catch { /* 拦截器已提示 */ } finally { - manageDialogLoading.value = false + manageLoading.value = false } } @@ -188,15 +184,16 @@ async function saveCompanyManage(): Promise { ElMessage.info('公司安装状态未变化') return } - manageDialogLoading.value = true + manageLoading.value = true try { if (toInstall.length) await appApi.install(a.AppUUID, toInstall) if (toUninstall.length) await appApi.uninstall(a.AppUUID, toUninstall) ElMessage.success(`已更新 ${toInstall.length + toUninstall.length} 家公司的安装状态`) - manageDialogVisible.value = false await loadMarket() + // 抽屉内联管理:刷新公司级安装状态,保持勾选与「已装」标记一致 + if (detailVisible.value && detailApp.value) await LoadManageData(detailApp.value) } catch { /* 拦截器已提示 */ } finally { - manageDialogLoading.value = false + manageLoading.value = false } } @@ -276,14 +273,13 @@ function openConfig(a: AppItem): void { } // ==================== 应用详情抽屉(仿 VSCode 扩展详情:右侧展开) ==================== -const detailVisible = ref(false) -/** 当前在抽屉中查看的应用 */ -const detailApp = ref(null) -/** 点击卡片主体:右侧抽屉展示 icon / 名称 / 简介 / 安装管理 */ +/** 点击卡片主体:右侧抽屉展示 icon / 名称 / 简介 / 安装管理;管理员打开时预取安装管理数据 */ function openDetail(a: AppItem): void { detailApp.value = a detailVisible.value = true + // 管理员且已有安装 → 抽屉内直接内联「安装管理」,打开即预取公司级安装数据 + if (isAdmin.value && hasManageableInstall(a)) void LoadManageData(a) } /** 抽屉内「打开应用」:先收抽屉再跳转(页面被 tab 缓存,避免返回时抽屉仍开着) */ @@ -414,10 +410,9 @@ onMounted(loadMarket) @@ -435,10 +430,9 @@ onMounted(loadMarket)