@webx-ui/module-audit 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/dist/{AuditHostsPage-YFRORYHZ.js → AuditHostsPage-CSAlf3jK.js} +3 -3
  2. package/dist/{AuditHostsPage-YFRORYHZ.js.map → AuditHostsPage-CSAlf3jK.js.map} +1 -1
  3. package/dist/AuditIssuesPage-DtEJ9Sgq.js +718 -0
  4. package/dist/AuditIssuesPage-DtEJ9Sgq.js.map +1 -0
  5. package/dist/{AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js → AuditLayout.vue_vue_type_script_setup_true_lang-C39k6JNr.js} +2 -2
  6. package/dist/{AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js.map → AuditLayout.vue_vue_type_script_setup_true_lang-C39k6JNr.js.map} +1 -1
  7. package/dist/{AuditOverviewPage-gVpdBOAY.js → AuditOverviewPage-B5mexNDW.js} +3 -3
  8. package/dist/{AuditOverviewPage-gVpdBOAY.js.map → AuditOverviewPage-B5mexNDW.js.map} +1 -1
  9. package/dist/{AuditPagesPage-DNgZo-K-.js → AuditPagesPage-C1Akv4Ql.js} +3 -3
  10. package/dist/{AuditPagesPage-DNgZo-K-.js.map → AuditPagesPage-C1Akv4Ql.js.map} +1 -1
  11. package/dist/{AuditRunsPage-BbWsuATw.js → AuditRunsPage-SlBisvcG.js} +3 -3
  12. package/dist/{AuditRunsPage-BbWsuATw.js.map → AuditRunsPage-SlBisvcG.js.map} +1 -1
  13. package/dist/{AuditSettingsPage-HwfdLU_s.js → AuditSettingsPage-ADutjdIO.js} +3 -3
  14. package/dist/{AuditSettingsPage-HwfdLU_s.js.map → AuditSettingsPage-ADutjdIO.js.map} +1 -1
  15. package/dist/{index-BFYHJYU_.js → index-_DgRf2O6.js} +8 -8
  16. package/dist/{index-BFYHJYU_.js.map → index-_DgRf2O6.js.map} +1 -1
  17. package/dist/index.js +1 -1
  18. package/dist/style.css +1 -1
  19. package/package.json +4 -4
  20. package/dist/AuditIssuesPage-BjTPgAnD.js +0 -693
  21. package/dist/AuditIssuesPage-BjTPgAnD.js.map +0 -1
