${ssrInterpolate(g.product.remark || "—")}
import { defineComponent, ref, reactive, computed, useSSRContext } from 'vue'; import { ssrRenderAttrs, ssrRenderList, ssrRenderClass, ssrInterpolate, ssrIncludeBooleanAttr, ssrLooseContain, ssrLooseEqual, ssrRenderAttr } from 'vue/server-renderer'; import { u as useApi } from './useApi-B-E5eLsI.mjs'; import { u as useToast } from './useToast-CS21XT61.mjs'; import { _ as _export_sfc, b as useRouter } from './server.mjs'; import './useLoading-D4zrSa2m.mjs'; import '../nitro/nitro.mjs'; import 'node:http'; import 'node:https'; import 'node:events'; import 'node:buffer'; import 'node:fs'; import 'node:path'; import 'node:crypto'; import 'node:url'; import '../routes/renderer.mjs'; import 'vue-bundle-renderer/runtime'; import 'unhead/server'; import 'devalue'; import 'unhead/utils'; import 'pinia'; import 'perfect-debounce'; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "index", __ssrInlineRender: true, setup(__props) { useApi(); useToast(); useRouter(); const products = ref([]); const deployments = ref([]); const loading = ref(false); const assignTo = reactive({}); const byApp = computed(() => { const m = /* @__PURE__ */ new Map(); for (const d of deployments.value) { const k = d.app_name || ""; if (!m.has(k)) m.set(k, []); m.get(k).push(d); } return m; }); const productGroups = computed( () => products.value.map((p) => { const deps = byApp.value.get(p.name) || []; return { product: p, deployments: deps, okCount: deps.filter((d) => d.status !== "pending").length, pendingCount: deps.filter((d) => d.status === "pending").length }; }) ); const orphans = computed(() => { const known = new Set(products.value.map((p) => p.name)); return deployments.value.filter((d) => !d.app_name || !known.has(d.app_name)); }); const groups = computed(() => productGroups.value.length + (orphans.value.length ? 1 : 0)); function initial(name) { return (name || "?").charAt(0).toUpperCase(); } ref(null); const pEditing = ref(false); const pForm = reactive({ id: 0, name: "", image_name: "", remark: "", enabled: true }); return (_ctx, _push, _parent, _attrs) => { _push(`
一张卡片 = 一个 应用,卡片里是它在各区域的 部署 概况。 点卡片进入应用详情:编辑应用、部署新环境、升级服务、改各项配置。
${ssrInterpolate(g.product.remark || "—")}
未填所属应用名、或应用已被删除的历史部署。选一个应用把它归位,之后就能在该应用详情里管理。