@webx-ui/module-audit 0.4.7 → 0.5.1
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.
- package/dist/AuditHostsPage-YFRORYHZ.js +343 -0
- package/dist/AuditHostsPage-YFRORYHZ.js.map +1 -0
- package/dist/AuditIssuesPage-BjTPgAnD.js +693 -0
- package/dist/AuditIssuesPage-BjTPgAnD.js.map +1 -0
- package/dist/AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js +66 -0
- package/dist/AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js.map +1 -0
- package/dist/AuditOverviewPage-gVpdBOAY.js +432 -0
- package/dist/AuditOverviewPage-gVpdBOAY.js.map +1 -0
- package/dist/AuditPagesPage-DNgZo-K-.js +355 -0
- package/dist/AuditPagesPage-DNgZo-K-.js.map +1 -0
- package/dist/AuditRunsPage-BbWsuATw.js +375 -0
- package/dist/AuditRunsPage-BbWsuATw.js.map +1 -0
- package/dist/AuditSettingsPage-HwfdLU_s.js +88 -0
- package/dist/AuditSettingsPage-HwfdLU_s.js.map +1 -0
- package/dist/index-BFYHJYU_.js +1880 -0
- package/dist/index-BFYHJYU_.js.map +1 -0
- package/dist/index.d.ts +30 -6
- package/dist/index.js +17 -4126
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditIssuesPage-BjTPgAnD.js","sources":["../src/AuditFixDialog.vue","../src/AuditLinkGroups.vue","../src/AuditIssueList.vue","../src/AuditIssuesPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxButton, WxDialog, WxSkeleton, WxText, toast } from '@webx-ui/core'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditFixOffer, AuditIssue } from './types'\n\n/**\n * The fix button's dialog (§8, decision 4): the fixes that can close one finding, each with what\n * it would change — the records and fields with their counts, or a setting before and after —\n * and \"Apply\" under each. Nothing changes until it is pressed; the finding then waits for the\n * next run, which is the only thing that says it is gone.\n */\nconst props = defineProps<{ run: number; issue: AuditIssue }>()\nconst emit = defineEmits<{ fixed: [fix: string] }>()\nconst open = defineModel<boolean>('open', { default: false })\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\nconst router = useRouter()\n\nconst offers = ref<AuditFixOffer[] | null>(null)\nconst failure = ref<string | null>(null)\nconst applying = ref<string | null>(null)\n\nasync function load(): Promise<void> {\n offers.value = null\n failure.value = null\n\n try {\n offers.value = await api.fixes(props.run, props.issue.id)\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nasync function apply(offer: AuditFixOffer): Promise<void> {\n applying.value = offer.id\n\n try {\n await api.fix(props.run, props.issue.id, offer.id)\n toast.success(t('page.fix-applied'))\n emit('fixed', offer.id)\n open.value = false\n } catch (error) {\n toast.danger(message(error))\n } finally {\n applying.value = null\n }\n}\n\nfunction edit(url: string): void {\n open.value = false\n void router.push(url)\n}\n\n// Immediate: the list mounts the dialog already open, the first time a button is pressed.\nwatch(\n [open, () => props.issue.id],\n ([now]) => {\n if (now) void load()\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"t('page.fix-button')\" :width=\"640\">\n <div class=\"wx-audit-fix\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!offers\" :rows=\"3\" />\n <wx-text v-else-if=\"offers.length === 0\" size=\"sm\" tone=\"muted\">{{\n t('page.fix-none')\n }}</wx-text>\n\n <section v-for=\"offer in offers ?? []\" :key=\"offer.id\" class=\"wx-audit-fix__offer\">\n <wx-text weight=\"semibold\">{{ offer.title }}</wx-text>\n <wx-text v-if=\"offer.description\" size=\"sm\" tone=\"muted\">{{ offer.description }}</wx-text>\n\n <table class=\"wx-audit-fix__changes\">\n <thead>\n <tr>\n <th>{{ t('page.fix-changes') }}</th>\n <th>{{ t('page.fix-before') }}</th>\n <th>{{ t('page.fix-after') }}</th>\n <th />\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(change, index) in offer.changes\" :key=\"index\">\n <td>\n <div>{{ change.label }}</div>\n <div v-if=\"change.field\" class=\"wx-audit-fix__field\">{{ change.field }}</div>\n </td>\n <td class=\"wx-audit-fix__value\">\n {{ change.before ?? '' }}\n <span v-if=\"change.count\" class=\"wx-audit-fix__count\">× {{ change.count }}</span>\n </td>\n <td class=\"wx-audit-fix__value\">{{ change.after ?? '' }}</td>\n <td>\n <wx-button\n v-if=\"change.edit_url\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n :aria-label=\"t('page.open-editor')\"\n @click=\"edit(change.edit_url)\"\n />\n </td>\n </tr>\n </tbody>\n </table>\n\n <wx-text v-if=\"offer.note\" size=\"sm\" tone=\"muted\">{{ offer.note }}</wx-text>\n\n <div class=\"wx-audit-fix__actions\">\n <wx-button\n type=\"primary\"\n size=\"sm\"\n :loading=\"applying === offer.id\"\n :disabled=\"applying !== null\"\n @click=\"apply(offer)\"\n >{{ t('page.fix-apply') }}</wx-button\n >\n </div>\n </section>\n </div>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-audit-fix {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-fix__offer {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-fix__changes {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-fix__changes th {\n padding: var(--wx-space-4) var(--wx-space-8);\n color: var(--wx-text-muted);\n font-weight: var(--wx-font-weight-medium);\n text-align: start;\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-audit-fix__changes td {\n padding: var(--wx-space-6) var(--wx-space-8);\n vertical-align: top;\n border-bottom: 1px solid var(--wx-border-default);\n overflow-wrap: anywhere;\n}\n\n.wx-audit-fix__field,\n.wx-audit-fix__count {\n color: var(--wx-text-muted);\n}\n\n.wx-audit-fix__value {\n white-space: pre-line;\n}\n\n.wx-audit-fix__actions {\n display: flex;\n justify-content: flex-end;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useTranslate } from '@webx-ui/module-admin'\nimport { WxBadge, WxButton, WxIcon, WxText } from '@webx-ui/core'\nimport AuditAddress from './AuditAddress.vue'\nimport AuditLinkAttrs from './AuditLinkAttrs.vue'\nimport { differences } from './addresses'\nimport AuditStatus from './AuditStatus.vue'\nimport { useAuditMessages } from './i18n'\nimport type { AuditIssue } from './types'\n\n/**\n * The findings of a redirect check turned inside out: one card per link, the pages it is on\n * under it. A link in the footer or the menu is on every page and is fixed once, in one place —\n * by page, it would be the same row forty times.\n */\nconst props = defineProps<{ issues: AuditIssue[] }>()\n\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\n\ninterface LinkGroup {\n url: string\n location: string\n status: number | null\n pages: LinkPlace[]\n /** The pages write the link with different `rel` or `target`: each says its own. */\n mixed: boolean\n}\n\ninterface LinkPlace {\n page: string\n rel: string | null\n target: string | null\n}\n\n/** How many pages a card lists before «Show all». */\nconst FEW = 5\n\nconst open = ref(new Set<string>())\n\nconst groups = computed<LinkGroup[]>(() => {\n const found = new Map<string, LinkGroup>()\n\n for (const issue of props.issues) {\n for (const row of issue.details.table?.rows ?? []) {\n const url = String(row.url ?? '')\n const location = String(row.location ?? '')\n const key = `${url}\\n${location}`\n const group = found.get(key) ?? { url, location, status: null, pages: [], mixed: false }\n const place = { page: issue.url ?? '', rel: attr(row.rel), target: attr(row.target) }\n const first = group.pages[0]\n\n group.status ??= typeof row.status === 'number' ? row.status : null\n if (first && (first.rel !== place.rel || first.target !== place.target)) group.mixed = true\n if (place.page && !group.pages.some((one) => one.page === place.page)) group.pages.push(place)\n found.set(key, group)\n }\n }\n\n return [...found.values()].sort((a, b) => b.pages.length - a.pages.length)\n})\n\nfunction attr(value: unknown): string | null {\n return typeof value === 'string' && value !== '' ? value : null\n}\n\nfunction keyOf(group: LinkGroup): string {\n return `${group.url}\\n${group.location}`\n}\n\nfunction shown(group: LinkGroup): LinkPlace[] {\n return open.value.has(keyOf(group)) ? group.pages : group.pages.slice(0, FEW)\n}\n\n/* «Show all» turns into «Collapse», so a long card folds back where it is read. */\nfunction toggle(group: LinkGroup): void {\n const next = new Set(open.value)\n\n if (!next.delete(keyOf(group))) next.add(keyOf(group))\n open.value = next\n}\n</script>\n\n<template>\n <div class=\"wx-audit-links\">\n <div v-for=\"group in groups\" :key=\"keyOf(group)\" class=\"wx-audit-links__card\">\n <div class=\"wx-audit-links__head\">\n <audit-address :href=\"group.url\" type=\"muted\" class=\"wx-audit-links__from\" />\n <wx-icon\n name=\"arrow-right\"\n size=\"1em\"\n class=\"wx-audit-links__arrow\"\n :label=\"t('page.leads-to')\"\n />\n <audit-address :href=\"group.location\" strong class=\"wx-audit-links__to\" />\n <wx-badge\n v-for=\"change in differences(group.url, group.location)\"\n :key=\"change\"\n type=\"default\"\n size=\"sm\"\n >{{ t(`page.change-${change}`) }}</wx-badge\n >\n <audit-link-attrs\n v-if=\"!group.mixed && group.pages[0]\"\n :rel=\"group.pages[0].rel\"\n :target=\"group.pages[0].target\"\n class=\"wx-audit-links__fixed\"\n />\n <audit-status v-if=\"group.status !== null\" :code=\"group.status\" />\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-links__count\">{{\n t('page.link-pages', { count: group.pages.length })\n }}</wx-text>\n </div>\n\n <ul class=\"wx-audit-links__pages\">\n <li v-for=\"place in shown(group)\" :key=\"place.page\">\n <audit-address :href=\"place.page\" />\n <audit-link-attrs\n v-if=\"group.mixed\"\n :rel=\"place.rel\"\n :target=\"place.target\"\n class=\"wx-audit-links__fixed\"\n />\n </li>\n </ul>\n\n <wx-button\n v-if=\"group.pages.length > FEW\"\n size=\"sm\"\n variant=\"text\"\n class=\"wx-audit-links__more\"\n @click=\"toggle(group)\"\n >{{ open.has(keyOf(group)) ? t('page.link-collapse') : t('page.link-show-all') }}</wx-button\n >\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-links {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-links__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-links__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-links__from,\n.wx-audit-links__to {\n flex: 0 1 auto;\n}\n\n.wx-audit-links__arrow {\n flex-shrink: 0;\n color: var(--wx-text-muted);\n}\n\n.wx-audit-links__fixed {\n flex-shrink: 0;\n}\n\n.wx-audit-links__pages li {\n display: flex;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-links__count {\n flex-shrink: 0;\n margin-inline-start: auto;\n white-space: nowrap;\n}\n\n.wx-audit-links__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-links__more {\n margin: 0 var(--wx-space-12) var(--wx-space-8);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { toast, WxBadge, WxButton, WxSegmented, WxSkeleton, WxText, WxTooltip } from '@webx-ui/core'\nimport AuditAddress from './AuditAddress.vue'\nimport AuditDetails from './AuditDetails.vue'\nimport AuditFixDialog from './AuditFixDialog.vue'\nimport AuditHideDialog from './AuditHideDialog.vue'\nimport AuditLinkGroups from './AuditLinkGroups.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditIgnoreRule, AuditIssue, AuditIssueQuery } from './types'\n\n/**\n * The addresses of one check, under its row in the findings table: loaded when the row opens,\n * fifty at a time. A check that has fixes gets a button on each address; the dialog shows what\n * it would change before anything does. «Hide» asks for the reason; on the list of hidden ones\n * each says why, and «Show again» removes the rule.\n *\n * Each finding is a card: the address with its count, the table under it. A check of links that\n * redirect can also be read by link — every page loaded, one card per link with its pages.\n */\nconst props = defineProps<{\n run: number\n query: AuditIssueQuery\n fixable?: boolean\n /** The check's title, for the hiding dialog. */\n title?: string\n}>()\n\nconst emit = defineEmits<{ changed: [] }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\n// A boolean, not a computed: the permissions do not change while the screen is open.\nconst can = context.can('audit.manage')\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst issues = ref<AuditIssue[] | null>(null)\nconst more = ref(false)\nconst page = ref(1)\nconst failure = ref<string | null>(null)\nconst fixing = ref<AuditIssue | null>(null)\nconst dialog = ref(false)\nconst hiding = ref<AuditIssue | null>(null)\nconst hideDialog = ref(false)\n\ntype View = 'pages' | 'links'\n\nconst view = ref<View>('pages')\nconst everything = ref<AuditIssue[] | null>(null)\n\n/** Rows with where each address leads: the findings can be grouped by link. */\nconst byLink = computed(() =>\n (issues.value?.[0]?.details.table?.columns ?? []).some((column) => column.key === 'location'),\n)\n\nconst views = computed(() => [\n { value: 'pages', label: t('page.view-pages') },\n { value: 'links', label: t('page.view-links') },\n])\n\n/* By link needs every page of the check, not the fifty loaded: a link is counted on all of them. */\nasync function loadEverything(): Promise<void> {\n if (everything.value) return\n\n try {\n const all: AuditIssue[] = []\n let next = 1\n let last = 1\n\n do {\n const answer = await api.issues(props.run, { ...props.query, page: next, per_page: 200 })\n\n all.push(...answer.data)\n last = answer.last_page\n next++\n } while (next <= last)\n\n everything.value = all\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nfunction switchView(value: View): void {\n view.value = value\n if (value === 'links') loadEverything()\n}\n\nfunction hide(issue: AuditIssue): void {\n hiding.value = issue\n hideDialog.value = true\n}\n\n/* What the rule hid leaves this list at once; the table above counts again. */\nfunction hidden(rule: AuditIgnoreRule): void {\n if (issues.value && !rule.pattern) issues.value = []\n else if (issues.value && hiding.value)\n issues.value = issues.value.filter((one) => one.id !== hiding.value?.id)\n\n emit('changed')\n}\n\nasync function unhide(issue: AuditIssue): Promise<void> {\n if (!issue.ignore) return\n\n try {\n await api.unhide(issue.ignore.id)\n toast.success(t('page.unhidden'))\n emit('changed')\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nfunction why(issue: AuditIssue): string {\n const rule = issue.ignore\n\n if (!rule) return ''\n\n return rule.created_by\n ? t('page.hidden-by', { who: rule.created_by, reason: rule.reason })\n : t('page.hidden-reason', { reason: rule.reason })\n}\n\nfunction fix(issue: AuditIssue): void {\n fixing.value = issue\n dialog.value = true\n}\n\nfunction fixed(id: string): void {\n if (fixing.value) fixing.value.fixed_with = id\n}\n\nasync function load(next = 1): Promise<void> {\n try {\n const answer = await api.issues(props.run, { ...props.query, page: next, per_page: 50 })\n\n issues.value = next === 1 ? answer.data : [...(issues.value ?? []), ...answer.data]\n page.value = answer.current_page\n more.value = answer.current_page < answer.last_page\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nonMounted(() => load())\n</script>\n\n<template>\n <div class=\"wx-audit-issues\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!issues\" :rows=\"2\" />\n\n <template v-else>\n <wx-segmented\n v-if=\"byLink\"\n :model-value=\"view\"\n :options=\"views\"\n size=\"sm\"\n class=\"wx-audit-issues__view\"\n @update:model-value=\"switchView($event as View)\"\n />\n\n <template v-if=\"view === 'links'\">\n <audit-link-groups v-if=\"everything\" :issues=\"everything\" />\n <wx-skeleton v-else :rows=\"2\" />\n </template>\n\n <template v-else>\n <div v-for=\"issue in issues\" :key=\"issue.id\" class=\"wx-audit-issues__item\">\n <div class=\"wx-audit-issues__head\">\n <audit-address v-if=\"issue.url\" :href=\"issue.url\" strong class=\"wx-audit-issues__url\" />\n <wx-badge v-if=\"issue.state === 'new'\" type=\"primary\" size=\"sm\">{{\n t('page.state-new')\n }}</wx-badge>\n <wx-tooltip\n v-if=\"issue.details.count != null && issue.details.table\"\n :content=\"issue.details.summary ?? undefined\"\n :disabled=\"!issue.details.summary\"\n >\n <wx-badge round size=\"sm\" class=\"wx-audit-issues__count\">{{\n issue.details.count\n }}</wx-badge>\n </wx-tooltip>\n <wx-badge v-if=\"issue.fixed_with\" type=\"success\" size=\"sm\">{{\n t('page.fix-pressed')\n }}</wx-badge>\n <wx-button\n v-else-if=\"fixable && can && !issue.ignored\"\n size=\"sm\"\n variant=\"outline\"\n icon=\"check\"\n class=\"wx-audit-issues__fix\"\n @click=\"fix(issue)\"\n >{{ t('page.fix-button') }}</wx-button\n >\n <wx-button\n v-if=\"can && issue.ignored && issue.ignore\"\n size=\"sm\"\n variant=\"text\"\n icon=\"eye\"\n class=\"wx-audit-issues__end\"\n @click=\"unhide(issue)\"\n >{{ t('page.unhide') }}</wx-button\n >\n <wx-button\n v-else-if=\"can && !issue.ignored\"\n size=\"sm\"\n variant=\"text\"\n icon=\"eye-off\"\n :class=\"{ 'wx-audit-issues__end': !fixable || issue.fixed_with }\"\n @click=\"hide(issue)\"\n >{{ t('page.hide') }}</wx-button\n >\n </div>\n <div class=\"wx-audit-issues__body\">\n <wx-text v-if=\"issue.ignore\" size=\"sm\" tone=\"muted\">{{ why(issue) }}</wx-text>\n <audit-details\n :details=\"issue.details\"\n :counted=\"issue.details.count != null && !!issue.details.table\"\n />\n </div>\n </div>\n\n <wx-button v-if=\"more\" size=\"sm\" variant=\"text\" @click=\"load(page + 1)\">…</wx-button>\n </template>\n </template>\n\n <audit-fix-dialog\n v-if=\"fixing\"\n v-model:open=\"dialog\"\n :run=\"run\"\n :issue=\"fixing\"\n @fixed=\"fixed\"\n />\n\n <audit-hide-dialog\n v-if=\"hiding\"\n v-model:open=\"hideDialog\"\n :issue=\"hiding\"\n :title=\"props.title ?? hiding.check\"\n @hidden=\"hidden\"\n />\n </div>\n</template>\n\n<style scoped>\n.wx-audit-issues {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-issues__view {\n align-self: flex-start;\n}\n\n/* A card per finding: the page is the edge, its addresses are inside. */\n.wx-audit-issues__item {\n display: flex;\n flex-direction: column;\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-issues__head {\n display: flex;\n flex-wrap: nowrap;\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}\n\n.wx-audit-issues__body {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n padding: var(--wx-space-8) var(--wx-space-12);\n}\n\n.wx-audit-issues__body:empty {\n display: none;\n}\n\n.wx-audit-issues__fix,\n.wx-audit-issues__end {\n margin-inline-start: auto;\n}\n\n/* The address gives way to the badges and buttons beside it, one line at any width. */\n.wx-audit-issues__url {\n flex: 0 1 auto;\n}\n\n.wx-audit-issues__count {\n flex-shrink: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxPopover,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type SelectValue,\n type TableColumn,\n} from '@webx-ui/core'\nimport AuditIssueList from './AuditIssueList.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditCheckRow, AuditSeverity } from './types'\n\n/**\n * The findings of the last finished run (§8): one row per check, worst first; a row opens into\n * its addresses. «Hidden» in the state filter lists what the rules hide, each with its reason. The «?» beside a check says what was found, why it matters and how to fix it —\n * the three texts every check carries.\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 run = ref<number | null>(null)\nconst checks = ref<AuditCheckRow[] | null>(null)\nconst loading = ref(false)\nconst expanded = ref<(string | number)[]>([])\n\nconst severity = ref<AuditSeverity | null>(null)\nconst group = ref<string | null>(null)\ntype State = 'new' | 'persisting' | 'hidden'\n\nconst state = ref<State | null>(null)\n\nconst query = computed(() => ({ severity: severity.value, group: group.value, state: state.value }))\nconst filtersCount = computed(\n () => [severity.value, group.value, state.value].filter(Boolean).length,\n)\n\nconst types: Record<AuditSeverity, BadgeType> = {\n error: 'danger',\n warning: 'warning',\n notice: 'info',\n}\n\nconst columns = computed<TableColumn<AuditCheckRow>[]>(() => [\n { key: 'severity', label: t('page.severity'), width: 130 },\n { key: 'title', label: t('page.check') },\n { key: 'count', label: t('page.count'), width: 110, align: 'right' },\n])\n\nconst severityOptions = computed(() =>\n (['error', 'warning', 'notice'] as const).map((value) => ({\n value,\n label: t(`page.severity-${value}`),\n })),\n)\n\nconst groupOptions = computed(() =>\n [\n 'config',\n 'host',\n 'hosts',\n 'indexing',\n 'page',\n 'content',\n 'links',\n 'images',\n 'a11y',\n 'structure',\n ].map((value) => ({ value, label: t(`page.group-${value}`) })),\n)\n\nconst stateOptions = computed(() =>\n (['new', 'persisting', 'hidden'] as const).map((value) => ({\n value,\n label: t(`page.state-${value}`),\n })),\n)\n\n/* The selects hand back `string | number`; the filters only ever hold the values offered. */\nfunction pick<T extends string>(value: SelectValue | SelectValue[] | null | undefined): T | null {\n return typeof value === 'string' && value !== '' ? (value as T) : null\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n if (run.value === null) {\n run.value = (await api.latest()).done?.id ?? null\n }\n\n checks.value = run.value === null ? [] : await api.checks(run.value, query.value)\n expanded.value = []\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch(query, () => void load())\n\nonMounted(load)\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"issues\">\n <wx-table\n v-model:expanded=\"expanded\"\n :data=\"checks ?? []\"\n :columns=\"columns\"\n row-key=\"id\"\n expandable\n flush\n :loading=\"loading\"\n :filters-count=\"filtersCount\"\n :filters-label=\"panel('filters.title')\"\n :empty-text=\"run === null ? t('page.never') : t('page.empty')\"\n >\n <template #filters>\n <div class=\"wx-audit-findings__filters\">\n <wx-select\n :model-value=\"severity\"\n :options=\"severityOptions\"\n :placeholder=\"t('page.any-severity')\"\n clearable\n @update:model-value=\"severity = pick<AuditSeverity>($event)\"\n />\n <wx-select\n :model-value=\"group\"\n :options=\"groupOptions\"\n :placeholder=\"t('page.any-group')\"\n clearable\n @update:model-value=\"group = pick($event)\"\n />\n <wx-select\n :model-value=\"state\"\n :options=\"stateOptions\"\n :placeholder=\"t('page.any-state')\"\n clearable\n @update:model-value=\"state = pick<State>($event)\"\n />\n </div>\n </template>\n\n <template #cell-severity=\"{ row }\">\n <wx-badge :type=\"types[row.severity]\" dot>{{\n t(`page.severity-${row.severity}`)\n }}</wx-badge>\n </template>\n\n <template #cell-title=\"{ row }\">\n <span class=\"wx-audit-findings__title\">\n <wx-text size=\"sm\">{{ row.title }}</wx-text>\n <wx-badge v-if=\"row.new > 0\" type=\"primary\" size=\"sm\">{{ t('page.state-new') }}</wx-badge>\n <wx-popover :title=\"row.title\" width=\"360\">\n <template #trigger>\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"question\"\n :aria-label=\"t('page.explain')\"\n @click.stop\n />\n </template>\n <dl class=\"wx-audit-findings__texts\">\n <dt>{{ t('page.found') }}</dt>\n <dd>{{ row.found }}</dd>\n <dt>{{ t('page.why') }}</dt>\n <dd>{{ row.why }}</dd>\n <dt>{{ t('page.fix') }}</dt>\n <dd>{{ row.fix }}</dd>\n </dl>\n </wx-popover>\n </span>\n </template>\n\n <template #expanded=\"{ row }\">\n <audit-issue-list\n v-if=\"run !== null\"\n :run=\"run\"\n :query=\"{ ...query, check: row.id }\"\n :fixable=\"(row.fixes ?? []).length > 0\"\n :title=\"row.title\"\n @changed=\"load\"\n />\n </template>\n </wx-table>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-findings__filters {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-findings__title {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-findings__texts {\n display: grid;\n gap: var(--wx-space-4);\n margin: 0;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-findings__texts dt {\n color: var(--wx-text-muted);\n}\n\n.wx-audit-findings__texts dd {\n margin: 0 0 var(--wx-space-8);\n}\n</style>\n"],"names":["props","__props","emit","__emit","open","_useModel","api","createAuditApi","useAdmin","useAuditMessages","t","useTranslate","message","useErrorText","router","useRouter","offers","ref","failure","applying","load","error","apply","offer","toast","edit","url","watch","now","_createBlock","_unref","WxDialog","$event","_createElementVNode","_hoisted_1","WxText","WxSkeleton","_createElementBlock","_Fragment","_renderList","_createVNode","_createTextVNode","_toDisplayString","_hoisted_2","_openBlock","change","index","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","WxButton","_hoisted_7","FEW","groups","computed","found","issue","row","location","key","group","place","attr","first","one","a","b","value","keyOf","shown","toggle","next","AuditAddress","WxIcon","differences","WxBadge","AuditLinkAttrs","AuditStatus","context","can","issues","more","page","fixing","dialog","hiding","hideDialog","view","everything","byLink","column","views","loadEverything","all","last","answer","switchView","hide","hidden","rule","unhide","why","fix","fixed","id","onMounted","WxSegmented","_cache","AuditLinkGroups","WxTooltip","_normalizeClass","AuditDetails","AuditFixDialog","AuditHideDialog","panel","run","checks","loading","expanded","severity","state","query","filtersCount","types","columns","severityOptions","groupOptions","stateOptions","pick","AuditLayout","WxTable","WxSelect","_withCtx","WxPopover","AuditIssueList"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { defineComponent as g, computed as o, openBlock as m, createBlock as f, unref as w, withCtx as b, renderSlot as h } from "vue";
|
|
2
|
+
import { useRouter as _, useRoute as x } from "vue-router";
|
|
3
|
+
import { useAdmin as $, useTranslate as k, WxListScreen as y } from "@webx-ui/module-admin";
|
|
4
|
+
import { u as A } from "./index-BFYHJYU_.js";
|
|
5
|
+
const R = /* @__PURE__ */ g({
|
|
6
|
+
__name: "AuditLayout",
|
|
7
|
+
props: {
|
|
8
|
+
base: {},
|
|
9
|
+
current: {},
|
|
10
|
+
card: { type: Boolean, default: !0 },
|
|
11
|
+
actions: { default: () => [] }
|
|
12
|
+
},
|
|
13
|
+
setup(u) {
|
|
14
|
+
const e = u, r = $(), i = _(), l = x();
|
|
15
|
+
A();
|
|
16
|
+
const t = k("webx-audit"), c = o(
|
|
17
|
+
() => r.state.manifest?.modules.find((s) => s.id === "audit")?.title ?? t("module.title")
|
|
18
|
+
), p = o(() => [
|
|
19
|
+
{ value: "overview", label: t("page.overview") },
|
|
20
|
+
{ value: "issues", label: t("page.issues") },
|
|
21
|
+
{ value: "pages", label: t("page.pages") },
|
|
22
|
+
{ value: "hosts", label: t("page.hosts") },
|
|
23
|
+
{ value: "runs", label: t("page.runs") }
|
|
24
|
+
]), v = o(
|
|
25
|
+
() => e.current === "settings" ? e.actions : [
|
|
26
|
+
...e.actions,
|
|
27
|
+
{
|
|
28
|
+
key: "settings",
|
|
29
|
+
label: t("page.settings"),
|
|
30
|
+
icon: "settings",
|
|
31
|
+
run: () => {
|
|
32
|
+
i.push(`${e.base}/settings`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
), n = o({
|
|
37
|
+
/*
|
|
38
|
+
* The settings belong to no tab, but the tabs need a value of theirs — given one they do not
|
|
39
|
+
* have, they correct it to the first and lead away at once. So «Overview» stays lit, and the
|
|
40
|
+
* settings page has a «Back» of its own beside «Save».
|
|
41
|
+
*/
|
|
42
|
+
get: () => e.current === "settings" ? "overview" : e.current,
|
|
43
|
+
set: (s) => {
|
|
44
|
+
const a = s === "overview" ? e.base : `${e.base}/${String(s)}`;
|
|
45
|
+
a !== l.path && i.push(a);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return (s, a) => (m(), f(w(y), {
|
|
49
|
+
view: n.value,
|
|
50
|
+
"onUpdate:view": a[0] || (a[0] = (d) => n.value = d),
|
|
51
|
+
title: c.value,
|
|
52
|
+
views: p.value,
|
|
53
|
+
actions: v.value,
|
|
54
|
+
card: e.card
|
|
55
|
+
}, {
|
|
56
|
+
default: b(() => [
|
|
57
|
+
h(s.$slots, "default")
|
|
58
|
+
]),
|
|
59
|
+
_: 3
|
|
60
|
+
}, 8, ["view", "title", "views", "actions", "card"]));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
export {
|
|
64
|
+
R as _
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js","sources":["../src/AuditLayout.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useAdmin, useTranslate, WxListScreen, type ScreenAction } from '@webx-ui/module-admin'\nimport type { TabItem, TabValue } from '@webx-ui/core'\nimport { useAuditMessages } from './i18n'\n\n/**\n * The head of the section: its name, its views — the overview, the findings, the pages, the\n * hosts the site points at and the runs — and the way to the section's own settings.\n */\n/*\n * `card` has its default here and not as `?? true` below: Vue turns a Boolean prop nobody passed\n * into `false`, so the coalescing never fired and every table stood without its card.\n */\nconst props = withDefaults(\n defineProps<{\n base: string\n current: 'overview' | 'issues' | 'pages' | 'hosts' | 'runs' | 'settings'\n /** A card around the slot — the tables want one, the overview draws its own. */\n card?: boolean\n /** What the view itself offers in the head, before the way to the settings. */\n actions?: ScreenAction[]\n }>(),\n { card: true, actions: () => [] },\n)\n\ndefineSlots<{ default?: () => unknown }>()\n\nconst context = useAdmin()\nconst router = useRouter()\nconst route = useRoute()\n\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'audit')?.title ??\n t('module.title'),\n)\n\nconst views = computed<TabItem[]>(() => [\n { value: 'overview', label: t('page.overview') },\n { value: 'issues', label: t('page.issues') },\n { value: 'pages', label: t('page.pages') },\n { value: 'hosts', label: t('page.hosts') },\n { value: 'runs', label: t('page.runs') },\n])\n\n/* The settings are a view of their own, out of the tabs: opened now and then, not every day. */\nconst actions = computed<ScreenAction[]>(() =>\n props.current === 'settings'\n ? props.actions\n : [\n ...props.actions,\n {\n key: 'settings',\n label: t('page.settings'),\n icon: 'settings',\n run: () => void router.push(`${props.base}/settings`),\n },\n ],\n)\n\nconst where = computed<TabValue>({\n /*\n * The settings belong to no tab, but the tabs need a value of theirs — given one they do not\n * have, they correct it to the first and lead away at once. So «Overview» stays lit, and the\n * settings page has a «Back» of its own beside «Save».\n */\n get: () => (props.current === 'settings' ? 'overview' : props.current),\n set: (next) => {\n const path = next === 'overview' ? props.base : `${props.base}/${String(next)}`\n\n if (path !== route.path) void router.push(path)\n },\n})\n</script>\n\n<template>\n <wx-list-screen\n v-model:view=\"where\"\n :title=\"title\"\n :views=\"views\"\n :actions=\"actions\"\n :card=\"props.card\"\n >\n <slot />\n </wx-list-screen>\n</template>\n"],"names":["props","__props","context","useAdmin","router","useRouter","route","useRoute","useAuditMessages","useTranslate","title","computed","module","views","actions","where","next","path","_createBlock","_unref","WxListScreen","$event","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;;;AAeA,UAAMA,IAAQC,GAcRC,IAAUC,EAAA,GACVC,IAASC,EAAA,GACTC,IAAQC,EAAA;AAEd,IAAAC,EAAA;AAEA,UAAM,IAAIC,EAAa,YAAY,GAE7BC,IAAQC;AAAA,MACZ,MACET,EAAQ,MAAM,UAAU,QAAQ,KAAK,CAACU,MAAWA,EAAO,OAAO,OAAO,GAAG,SACzE,EAAE,cAAc;AAAA,IAAA,GAGdC,IAAQF,EAAoB,MAAM;AAAA,MACtC,EAAE,OAAO,YAAY,OAAO,EAAE,eAAe,EAAA;AAAA,MAC7C,EAAE,OAAO,UAAU,OAAO,EAAE,aAAa,EAAA;AAAA,MACzC,EAAE,OAAO,SAAS,OAAO,EAAE,YAAY,EAAA;AAAA,MACvC,EAAE,OAAO,SAAS,OAAO,EAAE,YAAY,EAAA;AAAA,MACvC,EAAE,OAAO,QAAQ,OAAO,EAAE,WAAW,EAAA;AAAA,IAAE,CACxC,GAGKG,IAAUH;AAAA,MAAyB,MACvCX,EAAM,YAAY,aACdA,EAAM,UACN;AAAA,QACE,GAAGA,EAAM;AAAA,QACT;AAAA,UACE,KAAK;AAAA,UACL,OAAO,EAAE,eAAe;AAAA,UACxB,MAAM;AAAA,UACN,KAAK,MAAA;AAAM,YAAKI,EAAO,KAAK,GAAGJ,EAAM,IAAI,WAAW;AAAA;AAAA,QAAA;AAAA,MACtD;AAAA,IACF,GAGAe,IAAQJ,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM/B,KAAK,MAAOX,EAAM,YAAY,aAAa,aAAaA,EAAM;AAAA,MAC9D,KAAK,CAACgB,MAAS;AACb,cAAMC,IAAOD,MAAS,aAAahB,EAAM,OAAO,GAAGA,EAAM,IAAI,IAAI,OAAOgB,CAAI,CAAC;AAE7E,QAAIC,MAASX,EAAM,QAAWF,EAAO,KAAKa,CAAI;AAAA,MAChD;AAAA,IAAA,CACD;2BAICC,EAQiBC,EAAAC,CAAA,GAAA;AAAA,MAPP,MAAML,EAAA;AAAA,8CAAAA,EAAK,QAAAM;AAAA,MAClB,OAAOX,EAAA;AAAA,MACP,OAAOG,EAAA;AAAA,MACP,SAASC,EAAA;AAAA,MACT,MAAMd,EAAM;AAAA,IAAA;iBAEb,MAAQ;AAAA,QAARsB,EAAQC,EAAA,QAAA,SAAA;AAAA,MAAA;;;;;"}
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import { defineComponent as X, ref as P, computed as k, onMounted as Y, onBeforeUnmount as Z, openBlock as s, createBlock as n, withCtx as t, createElementVNode as g, unref as e, createVNode as l, createElementBlock as _, Fragment as h, createCommentVNode as d, createTextVNode as i, toDisplayString as u, renderList as z } from "vue";
|
|
2
|
+
import { useAdmin as ee, useTranslate as ae, useErrorText as te, WxDate as se } from "@webx-ui/module-admin";
|
|
3
|
+
import { WxCard as y, WxSkeleton as le, WxAlert as D, WxText as c, WxButton as $, WxProgress as R, WxSegmented as ue, WxEmpty as j, WxStatistic as O, WxBadge as E, WxPopover as re, toast as S } from "@webx-ui/core";
|
|
4
|
+
import { _ as ie } from "./AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js";
|
|
5
|
+
import { c as ne, u as oe, _ as ce } from "./index-BFYHJYU_.js";
|
|
6
|
+
const de = { class: "wx-audit-overview" }, ve = { class: "wx-audit-overview__row" }, pe = { class: "wx-audit-overview__row" }, ge = { class: "wx-audit-overview__summary" }, _e = { class: "wx-audit-overview__health" }, me = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "wx-audit-overview__parts"
|
|
9
|
+
}, fe = { class: "wx-audit-overview__stats" }, we = { class: "wx-audit-overview__meta" }, he = { class: "wx-audit-overview__groups" }, ye = { class: "wx-audit-overview__badges" }, ke = { class: "wx-audit-overview__title" }, xe = { class: "wx-audit-overview__badges" }, be = {
|
|
10
|
+
key: 0,
|
|
11
|
+
class: "wx-audit-overview__missing"
|
|
12
|
+
}, ze = 2e3, We = /* @__PURE__ */ X({
|
|
13
|
+
__name: "AuditOverviewPage",
|
|
14
|
+
props: {
|
|
15
|
+
base: {}
|
|
16
|
+
},
|
|
17
|
+
setup(F) {
|
|
18
|
+
const G = F, A = ee(), T = ne(A);
|
|
19
|
+
oe();
|
|
20
|
+
const a = ae("webx-audit"), V = te(), m = P(null), W = P("quick"), B = P(!1);
|
|
21
|
+
let C;
|
|
22
|
+
const L = A.can("audit.run") || A.can("audit.manage"), v = k(() => m.value?.active ?? null), x = k(() => m.value?.done ?? null), p = k(() => x.value?.counts ?? null), I = k(() => [
|
|
23
|
+
{ value: "quick", label: a("page.scope-quick") },
|
|
24
|
+
{ value: "full", label: a("page.scope-full") }
|
|
25
|
+
]), N = [
|
|
26
|
+
{ key: "error", label: "page.errors", tone: "danger" },
|
|
27
|
+
{ key: "warning", label: "page.warnings", tone: "warning" },
|
|
28
|
+
{ key: "notice", label: "page.notices", tone: "info" }
|
|
29
|
+
], f = k(() => p.value?.health_parts ?? null), H = k(() => {
|
|
30
|
+
const o = p.value?.health ?? 0;
|
|
31
|
+
return o >= 90 ? "success" : o >= 60 ? "warning" : "danger";
|
|
32
|
+
}), J = [
|
|
33
|
+
"config",
|
|
34
|
+
"host",
|
|
35
|
+
"hosts",
|
|
36
|
+
"indexing",
|
|
37
|
+
"page",
|
|
38
|
+
"content",
|
|
39
|
+
"links",
|
|
40
|
+
"images",
|
|
41
|
+
"a11y",
|
|
42
|
+
"structure"
|
|
43
|
+
], M = k(
|
|
44
|
+
() => Object.entries(p.value?.groups ?? {}).map(([o, w]) => ({
|
|
45
|
+
id: o,
|
|
46
|
+
label: a(`page.group-${J.includes(o) ? o : "other"}`),
|
|
47
|
+
bySeverity: w
|
|
48
|
+
}))
|
|
49
|
+
);
|
|
50
|
+
function U(o) {
|
|
51
|
+
return o.status === "queued" ? a("page.status-queued") : o.progress.stage ? a(`page.stage-${o.progress.stage}`) : a("page.status-running");
|
|
52
|
+
}
|
|
53
|
+
async function q() {
|
|
54
|
+
try {
|
|
55
|
+
m.value = await T.latest();
|
|
56
|
+
} catch (o) {
|
|
57
|
+
S.danger(V(o));
|
|
58
|
+
}
|
|
59
|
+
clearTimeout(C), m.value?.active && (C = setTimeout(() => {
|
|
60
|
+
q();
|
|
61
|
+
}, ze));
|
|
62
|
+
}
|
|
63
|
+
async function K() {
|
|
64
|
+
B.value = !0;
|
|
65
|
+
try {
|
|
66
|
+
await T.start(W.value), S.success(a("page.started")), await q();
|
|
67
|
+
} catch (o) {
|
|
68
|
+
S.danger(V(o));
|
|
69
|
+
} finally {
|
|
70
|
+
B.value = !1;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function Q(o) {
|
|
74
|
+
try {
|
|
75
|
+
await T.cancel(o.id), await q();
|
|
76
|
+
} catch (w) {
|
|
77
|
+
S.danger(V(w));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return Y(q), Z(() => clearTimeout(C)), (o, w) => (s(), n(ie, {
|
|
81
|
+
base: G.base,
|
|
82
|
+
current: "overview",
|
|
83
|
+
card: !1
|
|
84
|
+
}, {
|
|
85
|
+
default: t(() => [
|
|
86
|
+
g("div", de, [
|
|
87
|
+
m.value ? (s(), _(h, { key: 1 }, [
|
|
88
|
+
m.value.queue.sync ? (s(), n(e(D), {
|
|
89
|
+
key: 0,
|
|
90
|
+
type: "warning",
|
|
91
|
+
description: e(a)("page.sync-queue")
|
|
92
|
+
}, null, 8, ["description"])) : d("", !0),
|
|
93
|
+
m.value.last && m.value.last.status === "failed" ? (s(), n(e(D), {
|
|
94
|
+
key: 1,
|
|
95
|
+
type: "danger",
|
|
96
|
+
description: e(a)("page.last-failed", { error: m.value.last.error ?? "" })
|
|
97
|
+
}, null, 8, ["description"])) : d("", !0),
|
|
98
|
+
v.value ? (s(), n(e(y), {
|
|
99
|
+
key: 2,
|
|
100
|
+
class: "wx-audit-overview__active"
|
|
101
|
+
}, {
|
|
102
|
+
default: t(() => [
|
|
103
|
+
g("div", ve, [
|
|
104
|
+
l(e(c), { weight: "semibold" }, {
|
|
105
|
+
default: t(() => [
|
|
106
|
+
i(u(U(v.value)), 1)
|
|
107
|
+
]),
|
|
108
|
+
_: 1
|
|
109
|
+
}),
|
|
110
|
+
l(e(c), {
|
|
111
|
+
size: "sm",
|
|
112
|
+
tone: "muted",
|
|
113
|
+
class: "wx-audit-overview__url"
|
|
114
|
+
}, {
|
|
115
|
+
default: t(() => [
|
|
116
|
+
i(u(v.value.base_url), 1)
|
|
117
|
+
]),
|
|
118
|
+
_: 1
|
|
119
|
+
}),
|
|
120
|
+
e(L) ? (s(), n(e($), {
|
|
121
|
+
key: 0,
|
|
122
|
+
size: "sm",
|
|
123
|
+
class: "wx-audit-overview__end",
|
|
124
|
+
onClick: w[0] || (w[0] = (r) => Q(v.value))
|
|
125
|
+
}, {
|
|
126
|
+
default: t(() => [
|
|
127
|
+
i(u(e(a)("page.cancel")), 1)
|
|
128
|
+
]),
|
|
129
|
+
_: 1
|
|
130
|
+
})) : d("", !0)
|
|
131
|
+
]),
|
|
132
|
+
l(e(R), {
|
|
133
|
+
indeterminate: "",
|
|
134
|
+
"aria-label": U(v.value)
|
|
135
|
+
}, null, 8, ["aria-label"]),
|
|
136
|
+
v.value.progress.resources ? (s(), n(e(c), {
|
|
137
|
+
key: 0,
|
|
138
|
+
size: "sm",
|
|
139
|
+
tone: "muted"
|
|
140
|
+
}, {
|
|
141
|
+
default: t(() => [
|
|
142
|
+
i(u(e(a)("page.resources-progress", {
|
|
143
|
+
checked: v.value.progress.resources.checked,
|
|
144
|
+
total: v.value.progress.resources.total
|
|
145
|
+
})), 1)
|
|
146
|
+
]),
|
|
147
|
+
_: 1
|
|
148
|
+
})) : v.value.progress.stage === "crawl" ? (s(), n(e(c), {
|
|
149
|
+
key: 1,
|
|
150
|
+
size: "sm",
|
|
151
|
+
tone: "muted"
|
|
152
|
+
}, {
|
|
153
|
+
default: t(() => [
|
|
154
|
+
i(u(e(a)("page.pages-progress", {
|
|
155
|
+
crawled: v.value.progress.pages.crawled,
|
|
156
|
+
limit: v.value.progress.pages.limit
|
|
157
|
+
})), 1)
|
|
158
|
+
]),
|
|
159
|
+
_: 1
|
|
160
|
+
})) : d("", !0)
|
|
161
|
+
]),
|
|
162
|
+
_: 1
|
|
163
|
+
})) : e(L) && !m.value.queue.sync ? (s(), n(e(y), { key: 3 }, {
|
|
164
|
+
default: t(() => [
|
|
165
|
+
g("div", pe, [
|
|
166
|
+
l(e(ue), {
|
|
167
|
+
modelValue: W.value,
|
|
168
|
+
"onUpdate:modelValue": w[1] || (w[1] = (r) => W.value = r),
|
|
169
|
+
options: I.value,
|
|
170
|
+
"aria-label": e(a)("page.scope")
|
|
171
|
+
}, null, 8, ["modelValue", "options", "aria-label"]),
|
|
172
|
+
l(e(c), {
|
|
173
|
+
size: "sm",
|
|
174
|
+
tone: "muted"
|
|
175
|
+
}, {
|
|
176
|
+
default: t(() => [
|
|
177
|
+
i(u(W.value === "full" ? e(a)("page.scope-full-help") : e(a)("page.scope-quick-help")), 1)
|
|
178
|
+
]),
|
|
179
|
+
_: 1
|
|
180
|
+
}),
|
|
181
|
+
l(e($), {
|
|
182
|
+
type: "primary",
|
|
183
|
+
icon: "refresh",
|
|
184
|
+
loading: B.value,
|
|
185
|
+
class: "wx-audit-overview__end",
|
|
186
|
+
onClick: K
|
|
187
|
+
}, {
|
|
188
|
+
default: t(() => [
|
|
189
|
+
i(u(e(a)("page.run")), 1)
|
|
190
|
+
]),
|
|
191
|
+
_: 1
|
|
192
|
+
}, 8, ["loading"])
|
|
193
|
+
])
|
|
194
|
+
]),
|
|
195
|
+
_: 1
|
|
196
|
+
})) : d("", !0),
|
|
197
|
+
!x.value && !v.value ? (s(), n(e(y), { key: 4 }, {
|
|
198
|
+
default: t(() => [
|
|
199
|
+
l(e(j), {
|
|
200
|
+
icon: "check-circle",
|
|
201
|
+
title: e(a)("page.never"),
|
|
202
|
+
description: e(a)("page.never-help")
|
|
203
|
+
}, null, 8, ["title", "description"])
|
|
204
|
+
]),
|
|
205
|
+
_: 1
|
|
206
|
+
})) : d("", !0),
|
|
207
|
+
x.value && p.value ? (s(), _(h, { key: 5 }, [
|
|
208
|
+
l(e(y), null, {
|
|
209
|
+
default: t(() => [
|
|
210
|
+
g("div", ge, [
|
|
211
|
+
g("div", _e, [
|
|
212
|
+
l(e(R), {
|
|
213
|
+
type: "circle",
|
|
214
|
+
value: p.value.health,
|
|
215
|
+
status: H.value,
|
|
216
|
+
"show-value": "",
|
|
217
|
+
formatter: (r) => `${r}%`,
|
|
218
|
+
"aria-label": e(a)("page.health")
|
|
219
|
+
}, null, 8, ["value", "status", "formatter", "aria-label"]),
|
|
220
|
+
f.value ? (s(), _("div", me, [
|
|
221
|
+
f.value.pages > 0 ? (s(), n(e(c), {
|
|
222
|
+
key: 0,
|
|
223
|
+
size: "sm"
|
|
224
|
+
}, {
|
|
225
|
+
default: t(() => [
|
|
226
|
+
i(u(e(a)("page.health-pages", { clean: f.value.clean, pages: f.value.pages })), 1)
|
|
227
|
+
]),
|
|
228
|
+
_: 1
|
|
229
|
+
})) : d("", !0),
|
|
230
|
+
f.value.site_errors > 0 ? (s(), n(e(c), {
|
|
231
|
+
key: 1,
|
|
232
|
+
size: "sm",
|
|
233
|
+
tone: "danger"
|
|
234
|
+
}, {
|
|
235
|
+
default: t(() => [
|
|
236
|
+
i(u(e(a)("page.health-site", { count: f.value.site_errors })), 1)
|
|
237
|
+
]),
|
|
238
|
+
_: 1
|
|
239
|
+
})) : d("", !0),
|
|
240
|
+
f.value.warnings > 0 ? (s(), n(e(c), {
|
|
241
|
+
key: 2,
|
|
242
|
+
size: "sm",
|
|
243
|
+
tone: "warning"
|
|
244
|
+
}, {
|
|
245
|
+
default: t(() => [
|
|
246
|
+
i(u(e(a)("page.health-warnings", { count: f.value.warnings })), 1)
|
|
247
|
+
]),
|
|
248
|
+
_: 1
|
|
249
|
+
})) : d("", !0),
|
|
250
|
+
l(e(c), {
|
|
251
|
+
size: "xs",
|
|
252
|
+
tone: "muted"
|
|
253
|
+
}, {
|
|
254
|
+
default: t(() => [
|
|
255
|
+
i(u(e(a)("page.health-help")), 1)
|
|
256
|
+
]),
|
|
257
|
+
_: 1
|
|
258
|
+
})
|
|
259
|
+
])) : d("", !0)
|
|
260
|
+
]),
|
|
261
|
+
g("div", fe, [
|
|
262
|
+
(s(), _(h, null, z(N, (r) => l(e(O), {
|
|
263
|
+
key: r.key,
|
|
264
|
+
title: e(a)(r.label),
|
|
265
|
+
value: p.value.severity[r.key] ?? 0,
|
|
266
|
+
tone: (p.value.severity[r.key] ?? 0) > 0 ? r.tone : "muted"
|
|
267
|
+
}, null, 8, ["title", "value", "tone"])), 64)),
|
|
268
|
+
l(e(O), {
|
|
269
|
+
title: e(a)("page.new"),
|
|
270
|
+
value: p.value.new
|
|
271
|
+
}, null, 8, ["title", "value"]),
|
|
272
|
+
l(e(O), {
|
|
273
|
+
title: e(a)("page.fixed"),
|
|
274
|
+
value: p.value.fixed,
|
|
275
|
+
tone: "success"
|
|
276
|
+
}, null, 8, ["title", "value"])
|
|
277
|
+
])
|
|
278
|
+
]),
|
|
279
|
+
g("div", we, [
|
|
280
|
+
l(e(c), {
|
|
281
|
+
size: "sm",
|
|
282
|
+
tone: "muted"
|
|
283
|
+
}, {
|
|
284
|
+
default: t(() => [
|
|
285
|
+
i(u(e(a)("page.last-run")) + " ", 1),
|
|
286
|
+
l(e(se), {
|
|
287
|
+
value: x.value.finished_at
|
|
288
|
+
}, null, 8, ["value"]),
|
|
289
|
+
i(" · " + u(e(a)(`page.scope-${x.value.scope}`)) + " · ", 1)
|
|
290
|
+
]),
|
|
291
|
+
_: 1
|
|
292
|
+
}),
|
|
293
|
+
l(e(c), {
|
|
294
|
+
size: "sm",
|
|
295
|
+
tone: "muted",
|
|
296
|
+
class: "wx-audit-overview__url"
|
|
297
|
+
}, {
|
|
298
|
+
default: t(() => [
|
|
299
|
+
i(u(x.value.base_url), 1)
|
|
300
|
+
]),
|
|
301
|
+
_: 1
|
|
302
|
+
})
|
|
303
|
+
])
|
|
304
|
+
]),
|
|
305
|
+
_: 1
|
|
306
|
+
}),
|
|
307
|
+
M.value.length ? (s(), n(e(y), {
|
|
308
|
+
key: 0,
|
|
309
|
+
title: e(a)("page.by-group")
|
|
310
|
+
}, {
|
|
311
|
+
default: t(() => [
|
|
312
|
+
g("ul", he, [
|
|
313
|
+
(s(!0), _(h, null, z(M.value, (r) => (s(), _("li", {
|
|
314
|
+
key: r.id
|
|
315
|
+
}, [
|
|
316
|
+
l(e(c), { size: "sm" }, {
|
|
317
|
+
default: t(() => [
|
|
318
|
+
i(u(r.label), 1)
|
|
319
|
+
]),
|
|
320
|
+
_: 2
|
|
321
|
+
}, 1024),
|
|
322
|
+
g("span", ye, [
|
|
323
|
+
(s(), _(h, null, z(N, (b) => (s(), _(h, {
|
|
324
|
+
key: b.key
|
|
325
|
+
}, [
|
|
326
|
+
(r.bySeverity[b.key] ?? 0) > 0 ? (s(), n(e(E), {
|
|
327
|
+
key: 0,
|
|
328
|
+
type: b.tone,
|
|
329
|
+
size: "sm"
|
|
330
|
+
}, {
|
|
331
|
+
default: t(() => [
|
|
332
|
+
i(u(e(a)(b.label)) + " · " + u(r.bySeverity[b.key]), 1)
|
|
333
|
+
]),
|
|
334
|
+
_: 2
|
|
335
|
+
}, 1032, ["type"])) : d("", !0)
|
|
336
|
+
], 64))), 64))
|
|
337
|
+
])
|
|
338
|
+
]))), 128))
|
|
339
|
+
])
|
|
340
|
+
]),
|
|
341
|
+
_: 1
|
|
342
|
+
}, 8, ["title"])) : (s(), n(e(y), { key: 1 }, {
|
|
343
|
+
default: t(() => [
|
|
344
|
+
l(e(j), {
|
|
345
|
+
icon: "check-circle",
|
|
346
|
+
title: e(a)("page.clean"),
|
|
347
|
+
size: "sm"
|
|
348
|
+
}, null, 8, ["title"])
|
|
349
|
+
]),
|
|
350
|
+
_: 1
|
|
351
|
+
})),
|
|
352
|
+
l(e(y), null, {
|
|
353
|
+
header: t(() => [
|
|
354
|
+
g("span", ke, [
|
|
355
|
+
i(u(e(a)("page.sources")) + " ", 1),
|
|
356
|
+
l(e(re), {
|
|
357
|
+
title: e(a)("page.sources"),
|
|
358
|
+
width: 360,
|
|
359
|
+
teleport: ""
|
|
360
|
+
}, {
|
|
361
|
+
trigger: t(() => [
|
|
362
|
+
l(e($), {
|
|
363
|
+
variant: "text",
|
|
364
|
+
size: "sm",
|
|
365
|
+
icon: "question",
|
|
366
|
+
"aria-label": e(a)("page.sources-help-label")
|
|
367
|
+
}, null, 8, ["aria-label"])
|
|
368
|
+
]),
|
|
369
|
+
default: t(() => [
|
|
370
|
+
l(e(c), { size: "sm" }, {
|
|
371
|
+
default: t(() => [
|
|
372
|
+
i(u(e(a)("page.sources-help")), 1)
|
|
373
|
+
]),
|
|
374
|
+
_: 1
|
|
375
|
+
})
|
|
376
|
+
]),
|
|
377
|
+
_: 1
|
|
378
|
+
}, 8, ["title"])
|
|
379
|
+
])
|
|
380
|
+
]),
|
|
381
|
+
default: t(() => [
|
|
382
|
+
g("div", xe, [
|
|
383
|
+
(s(!0), _(h, null, z(p.value.sources.searched, (r) => (s(), n(e(E), {
|
|
384
|
+
key: r,
|
|
385
|
+
type: "success"
|
|
386
|
+
}, {
|
|
387
|
+
default: t(() => [
|
|
388
|
+
i(u(r), 1)
|
|
389
|
+
]),
|
|
390
|
+
_: 2
|
|
391
|
+
}, 1024))), 128))
|
|
392
|
+
]),
|
|
393
|
+
p.value.sources.missing.length ? (s(), _("div", be, [
|
|
394
|
+
l(e(c), {
|
|
395
|
+
size: "sm",
|
|
396
|
+
tone: "warning"
|
|
397
|
+
}, {
|
|
398
|
+
default: t(() => [
|
|
399
|
+
i(u(e(a)("page.sources-missing")), 1)
|
|
400
|
+
]),
|
|
401
|
+
_: 1
|
|
402
|
+
}),
|
|
403
|
+
(s(!0), _(h, null, z(p.value.sources.missing, (r) => (s(), n(e(E), {
|
|
404
|
+
key: r,
|
|
405
|
+
type: "warning"
|
|
406
|
+
}, {
|
|
407
|
+
default: t(() => [
|
|
408
|
+
i(u(r), 1)
|
|
409
|
+
]),
|
|
410
|
+
_: 2
|
|
411
|
+
}, 1024))), 128))
|
|
412
|
+
])) : d("", !0)
|
|
413
|
+
]),
|
|
414
|
+
_: 1
|
|
415
|
+
})
|
|
416
|
+
], 64)) : d("", !0)
|
|
417
|
+
], 64)) : (s(), n(e(y), { key: 0 }, {
|
|
418
|
+
default: t(() => [
|
|
419
|
+
l(e(le), { rows: 4 })
|
|
420
|
+
]),
|
|
421
|
+
_: 1
|
|
422
|
+
}))
|
|
423
|
+
])
|
|
424
|
+
]),
|
|
425
|
+
_: 1
|
|
426
|
+
}, 8, ["base"]));
|
|
427
|
+
}
|
|
428
|
+
}), Be = /* @__PURE__ */ ce(We, [["__scopeId", "data-v-5c088ef8"]]);
|
|
429
|
+
export {
|
|
430
|
+
Be as default
|
|
431
|
+
};
|
|
432
|
+
//# sourceMappingURL=AuditOverviewPage-gVpdBOAY.js.map
|