@@ -2,8 +2,8 @@ import { defineComponent as F, ref as v, onMounted as I, openBlock as l, createE
2
2
  import { useAdmin as L, useTranslate as H, useErrorText as M, WxDate as J } from "@webx-ui/module-admin";
3
3
  import { WxText as m, WxSkeleton as K, WxBadge as N, WxButton as O, WxTable as Q, WxSelect as X, toast as Y } from "@webx-ui/core";
4
4
  import { useRouter as Z } from "vue-router";
5
- import { c as j, u as R, A as E, a as U, b as ee, _ as q } from "./index-BFYHJYU_.js";
6
- import { _ as se } from "./AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js";
5
+ import { c as j, u as R, A as E, a as U, b as ee, _ as q } from "./index-_DgRf2O6.js";
6
+ import { _ as se } from "./AuditLayout.vue_vue_type_script_setup_true_lang-C39k6JNr.js";
7
7
  const ae = { class: "wx-audit-places" }, te = {
8
8
  key: 0,
9
9
  class: "wx-audit-places__group"
@@ -340,4 +340,4 @@ const ae = { class: "wx-audit-places" }, te = {
340
340
  export {
341
341
  ve as default
342
342
  };
343
- //# sourceMappingURL=AuditHostsPage-YFRORYHZ.js.map
343
+ //# sourceMappingURL=AuditHostsPage-CSAlf3jK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuditHostsPage-YFRORYHZ.js","sources":["../src/AuditHostPlaces.vue","../src/AuditHostsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxBadge, WxButton, WxSkeleton, WxText } from '@webx-ui/core'\nimport AuditAddress from './AuditAddress.vue'\nimport AuditLinkAttrs from './AuditLinkAttrs.vue'\nimport { createAuditApi } from './api'\nimport AuditStatus from './AuditStatus.vue'\nimport { useAuditMessages } from './i18n'\nimport type { AuditHostTarget, AuditHosts } from './types'\n\n/**\n * Where one host stands, under its row on «Outgoing»: the addresses on it the pages point at, each\n * a card with the pages under it — a font or a profile link sits in the layout and is on every\n * page, so by page it would be the same line forty times — and the fields of the database that\n * hold it, with «Open in the editor». A link's `target` and `rel` sit beside its address, or\n * beside each page when the pages write it differently. Fifty of each, broken links first; a card counts all its\n * pages and lists fifty.\n */\nconst props = defineProps<{ host: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\nconst router = useRouter()\n\nconst places = ref<AuditHosts | null>(null)\nconst failure = ref<string | null>(null)\n\n/** What the row's «Broken» counts: an error, or no answer at all (0). */\nconst broken = (status: number | null | undefined) =>\n status !== null && status !== undefined && (status >= 400 || status === 0)\n\n/** How many pages a card lists before «Show all». */\nconst FEW = 5\n\nconst open = ref(new Set<string>())\n\nfunction keyOf(target: AuditHostTarget): string {\n return `${target.kind} ${target.url}`\n}\n\nfunction shown(target: AuditHostTarget) {\n return open.value.has(keyOf(target)) ? target.places : target.places.slice(0, FEW)\n}\n\n/* «Show all» turns into «Collapse», so a long card folds back where it is read. */\nfunction toggle(target: AuditHostTarget): void {\n const next = new Set(open.value)\n\n if (!next.delete(keyOf(target))) next.add(keyOf(target))\n open.value = next\n}\n\nonMounted(async () => {\n try {\n places.value = await api.hosts({ host: props.host })\n } catch (error) {\n failure.value = message(error)\n }\n})\n</script>\n\n<template>\n <div class=\"wx-audit-places\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!places\" :rows=\"2\" />\n\n <template v-else>\n <section v-if=\"places.targets?.length\" class=\"wx-audit-places__group\">\n <wx-text size=\"sm\" weight=\"semibold\">{{ t('page.host-pages') }}</wx-text>\n\n <div v-for=\"target in places.targets\" :key=\"keyOf(target)\" class=\"wx-audit-places__card\">\n <div class=\"wx-audit-places__head\">\n <wx-badge type=\"default\" size=\"sm\" class=\"wx-audit-places__fixed\">{{\n target.kind\n }}</wx-badge>\n <audit-address :href=\"target.url\" strong />\n <audit-link-attrs\n v-if=\"target.kind === 'a' && !target.mixed\"\n :rel=\"target.rel\"\n :target=\"target.target\"\n class=\"wx-audit-places__fixed\"\n />\n <audit-status\n v-if=\"broken(target.status)\"\n :code=\"target.status\"\n class=\"wx-audit-places__fixed\"\n />\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-places__count\">{{\n t('page.link-pages', { count: target.pages })\n }}</wx-text>\n </div>\n\n <ul class=\"wx-audit-places__pages\">\n <li v-for=\"(place, index) in shown(target)\" :key=\"index\">\n <audit-address :href=\"place.page\" />\n <wx-text v-if=\"place.anchor\" size=\"sm\" tone=\"muted\" class=\"wx-audit-places__anchor\"\n >«{{ place.anchor }}»</wx-text\n >\n <!-- The pages differ in how they write the link: each says its own. -->\n <audit-link-attrs\n v-if=\"target.kind === 'a' && target.mixed\"\n :rel=\"place.rel\"\n :target=\"place.target\"\n class=\"wx-audit-places__fixed\"\n />\n </li>\n </ul>\n\n <wx-button\n v-if=\"target.places.length > FEW\"\n size=\"sm\"\n variant=\"text\"\n class=\"wx-audit-places__more\"\n @click=\"toggle(target)\"\n >{{\n open.has(keyOf(target)) ? t('page.link-collapse') : t('page.link-show-all')\n }}</wx-button\n >\n </div>\n </section>\n\n <section v-if=\"places.fields?.length\" class=\"wx-audit-places__group\">\n <wx-text size=\"sm\" weight=\"semibold\">{{ t('page.host-fields') }}</wx-text>\n\n <div class=\"wx-audit-places__card\">\n <div v-for=\"(field, index) in places.fields\" :key=\"index\" class=\"wx-audit-places__field\">\n <div class=\"wx-audit-places__record\">\n <wx-text size=\"sm\">{{ field.record_label }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\"\n >{{ field.source }} · {{ field.field\n }}{{ field.locale ? ` · ${field.locale}` : '' }}</wx-text\n >\n <wx-badge v-if=\"!field.published\" size=\"sm\">{{ t('page.unpublished') }}</wx-badge>\n </div>\n <audit-address :href=\"field.url\" />\n <wx-button\n v-if=\"field.edit_url\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n class=\"wx-audit-places__fixed\"\n @click=\"router.push(field.edit_url)\"\n >{{ t('page.open-editor') }}</wx-button\n >\n </div>\n </div>\n </section>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-places {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-places__group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-places__card {\n min-width: 0;\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-md);\n background: var(--wx-bg-surface);\n overflow: hidden;\n}\n\n.wx-audit-places__head {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n padding: var(--wx-space-8) var(--wx-space-12);\n border-bottom: 1px solid var(--wx-border-muted);\n background: var(--wx-bg-subtle);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-places__fixed {\n flex-shrink: 0;\n}\n\n.wx-audit-places__count {\n flex-shrink: 0;\n margin-inline-start: auto;\n white-space: nowrap;\n}\n\n.wx-audit-places__pages {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n margin: 0;\n padding: var(--wx-space-8) var(--wx-space-12);\n list-style: none;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-places__pages li {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-places__anchor {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-audit-places__more {\n margin: 0 var(--wx-space-12) var(--wx-space-8);\n}\n\n/* One grid for every field: the record, where its address is, the editor. */\n.wx-audit-places__field {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 3fr) auto;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n padding: var(--wx-space-6) var(--wx-space-12);\n border-bottom: 1px solid var(--wx-border-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-places__field:last-child {\n border-bottom: 0;\n}\n\n.wx-audit-places__record {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-8);\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type RowKey,\n type SelectValue,\n type TableColumn,\n} from '@webx-ui/core'\nimport AuditHostPlaces from './AuditHostPlaces.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditHostClass, AuditHostRow, AuditHosts } from './types'\n\n/**\n * «Outgoing» (§8): every host the site points at — in the pages of the last full run and in the\n * fields of the database — by class, development stands on top and in red. A row opens into\n * where the host stands: the pages with their anchors, the records with the field and the way to\n * the editor.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst answer = ref<AuditHosts | null>(null)\nconst loading = ref(false)\nconst search = ref('')\nconst hostClass = ref<AuditHostClass | null>(null)\nconst expanded = ref<RowKey[]>([])\n\nconst classes: Record<AuditHostClass, BadgeType> = {\n dev: 'danger',\n own_mirror: 'warning',\n external: 'info',\n own: 'success',\n}\n\nconst columns = computed<TableColumn<AuditHostRow>[]>(() => [\n { key: 'host', label: t('page.host'), minWidth: 220 },\n { key: 'links', label: t('page.links'), width: 90, align: 'right' },\n { key: 'pages', label: t('page.pages'), width: 90, align: 'right', hideBelow: 560 },\n { key: 'broken', label: t('page.broken'), width: 100, align: 'right', hideBelow: 640 },\n { key: 'fields', label: t('page.fields'), width: 120, align: 'right' },\n { key: 'first_seen', label: t('page.first-seen'), minWidth: 140, hideBelow: 760 },\n])\n\nconst classOptions = computed(() =>\n (Object.keys(classes) as AuditHostClass[]).map((value) => ({\n value,\n label: `${t(`page.host-${value}`)}${answer.value?.classes[value] ? ` · ${answer.value.classes[value]}` : ''}`,\n })),\n)\n\nfunction pick(value: SelectValue | SelectValue[] | null | undefined): AuditHostClass | null {\n return typeof value === 'string' && value in classes ? (value as AuditHostClass) : null\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n answer.value = await api.hosts({ class: hostClass.value, search: search.value })\n expanded.value = []\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch([hostClass, search], () => void load())\n\nonMounted(load)\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"hosts\">\n <wx-table\n v-model:expanded=\"expanded\"\n v-model:search=\"search\"\n :data=\"answer?.hosts ?? []\"\n :columns=\"columns\"\n row-key=\"host\"\n expandable\n flush\n searchable\n :search-placeholder=\"t('page.search-host')\"\n :loading=\"loading\"\n :filters-count=\"hostClass ? 1 : 0\"\n :filters-label=\"panel('filters.title')\"\n :row-class=\"(row: AuditHostRow) => (row.class === 'dev' ? 'is-stand' : undefined)\"\n :empty-text=\"t('page.hosts-empty')\"\n >\n <template #filters>\n <wx-select\n :model-value=\"hostClass\"\n :options=\"classOptions\"\n :placeholder=\"t('page.any-class')\"\n clearable\n @update:model-value=\"hostClass = pick($event)\"\n />\n </template>\n\n <template #cell-host=\"{ row }\">\n <span class=\"wx-audit-hosts__host\">\n <wx-badge :type=\"classes[row.class]\" size=\"sm\">{{\n t(`page.host-${row.class}`)\n }}</wx-badge>\n <wx-text size=\"sm\" :tone=\"row.class === 'dev' ? 'danger' : undefined\" weight=\"medium\">{{\n row.host\n }}</wx-text>\n </span>\n </template>\n <template #cell-broken=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.broken ? 'danger' : 'muted'\">{{ row.broken }}</wx-text>\n </template>\n <template #cell-fields=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.fields && row.class === 'dev' ? 'danger' : undefined\">{{\n row.fields\n }}</wx-text>\n </template>\n <template #cell-first_seen=\"{ row }\">\n <wx-date v-if=\"row.first_seen\" :value=\"row.first_seen\" />\n </template>\n\n <template #expanded=\"{ row }\">\n <audit-host-places :host=\"row.host\" />\n </template>\n </wx-table>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-hosts__host {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* A stand is the one class that is always a mistake: a red edge, like an error in a list. */\n:deep(.is-stand > td:first-child) {\n box-shadow: inset 3px 0 0 var(--wx-color-danger);\n}\n</style>\n"],"names":["FEW","props","__props","api","createAuditApi","useAdmin","useAuditMessages","t","useTranslate","message","useErrorText","router","useRouter","places","ref","failure","broken","status","open","keyOf","target","shown","toggle","next","onMounted","error","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_unref","WxText","_Fragment","_hoisted_2","_createVNode","_renderList","_createElementVNode","_hoisted_3","WxBadge","_createTextVNode","_toDisplayString","AuditAddress","AuditLinkAttrs","AuditStatus","_hoisted_4","place","index","WxButton","$event","_hoisted_5","_hoisted_6","field","_hoisted_7","WxSkeleton","panel","answer","loading","search","hostClass","expanded","classes","columns","computed","classOptions","value","pick","load","toast","watch","AuditLayout","WxTable","row","WxSelect","_cache","_withCtx","WxDate","AuditHostPlaces"],"mappings":"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"}
1
+ {"version":3,"file":"AuditHostsPage-CSAlf3jK.js","sources":["../src/AuditHostPlaces.vue","../src/AuditHostsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxBadge, WxButton, WxSkeleton, WxText } from '@webx-ui/core'\nimport AuditAddress from './AuditAddress.vue'\nimport AuditLinkAttrs from './AuditLinkAttrs.vue'\nimport { createAuditApi } from './api'\nimport AuditStatus from './AuditStatus.vue'\nimport { useAuditMessages } from './i18n'\nimport type { AuditHostTarget, AuditHosts } from './types'\n\n/**\n * Where one host stands, under its row on «Outgoing»: the addresses on it the pages point at, each\n * a card with the pages under it — a font or a profile link sits in the layout and is on every\n * page, so by page it would be the same line forty times — and the fields of the database that\n * hold it, with «Open in the editor». A link's `target` and `rel` sit beside its address, or\n * beside each page when the pages write it differently. Fifty of each, broken links first; a card counts all its\n * pages and lists fifty.\n */\nconst props = defineProps<{ host: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\nconst router = useRouter()\n\nconst places = ref<AuditHosts | null>(null)\nconst failure = ref<string | null>(null)\n\n/** What the row's «Broken» counts: an error, or no answer at all (0). */\nconst broken = (status: number | null | undefined) =>\n status !== null && status !== undefined && (status >= 400 || status === 0)\n\n/** How many pages a card lists before «Show all». */\nconst FEW = 5\n\nconst open = ref(new Set<string>())\n\nfunction keyOf(target: AuditHostTarget): string {\n return `${target.kind} ${target.url}`\n}\n\nfunction shown(target: AuditHostTarget) {\n return open.value.has(keyOf(target)) ? target.places : target.places.slice(0, FEW)\n}\n\n/* «Show all» turns into «Collapse», so a long card folds back where it is read. */\nfunction toggle(target: AuditHostTarget): void {\n const next = new Set(open.value)\n\n if (!next.delete(keyOf(target))) next.add(keyOf(target))\n open.value = next\n}\n\nonMounted(async () => {\n try {\n places.value = await api.hosts({ host: props.host })\n } catch (error) {\n failure.value = message(error)\n }\n})\n</script>\n\n<template>\n <div class=\"wx-audit-places\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!places\" :rows=\"2\" />\n\n <template v-else>\n <section v-if=\"places.targets?.length\" class=\"wx-audit-places__group\">\n <wx-text size=\"sm\" weight=\"semibold\">{{ t('page.host-pages') }}</wx-text>\n\n <div v-for=\"target in places.targets\" :key=\"keyOf(target)\" class=\"wx-audit-places__card\">\n <div class=\"wx-audit-places__head\">\n <wx-badge type=\"default\" size=\"sm\" class=\"wx-audit-places__fixed\">{{\n target.kind\n }}</wx-badge>\n <audit-address :href=\"target.url\" strong />\n <audit-link-attrs\n v-if=\"target.kind === 'a' && !target.mixed\"\n :rel=\"target.rel\"\n :target=\"target.target\"\n class=\"wx-audit-places__fixed\"\n />\n <audit-status\n v-if=\"broken(target.status)\"\n :code=\"target.status\"\n class=\"wx-audit-places__fixed\"\n />\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-places__count\">{{\n t('page.link-pages', { count: target.pages })\n }}</wx-text>\n </div>\n\n <ul class=\"wx-audit-places__pages\">\n <li v-for=\"(place, index) in shown(target)\" :key=\"index\">\n <audit-address :href=\"place.page\" />\n <wx-text v-if=\"place.anchor\" size=\"sm\" tone=\"muted\" class=\"wx-audit-places__anchor\"\n >«{{ place.anchor }}»</wx-text\n >\n <!-- The pages differ in how they write the link: each says its own. -->\n <audit-link-attrs\n v-if=\"target.kind === 'a' && target.mixed\"\n :rel=\"place.rel\"\n :target=\"place.target\"\n class=\"wx-audit-places__fixed\"\n />\n </li>\n </ul>\n\n <wx-button\n v-if=\"target.places.length > FEW\"\n size=\"sm\"\n variant=\"text\"\n class=\"wx-audit-places__more\"\n @click=\"toggle(target)\"\n >{{\n open.has(keyOf(target)) ? t('page.link-collapse') : t('page.link-show-all')\n }}</wx-button\n >\n </div>\n </section>\n\n <section v-if=\"places.fields?.length\" class=\"wx-audit-places__group\">\n <wx-text size=\"sm\" weight=\"semibold\">{{ t('page.host-fields') }}</wx-text>\n\n <div class=\"wx-audit-places__card\">\n <div v-for=\"(field, index) in places.fields\" :key=\"index\" class=\"wx-audit-places__field\">\n <div class=\"wx-audit-places__record\">\n <wx-text size=\"sm\">{{ field.record_label }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\"\n >{{ field.source }} · {{ field.field\n }}{{ field.locale ? ` · ${field.locale}` : '' }}</wx-text\n >\n <wx-badge v-if=\"!field.published\" size=\"sm\">{{ t('page.unpublished') }}</wx-badge>\n </div>\n <audit-address :href=\"field.url\" />\n <wx-button\n v-if=\"field.edit_url\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n class=\"wx-audit-places__fixed\"\n @click=\"router.push(field.edit_url)\"\n >{{ t('page.open-editor') }}</wx-button\n >\n </div>\n </div>\n </section>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-places {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-places__group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-places__card {\n min-width: 0;\n border: 1px solid var(--wx-border-default);\n border-radius: var(--wx-radius-md);\n background: var(--wx-bg-surface);\n overflow: hidden;\n}\n\n.wx-audit-places__head {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n padding: var(--wx-space-8) var(--wx-space-12);\n border-bottom: 1px solid var(--wx-border-muted);\n background: var(--wx-bg-subtle);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-places__fixed {\n flex-shrink: 0;\n}\n\n.wx-audit-places__count {\n flex-shrink: 0;\n margin-inline-start: auto;\n white-space: nowrap;\n}\n\n.wx-audit-places__pages {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n margin: 0;\n padding: var(--wx-space-8) var(--wx-space-12);\n list-style: none;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-places__pages li {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-places__anchor {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-audit-places__more {\n margin: 0 var(--wx-space-12) var(--wx-space-8);\n}\n\n/* One grid for every field: the record, where its address is, the editor. */\n.wx-audit-places__field {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 3fr) auto;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n padding: var(--wx-space-6) var(--wx-space-12);\n border-bottom: 1px solid var(--wx-border-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-places__field:last-child {\n border-bottom: 0;\n}\n\n.wx-audit-places__record {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-8);\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type RowKey,\n type SelectValue,\n type TableColumn,\n} from '@webx-ui/core'\nimport AuditHostPlaces from './AuditHostPlaces.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditHostClass, AuditHostRow, AuditHosts } from './types'\n\n/**\n * «Outgoing» (§8): every host the site points at — in the pages of the last full run and in the\n * fields of the database — by class, development stands on top and in red. A row opens into\n * where the host stands: the pages with their anchors, the records with the field and the way to\n * the editor.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst answer = ref<AuditHosts | null>(null)\nconst loading = ref(false)\nconst search = ref('')\nconst hostClass = ref<AuditHostClass | null>(null)\nconst expanded = ref<RowKey[]>([])\n\nconst classes: Record<AuditHostClass, BadgeType> = {\n dev: 'danger',\n own_mirror: 'warning',\n external: 'info',\n own: 'success',\n}\n\nconst columns = computed<TableColumn<AuditHostRow>[]>(() => [\n { key: 'host', label: t('page.host'), minWidth: 220 },\n { key: 'links', label: t('page.links'), width: 90, align: 'right' },\n { key: 'pages', label: t('page.pages'), width: 90, align: 'right', hideBelow: 560 },\n { key: 'broken', label: t('page.broken'), width: 100, align: 'right', hideBelow: 640 },\n { key: 'fields', label: t('page.fields'), width: 120, align: 'right' },\n { key: 'first_seen', label: t('page.first-seen'), minWidth: 140, hideBelow: 760 },\n])\n\nconst classOptions = computed(() =>\n (Object.keys(classes) as AuditHostClass[]).map((value) => ({\n value,\n label: `${t(`page.host-${value}`)}${answer.value?.classes[value] ? ` · ${answer.value.classes[value]}` : ''}`,\n })),\n)\n\nfunction pick(value: SelectValue | SelectValue[] | null | undefined): AuditHostClass | null {\n return typeof value === 'string' && value in classes ? (value as AuditHostClass) : null\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n answer.value = await api.hosts({ class: hostClass.value, search: search.value })\n expanded.value = []\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch([hostClass, search], () => void load())\n\nonMounted(load)\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"hosts\">\n <wx-table\n v-model:expanded=\"expanded\"\n v-model:search=\"search\"\n :data=\"answer?.hosts ?? []\"\n :columns=\"columns\"\n row-key=\"host\"\n expandable\n flush\n searchable\n :search-placeholder=\"t('page.search-host')\"\n :loading=\"loading\"\n :filters-count=\"hostClass ? 1 : 0\"\n :filters-label=\"panel('filters.title')\"\n :row-class=\"(row: AuditHostRow) => (row.class === 'dev' ? 'is-stand' : undefined)\"\n :empty-text=\"t('page.hosts-empty')\"\n >\n <template #filters>\n <wx-select\n :model-value=\"hostClass\"\n :options=\"classOptions\"\n :placeholder=\"t('page.any-class')\"\n clearable\n @update:model-value=\"hostClass = pick($event)\"\n />\n </template>\n\n <template #cell-host=\"{ row }\">\n <span class=\"wx-audit-hosts__host\">\n <wx-badge :type=\"classes[row.class]\" size=\"sm\">{{\n t(`page.host-${row.class}`)\n }}</wx-badge>\n <wx-text size=\"sm\" :tone=\"row.class === 'dev' ? 'danger' : undefined\" weight=\"medium\">{{\n row.host\n }}</wx-text>\n </span>\n </template>\n <template #cell-broken=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.broken ? 'danger' : 'muted'\">{{ row.broken }}</wx-text>\n </template>\n <template #cell-fields=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.fields && row.class === 'dev' ? 'danger' : undefined\">{{\n row.fields\n }}</wx-text>\n </template>\n <template #cell-first_seen=\"{ row }\">\n <wx-date v-if=\"row.first_seen\" :value=\"row.first_seen\" />\n </template>\n\n <template #expanded=\"{ row }\">\n <audit-host-places :host=\"row.host\" />\n </template>\n </wx-table>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-hosts__host {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* A stand is the one class that is always a mistake: a red edge, like an error in a list. */\n:deep(.is-stand > td:first-child) {\n box-shadow: inset 3px 0 0 var(--wx-color-danger);\n}\n</style>\n"],"names":["FEW","props","__props","api","createAuditApi","useAdmin","useAuditMessages","t","useTranslate","message","useErrorText","router","useRouter","places","ref","failure","broken","status","open","keyOf","target","shown","toggle","next","onMounted","error","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_unref","WxText","_Fragment","_hoisted_2","_createVNode","_renderList","_createElementVNode","_hoisted_3","WxBadge","_createTextVNode","_toDisplayString","AuditAddress","AuditLinkAttrs","AuditStatus","_hoisted_4","place","index","WxButton","$event","_hoisted_5","_hoisted_6","field","_hoisted_7","WxSkeleton","panel","answer","loading","search","hostClass","expanded","classes","columns","computed","classOptions","value","pick","load","toast","watch","AuditLayout","WxTable","row","WxSelect","_cache","_withCtx","WxDate","AuditHostPlaces"],"mappings":"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"}