@webx-ui/module-audit 0.5.1 → 0.5.3
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 → AuditHostsPage-DZ1vYvZR.js} +3 -3
- package/dist/{AuditHostsPage-YFRORYHZ.js.map → AuditHostsPage-DZ1vYvZR.js.map} +1 -1
- package/dist/AuditIssuesPage-CdWydT5i.js +718 -0
- package/dist/AuditIssuesPage-CdWydT5i.js.map +1 -0
- package/dist/{AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js → AuditLayout.vue_vue_type_script_setup_true_lang-BIj7GvJb.js} +2 -2
- package/dist/{AuditLayout.vue_vue_type_script_setup_true_lang-C8H5jlTe.js.map → AuditLayout.vue_vue_type_script_setup_true_lang-BIj7GvJb.js.map} +1 -1
- package/dist/{AuditOverviewPage-gVpdBOAY.js → AuditOverviewPage-BqTU-JnS.js} +3 -3
- package/dist/{AuditOverviewPage-gVpdBOAY.js.map → AuditOverviewPage-BqTU-JnS.js.map} +1 -1
- package/dist/{AuditPagesPage-DNgZo-K-.js → AuditPagesPage-CsizUOgz.js} +3 -3
- package/dist/{AuditPagesPage-DNgZo-K-.js.map → AuditPagesPage-CsizUOgz.js.map} +1 -1
- package/dist/{AuditRunsPage-BbWsuATw.js → AuditRunsPage-D9hzlpID.js} +3 -3
- package/dist/{AuditRunsPage-BbWsuATw.js.map → AuditRunsPage-D9hzlpID.js.map} +1 -1
- package/dist/{AuditSettingsPage-HwfdLU_s.js → AuditSettingsPage-R9qoNgbJ.js} +3 -3
- package/dist/{AuditSettingsPage-HwfdLU_s.js.map → AuditSettingsPage-R9qoNgbJ.js.map} +1 -1
- package/dist/{index-BFYHJYU_.js → index-BxS_t2W2.js} +435 -419
- package/dist/index-BxS_t2W2.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +4 -4
- package/dist/AuditIssuesPage-BjTPgAnD.js +0 -693
- package/dist/AuditIssuesPage-BjTPgAnD.js.map +0 -1
- package/dist/index-BFYHJYU_.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditIssuesPage-CdWydT5i.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 WxDescriptions,\n WxDescriptionsItem,\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 <wx-descriptions :columns=\"1\" layout=\"vertical\" size=\"sm\">\n <wx-descriptions-item :label=\"t('page.found')\">{{ row.found }}</wx-descriptions-item>\n <wx-descriptions-item :label=\"t('page.why')\">{{ row.why }}</wx-descriptions-item>\n <wx-descriptions-item :label=\"t('page.fix')\">{{ row.fix }}</wx-descriptions-item>\n </wx-descriptions>\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</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","WxDescriptions","WxDescriptionsItem","AuditIssueList"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
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
2
|
import { useRouter as _, useRoute as x } from "vue-router";
|
|
3
3
|
import { useAdmin as $, useTranslate as k, WxListScreen as y } from "@webx-ui/module-admin";
|
|
4
|
-
import { u as A } from "./index-
|
|
4
|
+
import { u as A } from "./index-BxS_t2W2.js";
|
|
5
5
|
const R = /* @__PURE__ */ g({
|
|
6
6
|
__name: "AuditLayout",
|
|
7
7
|
props: {
|
|
@@ -63,4 +63,4 @@ const R = /* @__PURE__ */ g({
|
|
|
63
63
|
export {
|
|
64
64
|
R as _
|
|
65
65
|
};
|
|
66
|
-
//# sourceMappingURL=AuditLayout.vue_vue_type_script_setup_true_lang-
|
|
66
|
+
//# sourceMappingURL=AuditLayout.vue_vue_type_script_setup_true_lang-BIj7GvJb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuditLayout.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
{"version":3,"file":"AuditLayout.vue_vue_type_script_setup_true_lang-BIj7GvJb.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;;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
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
2
|
import { useAdmin as ee, useTranslate as ae, useErrorText as te, WxDate as se } from "@webx-ui/module-admin";
|
|
3
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-
|
|
5
|
-
import { c as ne, u as oe, _ as ce } from "./index-
|
|
4
|
+
import { _ as ie } from "./AuditLayout.vue_vue_type_script_setup_true_lang-BIj7GvJb.js";
|
|
5
|
+
import { c as ne, u as oe, _ as ce } from "./index-BxS_t2W2.js";
|
|
6
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
7
|
key: 0,
|
|
8
8
|
class: "wx-audit-overview__parts"
|
|
@@ -429,4 +429,4 @@ const de = { class: "wx-audit-overview" }, ve = { class: "wx-audit-overview__row
|
|
|
429
429
|
export {
|
|
430
430
|
Be as default
|
|
431
431
|
};
|
|
432
|
-
//# sourceMappingURL=AuditOverviewPage-
|
|
432
|
+
//# sourceMappingURL=AuditOverviewPage-BqTU-JnS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuditOverviewPage-gVpdBOAY.js","sources":["../src/AuditOverviewPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxEmpty,\n WxPopover,\n WxProgress,\n WxSegmented,\n WxSkeleton,\n WxStatistic,\n WxText,\n type ProgressStatus,\n} from '@webx-ui/core'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditLatest, AuditRun, AuditScope, AuditSeverity } from './types'\n\n/**\n * The last run at a glance (§8): health and what it is made of, the counts by severity and by\n * group, what is new and what got fixed since the run before, and the button that starts the next one. While a run is\n * going the page asks for it every couple of seconds and shows the stage it is in.\n */\nconst props = defineProps<{ base: string }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst POLL_MS = 2000\n\nconst latest = ref<AuditLatest | null>(null)\nconst scope = ref<AuditScope>('quick')\nconst starting = ref(false)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nconst canRun = context.can('audit.run') || context.can('audit.manage')\n\nconst active = computed(() => latest.value?.active ?? null)\nconst done = computed(() => latest.value?.done ?? null)\nconst counts = computed(() => done.value?.counts ?? null)\n\nconst scopes = computed(() => [\n { value: 'quick', label: t('page.scope-quick') },\n { value: 'full', label: t('page.scope-full') },\n])\n\nconst severities: { key: AuditSeverity; label: string; tone: 'danger' | 'warning' | 'info' }[] = [\n { key: 'error', label: 'page.errors', tone: 'danger' },\n { key: 'warning', label: 'page.warnings', tone: 'warning' },\n { key: 'notice', label: 'page.notices', tone: 'info' },\n]\n\nconst parts = computed(() => counts.value?.health_parts ?? null)\n\nconst healthStatus = computed<ProgressStatus>(() => {\n const health = counts.value?.health ?? 0\n\n if (health >= 90) return 'success'\n if (health >= 60) return 'warning'\n\n return 'danger'\n})\n\n/* The groups this package has words for; a module's own group reads as «Other». */\nconst GROUPS = [\n 'config',\n 'host',\n 'hosts',\n 'indexing',\n 'page',\n 'content',\n 'links',\n 'images',\n 'a11y',\n 'structure',\n]\n\nconst groups = computed(() =>\n Object.entries(counts.value?.groups ?? {}).map(([id, bySeverity]) => ({\n id,\n label: t(`page.group-${GROUPS.includes(id) ? id : 'other'}`),\n bySeverity,\n })),\n)\n\nfunction stageLabel(run: AuditRun): string {\n if (run.status === 'queued') return t('page.status-queued')\n\n return run.progress.stage ? t(`page.stage-${run.progress.stage}`) : t('page.status-running')\n}\n\nasync function load(): Promise<void> {\n try {\n latest.value = await api.latest()\n } catch (error) {\n toast.danger(message(error))\n }\n\n clearTimeout(timer)\n\n if (latest.value?.active) {\n timer = setTimeout(() => void load(), POLL_MS)\n }\n}\n\nasync function start(): Promise<void> {\n starting.value = true\n\n try {\n await api.start(scope.value)\n toast.success(t('page.started'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n starting.value = false\n }\n}\n\nasync function cancel(run: AuditRun): Promise<void> {\n try {\n await api.cancel(run.id)\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nonMounted(load)\nonBeforeUnmount(() => clearTimeout(timer))\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"overview\" :card=\"false\">\n <div class=\"wx-audit-overview\">\n <wx-card v-if=\"!latest\"><wx-skeleton :rows=\"4\" /></wx-card>\n\n <template v-else>\n <wx-alert v-if=\"latest.queue.sync\" type=\"warning\" :description=\"t('page.sync-queue')\" />\n\n <wx-alert\n v-if=\"latest.last && latest.last.status === 'failed'\"\n type=\"danger\"\n :description=\"t('page.last-failed', { error: latest.last.error ?? '' })\"\n />\n\n <wx-card v-if=\"active\" class=\"wx-audit-overview__active\">\n <div class=\"wx-audit-overview__row\">\n <wx-text weight=\"semibold\">{{ stageLabel(active) }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-overview__url\">{{\n active.base_url\n }}</wx-text>\n <wx-button\n v-if=\"canRun\"\n size=\"sm\"\n class=\"wx-audit-overview__end\"\n @click=\"cancel(active)\"\n >{{ t('page.cancel') }}</wx-button\n >\n </div>\n <wx-progress indeterminate :aria-label=\"stageLabel(active)\" />\n <wx-text v-if=\"active.progress.resources\" size=\"sm\" tone=\"muted\">{{\n t('page.resources-progress', {\n checked: active.progress.resources.checked,\n total: active.progress.resources.total,\n })\n }}</wx-text>\n <wx-text v-else-if=\"active.progress.stage === 'crawl'\" size=\"sm\" tone=\"muted\">{{\n t('page.pages-progress', {\n crawled: active.progress.pages.crawled,\n limit: active.progress.pages.limit,\n })\n }}</wx-text>\n </wx-card>\n\n <wx-card v-else-if=\"canRun && !latest.queue.sync\">\n <div class=\"wx-audit-overview__row\">\n <wx-segmented v-model=\"scope\" :options=\"scopes\" :aria-label=\"t('page.scope')\" />\n <wx-text size=\"sm\" tone=\"muted\">{{\n scope === 'full' ? t('page.scope-full-help') : t('page.scope-quick-help')\n }}</wx-text>\n <wx-button\n type=\"primary\"\n icon=\"refresh\"\n :loading=\"starting\"\n class=\"wx-audit-overview__end\"\n @click=\"start\"\n >{{ t('page.run') }}</wx-button\n >\n </div>\n </wx-card>\n\n <wx-card v-if=\"!done && !active\">\n <wx-empty\n icon=\"check-circle\"\n :title=\"t('page.never')\"\n :description=\"t('page.never-help')\"\n />\n </wx-card>\n\n <template v-if=\"done && counts\">\n <wx-card>\n <div class=\"wx-audit-overview__summary\">\n <div class=\"wx-audit-overview__health\">\n <wx-progress\n type=\"circle\"\n :value=\"counts.health\"\n :status=\"healthStatus\"\n show-value\n :formatter=\"(value: number) => `${value}%`\"\n :aria-label=\"t('page.health')\"\n />\n <div v-if=\"parts\" class=\"wx-audit-overview__parts\">\n <wx-text v-if=\"parts.pages > 0\" size=\"sm\">{{\n t('page.health-pages', { clean: parts.clean, pages: parts.pages })\n }}</wx-text>\n <wx-text v-if=\"parts.site_errors > 0\" size=\"sm\" tone=\"danger\">{{\n t('page.health-site', { count: parts.site_errors })\n }}</wx-text>\n <wx-text v-if=\"parts.warnings > 0\" size=\"sm\" tone=\"warning\">{{\n t('page.health-warnings', { count: parts.warnings })\n }}</wx-text>\n <wx-text size=\"xs\" tone=\"muted\">{{ t('page.health-help') }}</wx-text>\n </div>\n </div>\n <div class=\"wx-audit-overview__stats\">\n <wx-statistic\n v-for=\"severity in severities\"\n :key=\"severity.key\"\n :title=\"t(severity.label)\"\n :value=\"counts.severity[severity.key] ?? 0\"\n :tone=\"(counts.severity[severity.key] ?? 0) > 0 ? severity.tone : 'muted'\"\n />\n <wx-statistic :title=\"t('page.new')\" :value=\"counts.new\" />\n <wx-statistic :title=\"t('page.fixed')\" :value=\"counts.fixed\" tone=\"success\" />\n </div>\n </div>\n <div class=\"wx-audit-overview__meta\">\n <wx-text size=\"sm\" tone=\"muted\">\n {{ t('page.last-run') }} <wx-date :value=\"done.finished_at\" /> ·\n {{ t(`page.scope-${done.scope}`) }} ·\n </wx-text>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-overview__url\">{{\n done.base_url\n }}</wx-text>\n </div>\n </wx-card>\n\n <wx-card v-if=\"groups.length\" :title=\"t('page.by-group')\">\n <ul class=\"wx-audit-overview__groups\">\n <li v-for=\"group in groups\" :key=\"group.id\">\n <wx-text size=\"sm\">{{ group.label }}</wx-text>\n <span class=\"wx-audit-overview__badges\">\n <template v-for=\"severity in severities\" :key=\"severity.key\">\n <wx-badge\n v-if=\"(group.bySeverity[severity.key] ?? 0) > 0\"\n :type=\"severity.tone\"\n size=\"sm\"\n >{{ t(severity.label) }} · {{ group.bySeverity[severity.key] }}</wx-badge\n >\n </template>\n </span>\n </li>\n </ul>\n </wx-card>\n\n <wx-card v-else>\n <wx-empty icon=\"check-circle\" :title=\"t('page.clean')\" size=\"sm\" />\n </wx-card>\n\n <wx-card>\n <template #header>\n <span class=\"wx-audit-overview__title\">\n {{ t('page.sources') }}\n <wx-popover :title=\"t('page.sources')\" :width=\"360\" teleport>\n <template #trigger>\n <wx-button\n variant=\"text\"\n size=\"sm\"\n icon=\"question\"\n :aria-label=\"t('page.sources-help-label')\"\n />\n </template>\n <wx-text size=\"sm\">{{ t('page.sources-help') }}</wx-text>\n </wx-popover>\n </span>\n </template>\n <div class=\"wx-audit-overview__badges\">\n <wx-badge v-for=\"source in counts.sources.searched\" :key=\"source\" type=\"success\">{{\n source\n }}</wx-badge>\n </div>\n <div v-if=\"counts.sources.missing.length\" class=\"wx-audit-overview__missing\">\n <wx-text size=\"sm\" tone=\"warning\">{{ t('page.sources-missing') }}</wx-text>\n <wx-badge v-for=\"source in counts.sources.missing\" :key=\"source\" type=\"warning\">{{\n source\n }}</wx-badge>\n </div>\n </wx-card>\n </template>\n </template>\n </div>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-overview {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n container-type: inline-size;\n}\n\n.wx-audit-overview__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8) var(--wx-space-12);\n margin-bottom: var(--wx-space-8);\n}\n\n.wx-audit-overview__end {\n margin-left: auto;\n}\n\n.wx-audit-overview__summary {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-24);\n}\n\n.wx-audit-overview__health {\n display: flex;\n flex: 1 1 20rem;\n align-items: center;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n/* The help is a sentence; it wraps beside the circle rather than stretching the card. */\n.wx-audit-overview__parts {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n max-width: 36ch;\n min-width: 0;\n}\n\n.wx-audit-overview__stats {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n gap: var(--wx-space-16) var(--wx-space-32);\n}\n\n.wx-audit-overview__meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n margin-top: var(--wx-space-16);\n}\n\n/* A long domain breaks rather than pushing the card sideways on a phone. */\n.wx-audit-overview__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.wx-audit-overview__groups {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-audit-overview__groups li {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-overview__badges,\n.wx-audit-overview__missing {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-overview__missing {\n margin-top: var(--wx-space-12);\n}\n\n.wx-audit-overview__title {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n}\n</style>\n"],"names":["POLL_MS","props","__props","context","useAdmin","api","createAuditApi","useAuditMessages","t","useTranslate","message","useErrorText","latest","ref","scope","starting","timer","canRun","active","computed","done","counts","scopes","severities","parts","healthStatus","health","GROUPS","groups","id","bySeverity","stageLabel","run","load","error","toast","start","cancel","onMounted","onBeforeUnmount","_createBlock","AuditLayout","_createElementVNode","_hoisted_1","_createElementBlock","_Fragment","_unref","WxAlert","WxCard","_hoisted_2","_createVNode","WxText","_createTextVNode","_toDisplayString","WxButton","_cache","$event","WxProgress","_hoisted_3","WxSegmented","WxEmpty","_hoisted_4","_hoisted_5","value","_openBlock","_hoisted_6","_hoisted_7","_renderList","severity","WxStatistic","_hoisted_8","WxDate","_hoisted_9","group","_hoisted_10","WxBadge","_hoisted_11","WxPopover","_hoisted_12","source","_hoisted_13","WxSkeleton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AuditOverviewPage-BqTU-JnS.js","sources":["../src/AuditOverviewPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxEmpty,\n WxPopover,\n WxProgress,\n WxSegmented,\n WxSkeleton,\n WxStatistic,\n WxText,\n type ProgressStatus,\n} from '@webx-ui/core'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditLatest, AuditRun, AuditScope, AuditSeverity } from './types'\n\n/**\n * The last run at a glance (§8): health and what it is made of, the counts by severity and by\n * group, what is new and what got fixed since the run before, and the button that starts the next one. While a run is\n * going the page asks for it every couple of seconds and shows the stage it is in.\n */\nconst props = defineProps<{ base: string }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst POLL_MS = 2000\n\nconst latest = ref<AuditLatest | null>(null)\nconst scope = ref<AuditScope>('quick')\nconst starting = ref(false)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nconst canRun = context.can('audit.run') || context.can('audit.manage')\n\nconst active = computed(() => latest.value?.active ?? null)\nconst done = computed(() => latest.value?.done ?? null)\nconst counts = computed(() => done.value?.counts ?? null)\n\nconst scopes = computed(() => [\n { value: 'quick', label: t('page.scope-quick') },\n { value: 'full', label: t('page.scope-full') },\n])\n\nconst severities: { key: AuditSeverity; label: string; tone: 'danger' | 'warning' | 'info' }[] = [\n { key: 'error', label: 'page.errors', tone: 'danger' },\n { key: 'warning', label: 'page.warnings', tone: 'warning' },\n { key: 'notice', label: 'page.notices', tone: 'info' },\n]\n\nconst parts = computed(() => counts.value?.health_parts ?? null)\n\nconst healthStatus = computed<ProgressStatus>(() => {\n const health = counts.value?.health ?? 0\n\n if (health >= 90) return 'success'\n if (health >= 60) return 'warning'\n\n return 'danger'\n})\n\n/* The groups this package has words for; a module's own group reads as «Other». */\nconst GROUPS = [\n 'config',\n 'host',\n 'hosts',\n 'indexing',\n 'page',\n 'content',\n 'links',\n 'images',\n 'a11y',\n 'structure',\n]\n\nconst groups = computed(() =>\n Object.entries(counts.value?.groups ?? {}).map(([id, bySeverity]) => ({\n id,\n label: t(`page.group-${GROUPS.includes(id) ? id : 'other'}`),\n bySeverity,\n })),\n)\n\nfunction stageLabel(run: AuditRun): string {\n if (run.status === 'queued') return t('page.status-queued')\n\n return run.progress.stage ? t(`page.stage-${run.progress.stage}`) : t('page.status-running')\n}\n\nasync function load(): Promise<void> {\n try {\n latest.value = await api.latest()\n } catch (error) {\n toast.danger(message(error))\n }\n\n clearTimeout(timer)\n\n if (latest.value?.active) {\n timer = setTimeout(() => void load(), POLL_MS)\n }\n}\n\nasync function start(): Promise<void> {\n starting.value = true\n\n try {\n await api.start(scope.value)\n toast.success(t('page.started'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n starting.value = false\n }\n}\n\nasync function cancel(run: AuditRun): Promise<void> {\n try {\n await api.cancel(run.id)\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nonMounted(load)\nonBeforeUnmount(() => clearTimeout(timer))\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"overview\" :card=\"false\">\n <div class=\"wx-audit-overview\">\n <wx-card v-if=\"!latest\"><wx-skeleton :rows=\"4\" /></wx-card>\n\n <template v-else>\n <wx-alert v-if=\"latest.queue.sync\" type=\"warning\" :description=\"t('page.sync-queue')\" />\n\n <wx-alert\n v-if=\"latest.last && latest.last.status === 'failed'\"\n type=\"danger\"\n :description=\"t('page.last-failed', { error: latest.last.error ?? '' })\"\n />\n\n <wx-card v-if=\"active\" class=\"wx-audit-overview__active\">\n <div class=\"wx-audit-overview__row\">\n <wx-text weight=\"semibold\">{{ stageLabel(active) }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-overview__url\">{{\n active.base_url\n }}</wx-text>\n <wx-button\n v-if=\"canRun\"\n size=\"sm\"\n class=\"wx-audit-overview__end\"\n @click=\"cancel(active)\"\n >{{ t('page.cancel') }}</wx-button\n >\n </div>\n <wx-progress indeterminate :aria-label=\"stageLabel(active)\" />\n <wx-text v-if=\"active.progress.resources\" size=\"sm\" tone=\"muted\">{{\n t('page.resources-progress', {\n checked: active.progress.resources.checked,\n total: active.progress.resources.total,\n })\n }}</wx-text>\n <wx-text v-else-if=\"active.progress.stage === 'crawl'\" size=\"sm\" tone=\"muted\">{{\n t('page.pages-progress', {\n crawled: active.progress.pages.crawled,\n limit: active.progress.pages.limit,\n })\n }}</wx-text>\n </wx-card>\n\n <wx-card v-else-if=\"canRun && !latest.queue.sync\">\n <div class=\"wx-audit-overview__row\">\n <wx-segmented v-model=\"scope\" :options=\"scopes\" :aria-label=\"t('page.scope')\" />\n <wx-text size=\"sm\" tone=\"muted\">{{\n scope === 'full' ? t('page.scope-full-help') : t('page.scope-quick-help')\n }}</wx-text>\n <wx-button\n type=\"primary\"\n icon=\"refresh\"\n :loading=\"starting\"\n class=\"wx-audit-overview__end\"\n @click=\"start\"\n >{{ t('page.run') }}</wx-button\n >\n </div>\n </wx-card>\n\n <wx-card v-if=\"!done && !active\">\n <wx-empty\n icon=\"check-circle\"\n :title=\"t('page.never')\"\n :description=\"t('page.never-help')\"\n />\n </wx-card>\n\n <template v-if=\"done && counts\">\n <wx-card>\n <div class=\"wx-audit-overview__summary\">\n <div class=\"wx-audit-overview__health\">\n <wx-progress\n type=\"circle\"\n :value=\"counts.health\"\n :status=\"healthStatus\"\n show-value\n :formatter=\"(value: number) => `${value}%`\"\n :aria-label=\"t('page.health')\"\n />\n <div v-if=\"parts\" class=\"wx-audit-overview__parts\">\n <wx-text v-if=\"parts.pages > 0\" size=\"sm\">{{\n t('page.health-pages', { clean: parts.clean, pages: parts.pages })\n }}</wx-text>\n <wx-text v-if=\"parts.site_errors > 0\" size=\"sm\" tone=\"danger\">{{\n t('page.health-site', { count: parts.site_errors })\n }}</wx-text>\n <wx-text v-if=\"parts.warnings > 0\" size=\"sm\" tone=\"warning\">{{\n t('page.health-warnings', { count: parts.warnings })\n }}</wx-text>\n <wx-text size=\"xs\" tone=\"muted\">{{ t('page.health-help') }}</wx-text>\n </div>\n </div>\n <div class=\"wx-audit-overview__stats\">\n <wx-statistic\n v-for=\"severity in severities\"\n :key=\"severity.key\"\n :title=\"t(severity.label)\"\n :value=\"counts.severity[severity.key] ?? 0\"\n :tone=\"(counts.severity[severity.key] ?? 0) > 0 ? severity.tone : 'muted'\"\n />\n <wx-statistic :title=\"t('page.new')\" :value=\"counts.new\" />\n <wx-statistic :title=\"t('page.fixed')\" :value=\"counts.fixed\" tone=\"success\" />\n </div>\n </div>\n <div class=\"wx-audit-overview__meta\">\n <wx-text size=\"sm\" tone=\"muted\">\n {{ t('page.last-run') }} <wx-date :value=\"done.finished_at\" /> ·\n {{ t(`page.scope-${done.scope}`) }} ·\n </wx-text>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-overview__url\">{{\n done.base_url\n }}</wx-text>\n </div>\n </wx-card>\n\n <wx-card v-if=\"groups.length\" :title=\"t('page.by-group')\">\n <ul class=\"wx-audit-overview__groups\">\n <li v-for=\"group in groups\" :key=\"group.id\">\n <wx-text size=\"sm\">{{ group.label }}</wx-text>\n <span class=\"wx-audit-overview__badges\">\n <template v-for=\"severity in severities\" :key=\"severity.key\">\n <wx-badge\n v-if=\"(group.bySeverity[severity.key] ?? 0) > 0\"\n :type=\"severity.tone\"\n size=\"sm\"\n >{{ t(severity.label) }} · {{ group.bySeverity[severity.key] }}</wx-badge\n >\n </template>\n </span>\n </li>\n </ul>\n </wx-card>\n\n <wx-card v-else>\n <wx-empty icon=\"check-circle\" :title=\"t('page.clean')\" size=\"sm\" />\n </wx-card>\n\n <wx-card>\n <template #header>\n <span class=\"wx-audit-overview__title\">\n {{ t('page.sources') }}\n <wx-popover :title=\"t('page.sources')\" :width=\"360\" teleport>\n <template #trigger>\n <wx-button\n variant=\"text\"\n size=\"sm\"\n icon=\"question\"\n :aria-label=\"t('page.sources-help-label')\"\n />\n </template>\n <wx-text size=\"sm\">{{ t('page.sources-help') }}</wx-text>\n </wx-popover>\n </span>\n </template>\n <div class=\"wx-audit-overview__badges\">\n <wx-badge v-for=\"source in counts.sources.searched\" :key=\"source\" type=\"success\">{{\n source\n }}</wx-badge>\n </div>\n <div v-if=\"counts.sources.missing.length\" class=\"wx-audit-overview__missing\">\n <wx-text size=\"sm\" tone=\"warning\">{{ t('page.sources-missing') }}</wx-text>\n <wx-badge v-for=\"source in counts.sources.missing\" :key=\"source\" type=\"warning\">{{\n source\n }}</wx-badge>\n </div>\n </wx-card>\n </template>\n </template>\n </div>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-overview {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n container-type: inline-size;\n}\n\n.wx-audit-overview__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8) var(--wx-space-12);\n margin-bottom: var(--wx-space-8);\n}\n\n.wx-audit-overview__end {\n margin-left: auto;\n}\n\n.wx-audit-overview__summary {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-24);\n}\n\n.wx-audit-overview__health {\n display: flex;\n flex: 1 1 20rem;\n align-items: center;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n/* The help is a sentence; it wraps beside the circle rather than stretching the card. */\n.wx-audit-overview__parts {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n max-width: 36ch;\n min-width: 0;\n}\n\n.wx-audit-overview__stats {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n gap: var(--wx-space-16) var(--wx-space-32);\n}\n\n.wx-audit-overview__meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n margin-top: var(--wx-space-16);\n}\n\n/* A long domain breaks rather than pushing the card sideways on a phone. */\n.wx-audit-overview__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.wx-audit-overview__groups {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-audit-overview__groups li {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-overview__badges,\n.wx-audit-overview__missing {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-overview__missing {\n margin-top: var(--wx-space-12);\n}\n\n.wx-audit-overview__title {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-4);\n}\n</style>\n"],"names":["POLL_MS","props","__props","context","useAdmin","api","createAuditApi","useAuditMessages","t","useTranslate","message","useErrorText","latest","ref","scope","starting","timer","canRun","active","computed","done","counts","scopes","severities","parts","healthStatus","health","GROUPS","groups","id","bySeverity","stageLabel","run","load","error","toast","start","cancel","onMounted","onBeforeUnmount","_createBlock","AuditLayout","_createElementVNode","_hoisted_1","_createElementBlock","_Fragment","_unref","WxAlert","WxCard","_hoisted_2","_createVNode","WxText","_createTextVNode","_toDisplayString","WxButton","_cache","$event","WxProgress","_hoisted_3","WxSegmented","WxEmpty","_hoisted_4","_hoisted_5","value","_openBlock","_hoisted_6","_hoisted_7","_renderList","severity","WxStatistic","_hoisted_8","WxDate","_hoisted_9","group","_hoisted_10","WxBadge","_hoisted_11","WxPopover","_hoisted_12","source","_hoisted_13","WxSkeleton"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { defineComponent as fe, ref as p, watch as G, computed as b, onMounted as be, openBlock as u, createBlock as m, withCtx as i, unref as l, createTextVNode as f, toDisplayString as g, createSlots as xe, createElementVNode as he, createVNode as v, createElementBlock as w, Fragment as T, renderList as J, createCommentVNode as F, normalizeClass as _e } from "vue";
|
|
2
2
|
import { useAdmin as ye, useTranslate as q, useErrorText as we, useDates as Ce } from "@webx-ui/module-admin";
|
|
3
3
|
import { toast as H, WxText as N, WxTable as Se, WxSelect as h, WxInput as ke, WxButton as O, WxPopover as Ve, WxCheckboxGroup as Oe, WxBadge as Ue } from "@webx-ui/core";
|
|
4
|
-
import { _ as Ae } from "./AuditLayout.vue_vue_type_script_setup_true_lang-
|
|
5
|
-
import { c as ze, u as Ee, P as r, D as $e, C as K, W as I, S as Pe, b as We, g as Te, O as Q, _ as Fe } from "./index-
|
|
4
|
+
import { _ as Ae } from "./AuditLayout.vue_vue_type_script_setup_true_lang-BIj7GvJb.js";
|
|
5
|
+
import { c as ze, u as Ee, P as r, D as $e, C as K, W as I, S as Pe, b as We, g as Te, O as Q, _ as Fe } from "./index-BxS_t2W2.js";
|
|
6
6
|
const Ne = { class: "wx-audit-pages__filters" }, X = "webx-audit.pages.columns", Ie = /* @__PURE__ */ fe({
|
|
7
7
|
__name: "AuditPagesPage",
|
|
8
8
|
props: {
|
|
@@ -352,4 +352,4 @@ const Ne = { class: "wx-audit-pages__filters" }, X = "webx-audit.pages.columns",
|
|
|
352
352
|
export {
|
|
353
353
|
je as default
|
|
354
354
|
};
|
|
355
|
-
//# sourceMappingURL=AuditPagesPage-
|
|
355
|
+
//# sourceMappingURL=AuditPagesPage-CsizUOgz.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuditPagesPage-DNgZo-K-.js","sources":["../src/AuditPagesPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useDates, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxCheckboxGroup,\n WxInput,\n WxPopover,\n WxSelect,\n WxTable,\n WxText,\n type SelectValue,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport AuditLayout from './AuditLayout.vue'\nimport AuditPageCard from './AuditPageCard.vue'\nimport { createAuditApi } from './api'\nimport {\n COMPUTED_FIELDS,\n DEFAULT_COLUMNS,\n OPERATIONS,\n PAGE_FIELDS,\n SOURCES,\n WITH_VALUE,\n} from './fields'\nimport AuditStatus from './AuditStatus.vue'\nimport { useAuditMessages } from './i18n'\nimport type {\n AuditFieldFilter,\n AuditFilterOp,\n AuditPage,\n AuditPageField,\n AuditPageQuery,\n AuditPageRow,\n AuditRun,\n} from './types'\n\n/**\n * Every address the last full run crawled (§8, «Pages»): any field of the snapshot as a column,\n * a filter on any of them, the list as CSV, and a row that opens the page's card.\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()\nconst dates = useDates()\n\nconst STORAGE = 'webx-audit.pages.columns'\n\nconst run = ref<AuditRun | null>(null)\nconst ready = ref(false)\nconst page = ref<AuditPage<AuditPageRow> | null>(null)\nconst loading = ref(false)\nconst opened = ref<number | null>(null)\nconst titles = ref<Record<string, string>>({})\n\nconst status = ref<string | null>(null)\nconst indexable = ref<string | null>(null)\nconst check = ref<string | null>(null)\nconst filters = ref<AuditFieldFilter[]>([])\nlet last: TableState = { page: 1, perPage: 50, sort: null, search: '' }\n\nconst visible = ref<AuditPageField[]>(restore())\n\nfunction restore(): AuditPageField[] {\n try {\n const saved: unknown = JSON.parse(window.localStorage.getItem(STORAGE) ?? 'null')\n\n if (Array.isArray(saved)) {\n const known = saved.filter((key): key is AuditPageField => key in PAGE_FIELDS)\n\n if (known.length) return known\n }\n } catch {\n // A private window or a broken value: the default columns, as for anyone else.\n }\n\n return [...DEFAULT_COLUMNS]\n}\n\nwatch(visible, (keys) => {\n try {\n window.localStorage.setItem(STORAGE, JSON.stringify(keys))\n } catch {\n // Not remembered — still shown.\n }\n})\n\nconst fields = Object.keys(PAGE_FIELDS) as AuditPageField[]\n\nconst columnOptions = computed(() =>\n fields.map((key) => ({ value: key, label: t(`page.field-${key}`) })),\n)\n\nconst filterFields = computed(() =>\n fields\n .filter((key) => !COMPUTED_FIELDS.includes(key))\n .map((key) => ({ value: key, label: t(`page.field-${key}`) })),\n)\n\nconst columns = computed<TableColumn<AuditPageRow>[]>(() =>\n /* The picker keeps the order things were ticked in; the table keeps the card's order. */\n fields\n .filter((key) => visible.value.includes(key))\n .map((key) => ({\n key,\n label: t(`page.field-${key}`),\n sortable: !COMPUTED_FIELDS.includes(key),\n minWidth: PAGE_FIELDS[key] === 'url' || PAGE_FIELDS[key] === 'text' ? 220 : undefined,\n align: PAGE_FIELDS[key] === 'number' ? 'right' : undefined,\n })),\n)\n\nconst statusOptions = computed(() => [\n ...['2xx', '3xx', '4xx', '5xx'].map((value) => ({ value, label: value })),\n { value: 'none', label: t('page.status-none') },\n])\n\nconst indexableOptions = computed(() => [\n { value: '1', label: t('page.indexable-yes') },\n { value: '0', label: t('page.indexable-no') },\n])\n\nconst checkOptions = computed(() =>\n Object.entries(titles.value).map(([value, label]) => ({ value, label })),\n)\n\nconst filtersCount = computed(\n () =>\n [status.value, indexable.value, check.value].filter(Boolean).length +\n filters.value.filter(complete).length,\n)\n\nconst query = computed<AuditPageQuery>(() => ({\n status: status.value,\n indexable: indexable.value === null ? null : indexable.value === '1',\n check: check.value,\n filters: filters.value.filter(complete),\n}))\n\nfunction complete(filter: AuditFieldFilter): boolean {\n return !WITH_VALUE.includes(filter.op) || (filter.value ?? '').trim() !== ''\n}\n\nfunction pick(value: SelectValue | SelectValue[] | null | undefined): string | null {\n return typeof value === 'string' && value !== '' ? value : null\n}\n\nfunction operations(field: AuditPageField) {\n return OPERATIONS[PAGE_FIELDS[field]].map((op) => ({ value: op, label: t(`page.op-${op}`) }))\n}\n\nfunction addFilter(): void {\n filters.value = [...filters.value, { field: 'title', op: 'empty' }]\n}\n\nfunction setField(index: number, value: SelectValue | SelectValue[] | null | undefined): void {\n const field = pick(value) as AuditPageField | null\n\n if (!field) return\n\n filters.value = filters.value.map((filter, at) =>\n at === index ? { field, op: OPERATIONS[PAGE_FIELDS[field]][0]!, value: '' } : filter,\n )\n}\n\nfunction setOp(index: number, value: SelectValue | SelectValue[] | null | undefined): void {\n const op = pick(value) as AuditFilterOp | null\n\n if (op)\n filters.value = filters.value.map((filter, at) => (at === index ? { ...filter, op } : filter))\n}\n\nfunction setValue(index: number, value: string): void {\n filters.value = filters.value.map((filter, at) => (at === index ? { ...filter, value } : filter))\n}\n\nfunction removeFilter(index: number): void {\n filters.value = filters.value.filter((_, at) => at !== index)\n}\n\nfunction setColumns(keys: unknown[]): void {\n const next = keys.filter((key): key is AuditPageField => String(key) in PAGE_FIELDS)\n\n /* A table without columns is a blank card; the address stays at least. */\n visible.value = next.length ? next : ['url']\n}\n\nfunction text(value: unknown): string {\n return value === null || value === undefined || value === '' ? '—' : String(value)\n}\n\nasync function load(state: TableState = last): Promise<void> {\n last = state\n\n if (run.value === null) return\n\n loading.value = true\n\n try {\n page.value = await api.pages(run.value.id, {\n ...query.value,\n search: state.search,\n sort: state.sort ? `${state.sort.order === 'desc' ? '-' : ''}${state.sort.key}` : null,\n page: state.page,\n per_page: state.perPage,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nfunction download(): void {\n if (run.value === null) return\n\n window.location.assign(\n api.pagesFile(\n run.value.id,\n { ...query.value, search: last.search },\n columns.value.map((column) => column.key),\n ),\n )\n}\n\nwatch(query, () => void load({ ...last, page: 1 }), { deep: true })\n\nonMounted(async () => {\n try {\n run.value = (await api.latest()).crawled\n\n if (run.value !== null) {\n const checks = await api.checks(run.value.id)\n titles.value = Object.fromEntries(checks.map((row) => [row.id, row.title]))\n }\n } catch (error) {\n toast.danger(message(error))\n } finally {\n ready.value = true\n }\n\n void load()\n})\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"pages\">\n <wx-text v-if=\"ready && run === null\" tone=\"muted\" class=\"wx-audit-pages__none\">{{\n t('page.pages-none')\n }}</wx-text>\n\n <wx-table\n v-else\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n clickable\n hover\n flush\n :loading=\"loading || !ready\"\n :per-page-options=\"[50, 100, 200]\"\n :search-placeholder=\"t('page.search-url')\"\n :filters-count=\"filtersCount\"\n :filters-label=\"panel('filters.title')\"\n :filters-width=\"420\"\n :empty-text=\"t('page.empty')\"\n @state-change=\"load\"\n @row-click=\"(row) => (opened = row.id)\"\n >\n <template #title>\n <wx-text v-if=\"run\" size=\"sm\" tone=\"muted\">{{\n t('page.pages-run', { date: dates.short(run.finished_at) })\n }}</wx-text>\n </template>\n\n <template #actions>\n <wx-popover :title=\"t('page.columns')\" width=\"300\">\n <template #trigger>\n <wx-button size=\"sm\" variant=\"text\" icon=\"sliders\">{{ t('page.columns') }}</wx-button>\n </template>\n <wx-checkbox-group\n :model-value=\"visible\"\n :options=\"columnOptions\"\n size=\"sm\"\n class=\"wx-audit-pages__picker\"\n @update:model-value=\"setColumns\"\n />\n </wx-popover>\n <wx-button size=\"sm\" variant=\"text\" icon=\"download\" :disabled=\"!run\" @click=\"download\">{{\n t('page.export')\n }}</wx-button>\n </template>\n\n <template #filters>\n <div class=\"wx-audit-pages__filters\">\n <wx-select\n :model-value=\"status\"\n :options=\"statusOptions\"\n :placeholder=\"t('page.any-status')\"\n clearable\n @update:model-value=\"status = pick($event)\"\n />\n <wx-select\n :model-value=\"indexable\"\n :options=\"indexableOptions\"\n :placeholder=\"t('page.any-indexable')\"\n clearable\n @update:model-value=\"indexable = pick($event)\"\n />\n <wx-select\n :model-value=\"check\"\n :options=\"checkOptions\"\n :placeholder=\"t('page.any-check')\"\n clearable\n filterable\n @update:model-value=\"check = pick($event)\"\n />\n\n <div v-for=\"(filter, index) in filters\" :key=\"index\" class=\"wx-audit-pages__filter\">\n <wx-select\n :model-value=\"filter.field\"\n :options=\"filterFields\"\n filterable\n size=\"sm\"\n @update:model-value=\"setField(index, $event)\"\n />\n <wx-select\n :model-value=\"filter.op\"\n :options=\"operations(filter.field)\"\n size=\"sm\"\n @update:model-value=\"setOp(index, $event)\"\n />\n <wx-select\n v-if=\"WITH_VALUE.includes(filter.op) && PAGE_FIELDS[filter.field] === 'source'\"\n :model-value=\"filter.value ?? null\"\n :options=\"SOURCES.map((value) => ({ value, label: t(`page.source-${value}`) }))\"\n size=\"sm\"\n @update:model-value=\"setValue(index, pick($event) ?? '')\"\n />\n <wx-input\n v-else-if=\"WITH_VALUE.includes(filter.op)\"\n :model-value=\"filter.value ?? ''\"\n :placeholder=\"t('page.value')\"\n size=\"sm\"\n @update:model-value=\"setValue(index, String($event ?? ''))\"\n />\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"close\"\n :aria-label=\"t('page.remove-filter')\"\n @click=\"removeFilter(index)\"\n />\n </div>\n\n <wx-button size=\"sm\" variant=\"text\" icon=\"plus\" @click=\"addFilter\">{{\n t('page.add-filter')\n }}</wx-button>\n </div>\n </template>\n\n <template v-for=\"key in visible\" :key=\"key\" #[`cell-${key}`]=\"{ row }\">\n <audit-status\n v-if=\"PAGE_FIELDS[key] === 'status' && row[key] !== null\"\n :code=\"Number(row[key])\"\n />\n <wx-text v-else-if=\"PAGE_FIELDS[key] === 'status'\" size=\"sm\" tone=\"danger\">{{\n t('page.status-none')\n }}</wx-text>\n <template v-else-if=\"PAGE_FIELDS[key] === 'bool'\">{{\n row[key] ? t('page.yes') : t('page.no')\n }}</template>\n <template v-else-if=\"PAGE_FIELDS[key] === 'source'\">{{\n t(`page.source-${row[key]}`)\n }}</template>\n <wx-badge v-else-if=\"key === 'issues' && row.issues > 0\" type=\"warning\" size=\"sm\">{{\n row.issues\n }}</wx-badge>\n <span v-else :class=\"{ 'wx-audit-pages__long': PAGE_FIELDS[key] === 'url' }\">{{\n text(row[key])\n }}</span>\n </template>\n </wx-table>\n\n <audit-page-card\n v-if=\"run\"\n :run=\"run.id\"\n :base=\"props.base\"\n :page-id=\"opened\"\n :titles=\"titles\"\n @close=\"opened = null\"\n />\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-pages__none {\n display: block;\n padding: var(--wx-space-24);\n}\n\n.wx-audit-pages__filters {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-pages__filter {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr) auto;\n gap: var(--wx-space-4);\n align-items: center;\n}\n\n.wx-audit-pages__picker {\n max-height: 360px;\n overflow-y: auto;\n}\n\n.wx-audit-pages__long {\n overflow-wrap: anywhere;\n}\n</style>\n"],"names":["STORAGE","props","__props","api","createAuditApi","useAdmin","useAuditMessages","t","useTranslate","panel","message","useErrorText","dates","useDates","run","ref","ready","page","loading","opened","titles","status","indexable","check","filters","last","visible","restore","saved","known","key","PAGE_FIELDS","DEFAULT_COLUMNS","watch","keys","fields","columnOptions","computed","filterFields","COMPUTED_FIELDS","columns","statusOptions","value","indexableOptions","checkOptions","label","filtersCount","complete","query","filter","WITH_VALUE","pick","operations","field","OPERATIONS","op","addFilter","setField","index","at","setOp","setValue","removeFilter","_","setColumns","next","text","load","state","error","toast","download","column","onMounted","checks","row","_createBlock","AuditLayout","_unref","WxText","WxTable","_createTextVNode","_toDisplayString","_createVNode","WxPopover","WxButton","WxCheckboxGroup","_createElementVNode","_hoisted_1","WxSelect","_cache","$event","_openBlock","_createElementBlock","_Fragment","_renderList","SOURCES","WxInput","_withCtx","AuditStatus","WxBadge","_normalizeClass","AuditPageCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AuditPagesPage-CsizUOgz.js","sources":["../src/AuditPagesPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useDates, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxCheckboxGroup,\n WxInput,\n WxPopover,\n WxSelect,\n WxTable,\n WxText,\n type SelectValue,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport AuditLayout from './AuditLayout.vue'\nimport AuditPageCard from './AuditPageCard.vue'\nimport { createAuditApi } from './api'\nimport {\n COMPUTED_FIELDS,\n DEFAULT_COLUMNS,\n OPERATIONS,\n PAGE_FIELDS,\n SOURCES,\n WITH_VALUE,\n} from './fields'\nimport AuditStatus from './AuditStatus.vue'\nimport { useAuditMessages } from './i18n'\nimport type {\n AuditFieldFilter,\n AuditFilterOp,\n AuditPage,\n AuditPageField,\n AuditPageQuery,\n AuditPageRow,\n AuditRun,\n} from './types'\n\n/**\n * Every address the last full run crawled (§8, «Pages»): any field of the snapshot as a column,\n * a filter on any of them, the list as CSV, and a row that opens the page's card.\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()\nconst dates = useDates()\n\nconst STORAGE = 'webx-audit.pages.columns'\n\nconst run = ref<AuditRun | null>(null)\nconst ready = ref(false)\nconst page = ref<AuditPage<AuditPageRow> | null>(null)\nconst loading = ref(false)\nconst opened = ref<number | null>(null)\nconst titles = ref<Record<string, string>>({})\n\nconst status = ref<string | null>(null)\nconst indexable = ref<string | null>(null)\nconst check = ref<string | null>(null)\nconst filters = ref<AuditFieldFilter[]>([])\nlet last: TableState = { page: 1, perPage: 50, sort: null, search: '' }\n\nconst visible = ref<AuditPageField[]>(restore())\n\nfunction restore(): AuditPageField[] {\n try {\n const saved: unknown = JSON.parse(window.localStorage.getItem(STORAGE) ?? 'null')\n\n if (Array.isArray(saved)) {\n const known = saved.filter((key): key is AuditPageField => key in PAGE_FIELDS)\n\n if (known.length) return known\n }\n } catch {\n // A private window or a broken value: the default columns, as for anyone else.\n }\n\n return [...DEFAULT_COLUMNS]\n}\n\nwatch(visible, (keys) => {\n try {\n window.localStorage.setItem(STORAGE, JSON.stringify(keys))\n } catch {\n // Not remembered — still shown.\n }\n})\n\nconst fields = Object.keys(PAGE_FIELDS) as AuditPageField[]\n\nconst columnOptions = computed(() =>\n fields.map((key) => ({ value: key, label: t(`page.field-${key}`) })),\n)\n\nconst filterFields = computed(() =>\n fields\n .filter((key) => !COMPUTED_FIELDS.includes(key))\n .map((key) => ({ value: key, label: t(`page.field-${key}`) })),\n)\n\nconst columns = computed<TableColumn<AuditPageRow>[]>(() =>\n /* The picker keeps the order things were ticked in; the table keeps the card's order. */\n fields\n .filter((key) => visible.value.includes(key))\n .map((key) => ({\n key,\n label: t(`page.field-${key}`),\n sortable: !COMPUTED_FIELDS.includes(key),\n minWidth: PAGE_FIELDS[key] === 'url' || PAGE_FIELDS[key] === 'text' ? 220 : undefined,\n align: PAGE_FIELDS[key] === 'number' ? 'right' : undefined,\n })),\n)\n\nconst statusOptions = computed(() => [\n ...['2xx', '3xx', '4xx', '5xx'].map((value) => ({ value, label: value })),\n { value: 'none', label: t('page.status-none') },\n])\n\nconst indexableOptions = computed(() => [\n { value: '1', label: t('page.indexable-yes') },\n { value: '0', label: t('page.indexable-no') },\n])\n\nconst checkOptions = computed(() =>\n Object.entries(titles.value).map(([value, label]) => ({ value, label })),\n)\n\nconst filtersCount = computed(\n () =>\n [status.value, indexable.value, check.value].filter(Boolean).length +\n filters.value.filter(complete).length,\n)\n\nconst query = computed<AuditPageQuery>(() => ({\n status: status.value,\n indexable: indexable.value === null ? null : indexable.value === '1',\n check: check.value,\n filters: filters.value.filter(complete),\n}))\n\nfunction complete(filter: AuditFieldFilter): boolean {\n return !WITH_VALUE.includes(filter.op) || (filter.value ?? '').trim() !== ''\n}\n\nfunction pick(value: SelectValue | SelectValue[] | null | undefined): string | null {\n return typeof value === 'string' && value !== '' ? value : null\n}\n\nfunction operations(field: AuditPageField) {\n return OPERATIONS[PAGE_FIELDS[field]].map((op) => ({ value: op, label: t(`page.op-${op}`) }))\n}\n\nfunction addFilter(): void {\n filters.value = [...filters.value, { field: 'title', op: 'empty' }]\n}\n\nfunction setField(index: number, value: SelectValue | SelectValue[] | null | undefined): void {\n const field = pick(value) as AuditPageField | null\n\n if (!field) return\n\n filters.value = filters.value.map((filter, at) =>\n at === index ? { field, op: OPERATIONS[PAGE_FIELDS[field]][0]!, value: '' } : filter,\n )\n}\n\nfunction setOp(index: number, value: SelectValue | SelectValue[] | null | undefined): void {\n const op = pick(value) as AuditFilterOp | null\n\n if (op)\n filters.value = filters.value.map((filter, at) => (at === index ? { ...filter, op } : filter))\n}\n\nfunction setValue(index: number, value: string): void {\n filters.value = filters.value.map((filter, at) => (at === index ? { ...filter, value } : filter))\n}\n\nfunction removeFilter(index: number): void {\n filters.value = filters.value.filter((_, at) => at !== index)\n}\n\nfunction setColumns(keys: unknown[]): void {\n const next = keys.filter((key): key is AuditPageField => String(key) in PAGE_FIELDS)\n\n /* A table without columns is a blank card; the address stays at least. */\n visible.value = next.length ? next : ['url']\n}\n\nfunction text(value: unknown): string {\n return value === null || value === undefined || value === '' ? '—' : String(value)\n}\n\nasync function load(state: TableState = last): Promise<void> {\n last = state\n\n if (run.value === null) return\n\n loading.value = true\n\n try {\n page.value = await api.pages(run.value.id, {\n ...query.value,\n search: state.search,\n sort: state.sort ? `${state.sort.order === 'desc' ? '-' : ''}${state.sort.key}` : null,\n page: state.page,\n per_page: state.perPage,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nfunction download(): void {\n if (run.value === null) return\n\n window.location.assign(\n api.pagesFile(\n run.value.id,\n { ...query.value, search: last.search },\n columns.value.map((column) => column.key),\n ),\n )\n}\n\nwatch(query, () => void load({ ...last, page: 1 }), { deep: true })\n\nonMounted(async () => {\n try {\n run.value = (await api.latest()).crawled\n\n if (run.value !== null) {\n const checks = await api.checks(run.value.id)\n titles.value = Object.fromEntries(checks.map((row) => [row.id, row.title]))\n }\n } catch (error) {\n toast.danger(message(error))\n } finally {\n ready.value = true\n }\n\n void load()\n})\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"pages\">\n <wx-text v-if=\"ready && run === null\" tone=\"muted\" class=\"wx-audit-pages__none\">{{\n t('page.pages-none')\n }}</wx-text>\n\n <wx-table\n v-else\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n clickable\n hover\n flush\n :loading=\"loading || !ready\"\n :per-page-options=\"[50, 100, 200]\"\n :search-placeholder=\"t('page.search-url')\"\n :filters-count=\"filtersCount\"\n :filters-label=\"panel('filters.title')\"\n :filters-width=\"420\"\n :empty-text=\"t('page.empty')\"\n @state-change=\"load\"\n @row-click=\"(row) => (opened = row.id)\"\n >\n <template #title>\n <wx-text v-if=\"run\" size=\"sm\" tone=\"muted\">{{\n t('page.pages-run', { date: dates.short(run.finished_at) })\n }}</wx-text>\n </template>\n\n <template #actions>\n <wx-popover :title=\"t('page.columns')\" width=\"300\">\n <template #trigger>\n <wx-button size=\"sm\" variant=\"text\" icon=\"sliders\">{{ t('page.columns') }}</wx-button>\n </template>\n <wx-checkbox-group\n :model-value=\"visible\"\n :options=\"columnOptions\"\n size=\"sm\"\n class=\"wx-audit-pages__picker\"\n @update:model-value=\"setColumns\"\n />\n </wx-popover>\n <wx-button size=\"sm\" variant=\"text\" icon=\"download\" :disabled=\"!run\" @click=\"download\">{{\n t('page.export')\n }}</wx-button>\n </template>\n\n <template #filters>\n <div class=\"wx-audit-pages__filters\">\n <wx-select\n :model-value=\"status\"\n :options=\"statusOptions\"\n :placeholder=\"t('page.any-status')\"\n clearable\n @update:model-value=\"status = pick($event)\"\n />\n <wx-select\n :model-value=\"indexable\"\n :options=\"indexableOptions\"\n :placeholder=\"t('page.any-indexable')\"\n clearable\n @update:model-value=\"indexable = pick($event)\"\n />\n <wx-select\n :model-value=\"check\"\n :options=\"checkOptions\"\n :placeholder=\"t('page.any-check')\"\n clearable\n filterable\n @update:model-value=\"check = pick($event)\"\n />\n\n <div v-for=\"(filter, index) in filters\" :key=\"index\" class=\"wx-audit-pages__filter\">\n <wx-select\n :model-value=\"filter.field\"\n :options=\"filterFields\"\n filterable\n size=\"sm\"\n @update:model-value=\"setField(index, $event)\"\n />\n <wx-select\n :model-value=\"filter.op\"\n :options=\"operations(filter.field)\"\n size=\"sm\"\n @update:model-value=\"setOp(index, $event)\"\n />\n <wx-select\n v-if=\"WITH_VALUE.includes(filter.op) && PAGE_FIELDS[filter.field] === 'source'\"\n :model-value=\"filter.value ?? null\"\n :options=\"SOURCES.map((value) => ({ value, label: t(`page.source-${value}`) }))\"\n size=\"sm\"\n @update:model-value=\"setValue(index, pick($event) ?? '')\"\n />\n <wx-input\n v-else-if=\"WITH_VALUE.includes(filter.op)\"\n :model-value=\"filter.value ?? ''\"\n :placeholder=\"t('page.value')\"\n size=\"sm\"\n @update:model-value=\"setValue(index, String($event ?? ''))\"\n />\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"close\"\n :aria-label=\"t('page.remove-filter')\"\n @click=\"removeFilter(index)\"\n />\n </div>\n\n <wx-button size=\"sm\" variant=\"text\" icon=\"plus\" @click=\"addFilter\">{{\n t('page.add-filter')\n }}</wx-button>\n </div>\n </template>\n\n <template v-for=\"key in visible\" :key=\"key\" #[`cell-${key}`]=\"{ row }\">\n <audit-status\n v-if=\"PAGE_FIELDS[key] === 'status' && row[key] !== null\"\n :code=\"Number(row[key])\"\n />\n <wx-text v-else-if=\"PAGE_FIELDS[key] === 'status'\" size=\"sm\" tone=\"danger\">{{\n t('page.status-none')\n }}</wx-text>\n <template v-else-if=\"PAGE_FIELDS[key] === 'bool'\">{{\n row[key] ? t('page.yes') : t('page.no')\n }}</template>\n <template v-else-if=\"PAGE_FIELDS[key] === 'source'\">{{\n t(`page.source-${row[key]}`)\n }}</template>\n <wx-badge v-else-if=\"key === 'issues' && row.issues > 0\" type=\"warning\" size=\"sm\">{{\n row.issues\n }}</wx-badge>\n <span v-else :class=\"{ 'wx-audit-pages__long': PAGE_FIELDS[key] === 'url' }\">{{\n text(row[key])\n }}</span>\n </template>\n </wx-table>\n\n <audit-page-card\n v-if=\"run\"\n :run=\"run.id\"\n :base=\"props.base\"\n :page-id=\"opened\"\n :titles=\"titles\"\n @close=\"opened = null\"\n />\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-pages__none {\n display: block;\n padding: var(--wx-space-24);\n}\n\n.wx-audit-pages__filters {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-pages__filter {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr) auto;\n gap: var(--wx-space-4);\n align-items: center;\n}\n\n.wx-audit-pages__picker {\n max-height: 360px;\n overflow-y: auto;\n}\n\n.wx-audit-pages__long {\n overflow-wrap: anywhere;\n}\n</style>\n"],"names":["STORAGE","props","__props","api","createAuditApi","useAdmin","useAuditMessages","t","useTranslate","panel","message","useErrorText","dates","useDates","run","ref","ready","page","loading","opened","titles","status","indexable","check","filters","last","visible","restore","saved","known","key","PAGE_FIELDS","DEFAULT_COLUMNS","watch","keys","fields","columnOptions","computed","filterFields","COMPUTED_FIELDS","columns","statusOptions","value","indexableOptions","checkOptions","label","filtersCount","complete","query","filter","WITH_VALUE","pick","operations","field","OPERATIONS","op","addFilter","setField","index","at","setOp","setValue","removeFilter","_","setColumns","next","text","load","state","error","toast","download","column","onMounted","checks","row","_createBlock","AuditLayout","_unref","WxText","WxTable","_createTextVNode","_toDisplayString","_createVNode","WxPopover","WxButton","WxCheckboxGroup","_createElementVNode","_hoisted_1","WxSelect","_cache","$event","_openBlock","_createElementBlock","_Fragment","_renderList","SOURCES","WxInput","_withCtx","AuditStatus","WxBadge","_normalizeClass","AuditPageCard"],"mappings":";;;;;iDAsDMA,IAAU;;;;;;AAVhB,UAAMC,IAAQC,GAERC,IAAMC,GAAeC,IAAU;AACrC,IAAAC,GAAA;AAEA,UAAMC,IAAIC,EAAa,YAAY,GAC7BC,IAAQD,EAAa,YAAY,GACjCE,IAAUC,GAAA,GACVC,KAAQC,GAAA,GAIRC,IAAMC,EAAqB,IAAI,GAC/BC,IAAQD,EAAI,EAAK,GACjBE,IAAOF,EAAoC,IAAI,GAC/CG,IAAUH,EAAI,EAAK,GACnBI,IAASJ,EAAmB,IAAI,GAChCK,IAASL,EAA4B,EAAE,GAEvCM,IAASN,EAAmB,IAAI,GAChCO,IAAYP,EAAmB,IAAI,GACnCQ,IAAQR,EAAmB,IAAI,GAC/BS,IAAUT,EAAwB,EAAE;AAC1C,QAAIU,IAAmB,EAAE,MAAM,GAAG,SAAS,IAAI,MAAM,MAAM,QAAQ,GAAA;AAEnE,UAAMC,IAAUX,EAAsBY,IAAS;AAE/C,aAASA,KAA4B;AACnC,UAAI;AACF,cAAMC,IAAiB,KAAK,MAAM,OAAO,aAAa,QAAQ5B,CAAO,KAAK,MAAM;AAEhF,YAAI,MAAM,QAAQ4B,CAAK,GAAG;AACxB,gBAAMC,IAAQD,EAAM,OAAO,CAACE,MAA+BA,KAAOC,CAAW;AAE7E,cAAIF,EAAM,OAAQ,QAAOA;AAAA,QAC3B;AAAA,MACF,QAAQ;AAAA,MAER;AAEA,aAAO,CAAC,GAAGG,EAAe;AAAA,IAC5B;AAEA,IAAAC,EAAMP,GAAS,CAACQ,MAAS;AACvB,UAAI;AACF,eAAO,aAAa,QAAQlC,GAAS,KAAK,UAAUkC,CAAI,CAAC;AAAA,MAC3D,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAED,UAAMC,IAAS,OAAO,KAAKJ,CAAW,GAEhCK,KAAgBC;AAAA,MAAS,MAC7BF,EAAO,IAAI,CAACL,OAAS,EAAE,OAAOA,GAAK,OAAOvB,EAAE,cAAcuB,CAAG,EAAE,IAAI;AAAA,IAAA,GAG/DQ,KAAeD;AAAA,MAAS,MAC5BF,EACG,OAAO,CAACL,MAAQ,CAACS,EAAgB,SAAST,CAAG,CAAC,EAC9C,IAAI,CAACA,OAAS,EAAE,OAAOA,GAAK,OAAOvB,EAAE,cAAcuB,CAAG,EAAE,IAAI;AAAA,IAAA,GAG3DU,IAAUH;AAAA,MAAsC;AAAA;AAAA,QAEpDF,EACG,OAAO,CAACL,MAAQJ,EAAQ,MAAM,SAASI,CAAG,CAAC,EAC3C,IAAI,CAACA,OAAS;AAAA,UACb,KAAAA;AAAA,UACA,OAAOvB,EAAE,cAAcuB,CAAG,EAAE;AAAA,UAC5B,UAAU,CAACS,EAAgB,SAAST,CAAG;AAAA,UACvC,UAAUC,EAAYD,CAAG,MAAM,SAASC,EAAYD,CAAG,MAAM,SAAS,MAAM;AAAA,UAC5E,OAAOC,EAAYD,CAAG,MAAM,WAAW,UAAU;AAAA,QAAA,EACjD;AAAA;AAAA,IAAA,GAGAW,KAAgBJ,EAAS,MAAM;AAAA,MACnC,GAAG,CAAC,OAAO,OAAO,OAAO,KAAK,EAAE,IAAI,CAACK,OAAW,EAAE,OAAAA,GAAO,OAAOA,IAAQ;AAAA,MACxE,EAAE,OAAO,QAAQ,OAAOnC,EAAE,kBAAkB,EAAA;AAAA,IAAE,CAC/C,GAEKoC,KAAmBN,EAAS,MAAM;AAAA,MACtC,EAAE,OAAO,KAAK,OAAO9B,EAAE,oBAAoB,EAAA;AAAA,MAC3C,EAAE,OAAO,KAAK,OAAOA,EAAE,mBAAmB,EAAA;AAAA,IAAE,CAC7C,GAEKqC,KAAeP;AAAA,MAAS,MAC5B,OAAO,QAAQjB,EAAO,KAAK,EAAE,IAAI,CAAC,CAACsB,GAAOG,CAAK,OAAO,EAAE,OAAAH,GAAO,OAAAG,IAAQ;AAAA,IAAA,GAGnEC,KAAeT;AAAA,MACnB,MACE,CAAChB,EAAO,OAAOC,EAAU,OAAOC,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,SAC7DC,EAAQ,MAAM,OAAOuB,CAAQ,EAAE;AAAA,IAAA,GAG7BC,IAAQX,EAAyB,OAAO;AAAA,MAC5C,QAAQhB,EAAO;AAAA,MACf,WAAWC,EAAU,UAAU,OAAO,OAAOA,EAAU,UAAU;AAAA,MACjE,OAAOC,EAAM;AAAA,MACb,SAASC,EAAQ,MAAM,OAAOuB,CAAQ;AAAA,IAAA,EACtC;AAEF,aAASA,EAASE,GAAmC;AACnD,aAAO,CAACC,EAAW,SAASD,EAAO,EAAE,MAAMA,EAAO,SAAS,IAAI,KAAA,MAAW;AAAA,IAC5E;AAEA,aAASE,EAAKT,GAAsE;AAClF,aAAO,OAAOA,KAAU,YAAYA,MAAU,KAAKA,IAAQ;AAAA,IAC7D;AAEA,aAASU,GAAWC,GAAuB;AACzC,aAAOC,EAAWvB,EAAYsB,CAAK,CAAC,EAAE,IAAI,CAACE,OAAQ,EAAE,OAAOA,GAAI,OAAOhD,EAAE,WAAWgD,CAAE,EAAE,IAAI;AAAA,IAC9F;AAEA,aAASC,KAAkB;AACzB,MAAAhC,EAAQ,QAAQ,CAAC,GAAGA,EAAQ,OAAO,EAAE,OAAO,SAAS,IAAI,SAAS;AAAA,IACpE;AAEA,aAASiC,GAASC,GAAehB,GAA6D;AAC5F,YAAMW,IAAQF,EAAKT,CAAK;AAExB,MAAKW,MAEL7B,EAAQ,QAAQA,EAAQ,MAAM;AAAA,QAAI,CAACyB,GAAQU,MACzCA,MAAOD,IAAQ,EAAE,OAAAL,GAAO,IAAIC,EAAWvB,EAAYsB,CAAK,CAAC,EAAE,CAAC,GAAI,OAAO,OAAOJ;AAAA,MAAA;AAAA,IAElF;AAEA,aAASW,GAAMF,GAAehB,GAA6D;AACzF,YAAMa,IAAKJ,EAAKT,CAAK;AAErB,MAAIa,MACF/B,EAAQ,QAAQA,EAAQ,MAAM,IAAI,CAACyB,GAAQU,MAAQA,MAAOD,IAAQ,EAAE,GAAGT,GAAQ,IAAAM,EAAA,IAAON,CAAO;AAAA,IACjG;AAEA,aAASY,EAASH,GAAehB,GAAqB;AACpD,MAAAlB,EAAQ,QAAQA,EAAQ,MAAM,IAAI,CAACyB,GAAQU,MAAQA,MAAOD,IAAQ,EAAE,GAAGT,GAAQ,OAAAP,EAAA,IAAUO,CAAO;AAAA,IAClG;AAEA,aAASa,GAAaJ,GAAqB;AACzC,MAAAlC,EAAQ,QAAQA,EAAQ,MAAM,OAAO,CAACuC,GAAGJ,MAAOA,MAAOD,CAAK;AAAA,IAC9D;AAEA,aAASM,GAAW9B,GAAuB;AACzC,YAAM+B,IAAO/B,EAAK,OAAO,CAACJ,MAA+B,OAAOA,CAAG,KAAKC,CAAW;AAGnF,MAAAL,EAAQ,QAAQuC,EAAK,SAASA,IAAO,CAAC,KAAK;AAAA,IAC7C;AAEA,aAASC,GAAKxB,GAAwB;AACpC,aAAOA,KAAU,QAA+BA,MAAU,KAAK,MAAM,OAAOA,CAAK;AAAA,IACnF;AAEA,mBAAeyB,EAAKC,IAAoB3C,GAAqB;AAG3D,UAFAA,IAAO2C,GAEHtD,EAAI,UAAU,MAElB;AAAA,QAAAI,EAAQ,QAAQ;AAEhB,YAAI;AACF,UAAAD,EAAK,QAAQ,MAAMd,EAAI,MAAMW,EAAI,MAAM,IAAI;AAAA,YACzC,GAAGkC,EAAM;AAAA,YACT,QAAQoB,EAAM;AAAA,YACd,MAAMA,EAAM,OAAO,GAAGA,EAAM,KAAK,UAAU,SAAS,MAAM,EAAE,GAAGA,EAAM,KAAK,GAAG,KAAK;AAAA,YAClF,MAAMA,EAAM;AAAA,YACZ,UAAUA,EAAM;AAAA,UAAA,CACjB;AAAA,QACH,SAASC,GAAO;AACd,UAAAC,EAAM,OAAO5D,EAAQ2D,CAAK,CAAC;AAAA,QAC7B,UAAA;AACE,UAAAnD,EAAQ,QAAQ;AAAA,QAClB;AAAA;AAAA,IACF;AAEA,aAASqD,KAAiB;AACxB,MAAIzD,EAAI,UAAU,QAElB,OAAO,SAAS;AAAA,QACdX,EAAI;AAAA,UACFW,EAAI,MAAM;AAAA,UACV,EAAE,GAAGkC,EAAM,OAAO,QAAQvB,EAAK,OAAA;AAAA,UAC/Be,EAAQ,MAAM,IAAI,CAACgC,MAAWA,EAAO,GAAG;AAAA,QAAA;AAAA,MAC1C;AAAA,IAEJ;AAEA,WAAAvC,EAAMe,GAAO;AAAM,MAAKmB,EAAK,EAAE,GAAG1C,GAAM,MAAM,EAAA,CAAG;AAAA,OAAG,EAAE,MAAM,IAAM,GAElEgD,GAAU,YAAY;AACpB,UAAI;AAGF,YAFA3D,EAAI,SAAS,MAAMX,EAAI,OAAA,GAAU,SAE7BW,EAAI,UAAU,MAAM;AACtB,gBAAM4D,IAAS,MAAMvE,EAAI,OAAOW,EAAI,MAAM,EAAE;AAC5C,UAAAM,EAAO,QAAQ,OAAO,YAAYsD,EAAO,IAAI,CAACC,MAAQ,CAACA,EAAI,IAAIA,EAAI,KAAK,CAAC,CAAC;AAAA,QAC5E;AAAA,MACF,SAASN,GAAO;AACd,QAAAC,EAAM,OAAO5D,EAAQ2D,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAArD,EAAM,QAAQ;AAAA,MAChB;AAEA,MAAKmD,EAAA;AAAA,IACP,CAAC,mBAICS,EAmJeC,IAAA;AAAA,MAnJA,MAAM5E,EAAM;AAAA,MAAM,SAAQ;AAAA,IAAA;iBACvC,MAEY;AAAA,QAFGe,EAAA,SAASF,EAAA,UAAG,aAA3B8D,EAEYE,EAAAC,CAAA,GAAA;AAAA;UAF0B,MAAK;AAAA,UAAQ,OAAM;AAAA,QAAA;qBAAuB,MAE9E;AAAA,gBADAD,EAAAvE,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;oBAGHqE,EAoIWE,EAAAE,EAAA,GAAA;AAAA;UAlIR,MAAM/D,EAAA;AAAA,UACN,SAASuB,EAAA;AAAA,UACV,WAAQ;AAAA,UACR,YAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACC,SAAStB,EAAA,SAAO,CAAKF,EAAA;AAAA,UACrB,oBAAkB,CAAA,IAAA,KAAA,GAAA;AAAA,UAClB,sBAAoB8D,EAAAvE,CAAA,EAAC,iBAAA;AAAA,UACrB,iBAAeuC,GAAA;AAAA,UACf,iBAAegC,EAAArE,CAAA,EAAK,eAAA;AAAA,UACpB,iBAAe;AAAA,UACf,cAAYqE,EAAAvE,CAAA,EAAC,YAAA;AAAA,UACb,eAAc4D;AAAA,UACd,6BAAYQ,MAASxD,UAASwD,EAAI;AAAA,QAAA;UAExB,SACT,MAEY;AAAA,YAFG7D,EAAA,cAAf8D,EAEYE,EAAAC,CAAA,GAAA;AAAA;cAFQ,MAAK;AAAA,cAAK,MAAK;AAAA,YAAA;yBAAQ,MAEzC;AAAA,gBADAE,EAAAC,EAAAJ,EAAAvE,CAAA,4BAA4BuE,EAAAlE,EAAA,EAAM,MAAME,EAAA,MAAI,WAAW,GAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAIhD,WACT,MAWa;AAAA,YAXbqE,EAWaL,EAAAM,EAAA,GAAA;AAAA,cAXA,OAAON,EAAAvE,CAAA,EAAC,cAAA;AAAA,cAAkB,OAAM;AAAA,YAAA;cAChC,WACT,MAAsF;AAAA,gBAAtF4E,EAAsFL,EAAAO,CAAA,GAAA;AAAA,kBAA3E,MAAK;AAAA,kBAAK,SAAQ;AAAA,kBAAO,MAAK;AAAA,gBAAA;6BAAU,MAAuB;AAAA,wBAApBP,EAAAvE,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;yBAEzD,MAME;AAAA,gBANF4E,EAMEL,EAAAQ,EAAA,GAAA;AAAA,kBALC,eAAa5D,EAAA;AAAA,kBACb,SAASU,GAAA;AAAA,kBACV,MAAK;AAAA,kBACL,OAAM;AAAA,kBACL,uBAAoB4B;AAAA,gBAAA;;;;YAGzBmB,EAEcL,EAAAO,CAAA,GAAA;AAAA,cAFH,MAAK;AAAA,cAAK,SAAQ;AAAA,cAAO,MAAK;AAAA,cAAY,WAAWvE,EAAA;AAAA,cAAM,SAAOyD;AAAA,YAAA;yBAAU,MAErF;AAAA,oBADAO,EAAAvE,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAIM,WACT,MAgEM;AAAA,YAhENgF,GAgEM,OAhENC,IAgEM;AAAA,cA/DJL,EAMEL,EAAAW,CAAA,GAAA;AAAA,gBALC,eAAapE,EAAA;AAAA,gBACb,SAASoB,GAAA;AAAA,gBACT,aAAaqC,EAAAvE,CAAA,EAAC,iBAAA;AAAA,gBACf,WAAA;AAAA,gBACC,uBAAkBmF,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEtE,EAAA,QAAS8B,EAAKwC,CAAM;AAAA,cAAA;cAE3CR,EAMEL,EAAAW,CAAA,GAAA;AAAA,gBALC,eAAanE,EAAA;AAAA,gBACb,SAASqB,GAAA;AAAA,gBACT,aAAamC,EAAAvE,CAAA,EAAC,oBAAA;AAAA,gBACf,WAAA;AAAA,gBACC,uBAAkBmF,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAErE,EAAA,QAAY6B,EAAKwC,CAAM;AAAA,cAAA;cAE9CR,EAOEL,EAAAW,CAAA,GAAA;AAAA,gBANC,eAAalE,EAAA;AAAA,gBACb,SAASqB,GAAA;AAAA,gBACT,aAAakC,EAAAvE,CAAA,EAAC,gBAAA;AAAA,gBACf,WAAA;AAAA,gBACA,YAAA;AAAA,gBACC,uBAAkBmF,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEpE,EAAA,QAAQ4B,EAAKwC,CAAM;AAAA,cAAA;eAG1CC,EAAA,EAAA,GAAAC,EAmCMC,GAAA,MAAAC,EAnCyBvE,EAAA,OAAO,CAAzByB,GAAQS,YAArBmC,EAmCM,OAAA;AAAA,gBAnCmC,KAAKnC;AAAA,gBAAO,OAAM;AAAA,cAAA;gBACzDyB,EAMEL,EAAAW,CAAA,GAAA;AAAA,kBALC,eAAaxC,EAAO;AAAA,kBACpB,SAASX,GAAA;AAAA,kBACV,YAAA;AAAA,kBACA,MAAK;AAAA,kBACJ,uBAAkB,CAAAqD,MAAElC,GAASC,GAAOiC,CAAM;AAAA,gBAAA;gBAE7CR,EAKEL,EAAAW,CAAA,GAAA;AAAA,kBAJC,eAAaxC,EAAO;AAAA,kBACpB,SAASG,GAAWH,EAAO,KAAK;AAAA,kBACjC,MAAK;AAAA,kBACJ,uBAAkB,CAAA0C,MAAE/B,GAAMF,GAAOiC,CAAM;AAAA,gBAAA;gBAGlCb,EAAA5B,CAAA,EAAW,SAASD,EAAO,EAAE,KAAK6B,EAAA/C,CAAA,EAAYkB,EAAO,KAAK,MAAA,iBADlE2B,EAMEE,EAAAW,CAAA,GAAA;AAAA;kBAJC,eAAaxC,EAAO,SAAK;AAAA,kBACzB,SAAS6B,EAAAkB,EAAA,EAAQ,IAAG,CAAEtD,OAAK,EAAQ,OAAAA,GAAK,OAASoC,EAAAvE,CAAA,EAAC,eAAgBmC,CAAK,EAAA,IAAA;AAAA,kBACxE,MAAK;AAAA,kBACJ,8BAAoBmB,EAASH,GAAOP,EAAKwC,CAAM,KAAA,EAAA;AAAA,gBAAA,kEAGrCb,EAAA5B,CAAA,EAAW,SAASD,EAAO,EAAE,UAD1C2B,EAMEE,EAAAmB,EAAA,GAAA;AAAA;kBAJC,eAAahD,EAAO,SAAK;AAAA,kBACzB,aAAa6B,EAAAvE,CAAA,EAAC,YAAA;AAAA,kBACf,MAAK;AAAA,kBACJ,8BAAoBsD,EAASH,GAAO,OAAOiC,KAAM,EAAA,CAAA;AAAA,gBAAA;gBAEpDR,EAMEL,EAAAO,CAAA,GAAA;AAAA,kBALA,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACJ,cAAYP,EAAAvE,CAAA,EAAC,oBAAA;AAAA,kBACb,SAAK,CAAAoF,MAAE7B,GAAaJ,CAAK;AAAA,gBAAA;;cAI9ByB,EAEcL,EAAAO,CAAA,GAAA;AAAA,gBAFH,MAAK;AAAA,gBAAK,SAAQ;AAAA,gBAAO,MAAK;AAAA,gBAAQ,SAAO7B;AAAA,cAAA;2BAAW,MAEjE;AAAA,sBADAsB,EAAAvE,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;UAKiBwF,EAAArE,EAAA,QAAPI;0BAAoCA,CAAG;AAAA,YACtD,IAAAoE,EAAA,CAGE,EAJ4D,KAAAvB,QAAG;AAAA,cAEzDG,EAAA/C,CAAA,EAAYD,CAAG,MAAA,YAAkB6C,EAAI7C,CAAG,MAAA,aADhD8C,EAGEuB,IAAA;AAAA;gBADC,MAAM,OAAOxB,EAAI7C,CAAG,CAAA;AAAA,cAAA,yBAEHgD,EAAA/C,CAAA,EAAYD,CAAG,MAAA,iBAAnC8C,EAEYE,EAAAC,CAAA,GAAA;AAAA;gBAFuC,MAAK;AAAA,gBAAK,MAAK;AAAA,cAAA;2BAAS,MAEzE;AAAA,sBADAD,EAAAvE,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;oBAEkBuE,EAAA/C,CAAA,EAAYD,CAAG,MAAA,eAApC+D,EAEaC,GAAA,EAAA,KAAA,KAAA;AAAA,gBADXb,EAAAC,EAAAP,EAAI7C,CAAG,IAAIgD,EAAAvE,CAAA,gBAAgBuE,EAAAvE,CAAA,EAAC,SAAA,CAAA,GAAA,CAAA;AAAA,cAAA,UAETuE,EAAA/C,CAAA,EAAYD,CAAG,MAAA,iBAApC+D,EAEaC,GAAA,EAAA,KAAA,KAAA;AAAA,oBADXhB,EAAAvE,CAAA,EAAC,eAAgBoE,EAAI7C,CAAG,CAAA,EAAA,CAAA,GAAA,CAAA;AAAA,cAAA,UAELA,MAAG,YAAiB6C,EAAI,SAAM,UAAnDC,EAEaE,EAAAsB,EAAA,GAAA;AAAA;gBAF4C,MAAK;AAAA,gBAAU,MAAK;AAAA,cAAA;2BAAK,MAEhF;AAAA,kBADAnB,EAAAC,EAAAP,EAAI,MAAM,GAAA,CAAA;AAAA,gBAAA;;gCAEZkB,EAES,QAAA;AAAA;gBAFK,OAAKQ,GAAA,EAAA,wBAA4BvB,EAAA/C,CAAA,EAAYD,CAAG,MAAA,MAAA,CAAA;AAAA,cAAA,KAC5DoC,GAAKS,EAAI7C,CAAG,CAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;QAMVhB,EAAA,cADR8D,EAOE0B,IAAA;AAAA;UALC,KAAKxF,EAAA,MAAI;AAAA,UACT,MAAMb,EAAM;AAAA,UACZ,WAASkB,EAAA;AAAA,UACT,QAAQC,EAAA;AAAA,UACR,gCAAOD,EAAA,QAAM;AAAA,QAAA;;;;;;"}
|
|
@@ -2,8 +2,8 @@ import { defineComponent as L, ref as m, computed as $, watch as F, openBlock as
|
|
|
2
2
|
import { useRoute as oe } from "vue-router";
|
|
3
3
|
import { useAdmin as j, useTranslate as G, useErrorText as H, WxDate as S } from "@webx-ui/module-admin";
|
|
4
4
|
import { WxSegmented as ue, WxText as z, WxSkeleton as ie, WxLink as ce, WxButton as de, confirm as pe, toast as N, WxCard as R, WxAlert as U, WxTable as q, WxBadge as E } from "@webx-ui/core";
|
|
5
|
-
import { c as J, u as O, e as me, _ as Q } from "./index-
|
|
6
|
-
import { _ as ge } from "./AuditLayout.vue_vue_type_script_setup_true_lang-
|
|
5
|
+
import { c as J, u as O, e as me, _ as Q } from "./index-BxS_t2W2.js";
|
|
6
|
+
import { _ as ge } from "./AuditLayout.vue_vue_type_script_setup_true_lang-BIj7GvJb.js";
|
|
7
7
|
const fe = { class: "wx-audit-compare" }, ve = /* @__PURE__ */ L({
|
|
8
8
|
__name: "AuditCompareIssues",
|
|
9
9
|
props: {
|
|
@@ -372,4 +372,4 @@ const fe = { class: "wx-audit-compare" }, ve = /* @__PURE__ */ L({
|
|
|
372
372
|
export {
|
|
373
373
|
Ce as default
|
|
374
374
|
};
|
|
375
|
-
//# sourceMappingURL=AuditRunsPage-
|
|
375
|
+
//# sourceMappingURL=AuditRunsPage-D9hzlpID.js.map
|