@webx-ui/module-catalog 0.8.9 → 0.9.0
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/CategoriesPage-B6GBTzvN.js +279 -0
- package/dist/CategoriesPage-B6GBTzvN.js.map +1 -0
- package/dist/CategoryEditorPage-y6EFmOof.js +232 -0
- package/dist/CategoryEditorPage-y6EFmOof.js.map +1 -0
- package/dist/DeletedPage-TGTyQbzn.js +214 -0
- package/dist/DeletedPage-TGTyQbzn.js.map +1 -0
- package/dist/ExchangeImportPage-C6cSg7Cr.js +603 -0
- package/dist/ExchangeImportPage-C6cSg7Cr.js.map +1 -0
- package/dist/ExchangePage-9RrRcSiS.js +544 -0
- package/dist/ExchangePage-9RrRcSiS.js.map +1 -0
- package/dist/ExchangeProfilePage-BUnh9_D7.js +321 -0
- package/dist/ExchangeProfilePage-BUnh9_D7.js.map +1 -0
- package/dist/ExchangeProfilesPage-T6G3HHD8.js +180 -0
- package/dist/ExchangeProfilesPage-T6G3HHD8.js.map +1 -0
- package/dist/ProductEditorPage-Bfp6ZV3d.js +262 -0
- package/dist/ProductEditorPage-Bfp6ZV3d.js.map +1 -0
- package/dist/ProductsPage-BBmw9W4m.js +963 -0
- package/dist/ProductsPage-BBmw9W4m.js.map +1 -0
- package/dist/index-BTEbHnJ5.js +2571 -0
- package/dist/index-BTEbHnJ5.js.map +1 -0
- package/dist/index.d.ts +67 -9
- package/dist/index.js +46 -6056
- package/dist/index.js.map +1 -1
- package/dist/paths-DvfRnXtl.js +15 -0
- package/dist/paths-DvfRnXtl.js.map +1 -0
- package/dist/style.css +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExchangePage-9RrRcSiS.js","sources":["../src/ExchangeJournalDialog.vue","../src/exchangeWords.ts","../src/ExchangeRunDetail.vue","../src/ExchangePage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { RouterLink } from 'vue-router'\nimport {\n createHistoryApi,\n useAdmin,\n useErrorText,\n useTranslate,\n type HistoryEntry,\n} from '@webx-ui/module-admin'\nimport {\n toast,\n useModal,\n WxButton,\n WxDialog,\n WxEmpty,\n WxLink,\n WxSkeleton,\n WxText,\n} from '@webx-ui/core'\nimport { useCatalogMessages } from './i18n'\n\n/**\n * What an import changed, as the journal has it (§1 п. 12 of the exchange spec): the run's rows,\n * one per product, with the fields each got. The record's own history links back to the run;\n * this is the other direction — from the run to the records.\n */\nconst props = defineProps<{ runId: number; base: string }>()\n\nconst { open, dismiss } = useModal<void>()\n\nconst admin = useAdmin()\nconst history = createHistoryApi(admin, 'catalog.product', 0)\nuseCatalogMessages()\n\nconst t = useTranslate('webx-catalog')\nconst message = useErrorText()\n\nconst rows = ref<HistoryEntry[] | null>(null)\nconst page = ref(1)\nconst last = ref(1)\nconst loading = ref(false)\n\nasync function load(next: number): Promise<void> {\n loading.value = true\n\n try {\n const answer = await history.run(props.runId, next)\n\n rows.value = next === 1 ? answer.rows.data : [...(rows.value ?? []), ...answer.rows.data]\n page.value = answer.rows.current_page\n last.value = answer.rows.last_page\n } catch (error) {\n toast.danger(message(error))\n rows.value ??= []\n } finally {\n loading.value = false\n }\n}\n\nonMounted(() => void load(1))\n\nfunction fields(row: HistoryEntry): string {\n return row.changes.map((change) => change.label).join(', ')\n}\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"t('panel.exchange-journal-title')\" :width=\"560\">\n <wx-skeleton v-if=\"rows === null\" :rows=\"5\" />\n <wx-empty v-else-if=\"rows.length === 0\" :description=\"t('panel.exchange-journal-empty')\" />\n <ul v-else class=\"wx-catalog-journal\">\n <li v-for=\"row in rows\" :key=\"row.id\" class=\"wx-catalog-journal__row\">\n <wx-link\n v-if=\"row.subject.id !== null\"\n :as=\"RouterLink\"\n :to=\"`${base}/products/${row.subject.id}`\"\n class=\"wx-catalog-journal__subject\"\n @click=\"dismiss()\"\n >\n #{{ row.subject.id }}\n </wx-link>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-catalog-journal__fields\">\n {{ fields(row) }}\n </wx-text>\n </li>\n </ul>\n\n <template v-if=\"rows !== null && page < last\" #footer>\n <wx-button variant=\"outline\" :loading=\"loading\" @click=\"load(page + 1)\">\n {{ t('panel.exchange-journal-more') }}\n </wx-button>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-catalog-journal {\n display: grid;\n gap: var(--wx-space-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-catalog-journal__row {\n display: flex;\n align-items: baseline;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-catalog-journal__subject {\n flex: none;\n font-variant-numeric: tabular-nums;\n}\n\n.wx-catalog-journal__fields {\n min-width: 0;\n}\n</style>\n","import type { BadgeType } from '@webx-ui/core'\nimport type { ExchangeRun } from './exchange'\n\ntype Translate = (key: string, params?: Record<string, string | number>) => string\n\nexport interface RunTotal {\n key: string\n text: string\n tone: 'success' | 'danger' | 'muted' | 'default'\n}\n\n/**\n * What a run did, as short lines: an import by its counters — only the ones that are not zero —\n * an export by the products it wrote. Counted at the end of each line (\"Created: 12\"), because\n * the panel has no plurals (CLAUDE.md §4).\n */\nexport function runTotals(run: ExchangeRun, t: Translate): RunTotal[] {\n if (run.direction === 'export') {\n return run.rows_done > 0 || run.status === 'done'\n ? [\n {\n key: 'exported',\n text: t('panel.exchange-exported', { count: run.rows_done }),\n tone: 'default',\n },\n ]\n : []\n }\n\n const lines: RunTotal[] = []\n const add = (key: string, count: number, tone: RunTotal['tone']) => {\n if (count > 0) lines.push({ key, text: t(`panel.exchange-${key}`, { count }), tone })\n }\n\n add('created', run.created, 'success')\n add('updated', run.updated, 'default')\n add('skipped', run.skipped, 'muted')\n add('absent', run.absent, 'default')\n if (run.failed > 0) {\n lines.push({\n key: 'failed',\n text: t('panel.exchange-errors-count', { count: run.failed }),\n tone: 'danger',\n })\n }\n\n return lines\n}\n\nconst TONES: Record<ExchangeRun['status'], BadgeType> = {\n queued: 'default',\n running: 'info',\n done: 'success',\n stopped: 'warning',\n failed: 'danger',\n}\n\n/** The badge of a run's status. A finished import with errors is done, and says so in amber. */\nexport function runStatus(run: ExchangeRun, t: Translate): { label: string; type: BadgeType } {\n const type = run.status === 'done' && run.failed > 0 ? 'warning' : TONES[run.status]\n\n return { label: t(`panel.exchange-status-${run.status}`), type }\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n createModal,\n toast,\n WxAlert,\n WxButton,\n WxTable,\n WxText,\n type TableColumn,\n} from '@webx-ui/core'\nimport ExchangeJournalDialog from './ExchangeJournalDialog.vue'\nimport { createExchangeApi, isRunning, type ExchangeRun, type ExchangeRunError } from './exchange'\nimport { useCatalogMessages } from './i18n'\nimport { runTotals } from './exchangeWords'\n\n/**\n * A run opened in the list of «Exchange» (§8.1): what it read and who started it, its totals,\n * the first hundred errors with all of them a click away as CSV, the finished file of an\n * export, and the run of the journal that holds what an import changed.\n *\n * The errors are asked for again when the run's count of them moves, which is how a run still\n * going fills its table while it is open.\n */\nconst props = defineProps<{ run: ExchangeRun; base: string; profileName?: string | null }>()\n\nconst admin = useAdmin()\nconst api = createExchangeApi(admin)\nuseCatalogMessages()\n\nconst t = useTranslate('webx-catalog')\nconst message = useErrorText()\n\nconst journal = createModal<void, { runId: number; base: string }>(ExchangeJournalDialog)\n\nconst errors = ref<ExchangeRunError[]>([])\nconst more = ref(false)\nconst loading = ref(false)\n\nasync function loadErrors(): Promise<void> {\n if (props.run.failed === 0) {\n errors.value = []\n more.value = false\n\n return\n }\n\n loading.value = true\n\n try {\n const page = await api.errors(props.run.id)\n\n errors.value = page.data\n more.value = page.last_page > 1\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch(\n () => [props.run.id, props.run.failed],\n () => void loadErrors(),\n { immediate: true },\n)\n\nconst totals = computed(() => runTotals(props.run, t))\n\nconst columns = computed<TableColumn<ExchangeRunError>[]>(() => [\n { key: 'row', label: t('panel.exchange-error-row'), width: 72, align: 'right' },\n { key: 'column', label: t('panel.exchange-error-column'), width: 150 },\n { key: 'value', label: t('panel.exchange-error-value'), width: 180, hideBelow: 560 },\n { key: 'message', label: t('panel.exchange-error-message'), minWidth: 200 },\n])\n\nconst fileGone = computed(\n () =>\n props.run.direction === 'export' && props.run.status === 'done' && props.run.file_url === null,\n)\n</script>\n\n<template>\n <div class=\"wx-catalog-run\">\n <dl class=\"wx-catalog-run__facts\">\n <div v-if=\"run.source\" class=\"wx-catalog-run__fact\">\n <dt>{{ t('panel.exchange-source') }}</dt>\n <dd class=\"wx-catalog-run__source\">{{ run.source }}</dd>\n </div>\n <div v-if=\"profileName\" class=\"wx-catalog-run__fact\">\n <dt>{{ t('panel.exchange-profile') }}</dt>\n <dd>{{ profileName }}</dd>\n </div>\n <div v-if=\"run.admin_name\" class=\"wx-catalog-run__fact\">\n <dt>{{ t('panel.exchange-who') }}</dt>\n <dd>{{ run.admin_name }}</dd>\n </div>\n <div v-if=\"run.started_at\" class=\"wx-catalog-run__fact\">\n <dt>{{ t('panel.exchange-column-started') }}</dt>\n <dd><wx-date :value=\"run.started_at\" /></dd>\n </div>\n </dl>\n\n <wx-alert\n v-if=\"run.dry_run && !isRunning(run)\"\n type=\"info\"\n :title=\"t('panel.exchange-check-help')\"\n />\n <wx-alert\n v-if=\"run.status === 'stopped'\"\n type=\"warning\"\n :title=\"t('panel.exchange-stopped-help')\"\n />\n <wx-alert\n v-if=\"run.status === 'failed'\"\n type=\"danger\"\n :title=\"t('panel.exchange-failed-help')\"\n />\n\n <ul v-if=\"totals.length > 0\" class=\"wx-catalog-run__totals\">\n <li v-for=\"total in totals\" :key=\"total.key\" :class=\"`is-${total.tone}`\">\n {{ total.text }}\n </li>\n </ul>\n\n <div class=\"wx-catalog-run__actions\">\n <wx-button\n v-if=\"run.direction === 'export' && run.file_url\"\n size=\"sm\"\n type=\"primary\"\n icon=\"download\"\n :href=\"api.file(run.id)\"\n >\n {{ t('panel.exchange-file') }}\n </wx-button>\n <wx-text v-else-if=\"fileGone\" size=\"sm\" tone=\"muted\">\n {{ t('panel.exchange-file-gone') }}\n </wx-text>\n <wx-button\n v-if=\"run.history_id !== null && !run.dry_run\"\n size=\"sm\"\n variant=\"outline\"\n icon=\"clock\"\n @click=\"journal({ runId: run.history_id!, base })\"\n >\n {{ t('panel.exchange-journal') }}\n </wx-button>\n <wx-button\n v-if=\"run.failed > 0\"\n size=\"sm\"\n variant=\"outline\"\n icon=\"download\"\n :href=\"api.errorsFile(run.id)\"\n >\n {{ t('panel.exchange-errors-csv') }}\n </wx-button>\n </div>\n\n <template v-if=\"run.failed > 0\">\n <wx-table\n :data=\"errors\"\n :columns=\"columns\"\n :loading=\"loading\"\n :clickable=\"false\"\n :hover=\"false\"\n :pagination=\"false\"\n :cards-below=\"420\"\n :max-height=\"360\"\n layout=\"fixed\"\n size=\"sm\"\n bordered\n :aria-label=\"t('panel.exchange-errors')\"\n >\n <template #cell-column=\"{ row }\">\n <code v-if=\"row.column\" class=\"wx-catalog-run__code\">{{ row.column }}</code>\n <wx-text v-else size=\"sm\" tone=\"muted\">{{ t('panel.exchange-error-whole-row') }}</wx-text>\n </template>\n <template #cell-value=\"{ row }\">\n <span class=\"wx-catalog-run__value\" :title=\"row.value ?? undefined\">{{ row.value }}</span>\n </template>\n </wx-table>\n <wx-text v-if=\"more\" size=\"sm\" tone=\"muted\">{{ t('panel.exchange-errors-more') }}</wx-text>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-catalog-run {\n display: grid;\n gap: var(--wx-space-12);\n min-width: 0;\n padding: var(--wx-space-4) 0 var(--wx-space-8);\n}\n\n.wx-catalog-run__facts {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-8) var(--wx-space-24);\n margin: 0;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-catalog-run__fact {\n display: grid;\n gap: var(--wx-space-2);\n min-width: 0;\n}\n\n.wx-catalog-run__fact dt {\n color: var(--wx-text-muted);\n}\n\n.wx-catalog-run__fact dd {\n margin: 0;\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.wx-catalog-run__source {\n font-family: var(--wx-font-family-mono);\n}\n\n.wx-catalog-run__totals {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-8) var(--wx-space-16);\n margin: 0;\n padding: 0;\n list-style: none;\n font-size: var(--wx-font-size-sm);\n font-variant-numeric: tabular-nums;\n}\n\n.wx-catalog-run__totals .is-success {\n color: var(--wx-color-success);\n}\n\n.wx-catalog-run__totals .is-danger {\n color: var(--wx-color-danger);\n}\n\n.wx-catalog-run__totals .is-muted {\n color: var(--wx-text-muted);\n}\n\n.wx-catalog-run__actions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n}\n\n.wx-catalog-run__actions:empty {\n display: none;\n}\n\n.wx-catalog-run__code {\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-catalog-run__value {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxDate,\n WxListScreen,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n createModal,\n toast,\n WxBadge,\n WxIcon,\n WxProgress,\n WxTable,\n WxText,\n type Paginated,\n type RowKey,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport ExchangeExportDialog from './ExchangeExportDialog.vue'\nimport ExchangeRunDetail from './ExchangeRunDetail.vue'\nimport {\n createExchangeApi,\n isRunning,\n useRunPolling,\n type ExchangeProfile,\n type ExchangeRun,\n} from './exchange'\nimport { runStatus, runTotals } from './exchangeWords'\nimport { useCatalogMessages } from './i18n'\nimport type { BulkSelection } from './types'\n\n/**\n * «Exchange» (§8.1 of the exchange spec): every import and export with what it did, newest first,\n * and the two ways in — the import wizard and the export dialog. A row opens in place: its\n * totals, its errors, its file, its run of the journal.\n *\n * A run that is still going is asked after every two seconds, the way the bulk actions are; the\n * row moves on its own while the list is open. A run started elsewhere — the wizard, the export\n * of the product list — arrives here as `?run=<id>`, opened and followed.\n */\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/catalog' })\n\nconst context = useAdmin()\nconst api = createExchangeApi(context)\nconst route = useRoute()\nconst router = useRouter()\nuseCatalogMessages()\n\nconst t = useTranslate('webx-catalog')\nconst message = useErrorText()\n\nconst exporter = createModal<ExchangeRun, { selection?: BulkSelection | null }>(\n ExchangeExportDialog,\n)\n\nconst page = ref<Paginated<ExchangeRun> | null>(null)\nconst loading = ref(true)\nconst expanded = ref<RowKey[]>([])\nconst profiles = ref<ExchangeProfile[]>([])\n\nconst canImport = computed(() => context.can('catalog.manage'))\n\nconst polling = useRunPolling(api, (fresh) => {\n if (page.value === null) return\n\n page.value = {\n ...page.value,\n data: page.value.data.map((one) => (one.id === fresh.id ? fresh : one)),\n }\n})\n\nconst columns = computed<TableColumn<ExchangeRun>[]>(() => [\n { key: 'run', label: t('panel.exchange-column-run'), minWidth: 200 },\n { key: 'status', label: t('panel.exchange-column-status'), width: 130 },\n { key: 'result', label: t('panel.exchange-column-result'), width: 240, hideBelow: 780 },\n { key: 'started', label: t('panel.exchange-column-started'), width: 120, hideBelow: 560 },\n])\n\nfunction profileName(id: number | null): string | null {\n return id === null ? null : (profiles.value.find((one) => one.id === id)?.name ?? null)\n}\n\nlet asked = 0\n\nasync function load(state?: TableState): Promise<void> {\n const mine = ++asked\n\n loading.value = true\n\n try {\n const answer = await api.runs({ page: state?.page ?? page.value?.current_page ?? 1 })\n\n if (mine !== asked) return\n\n page.value = answer\n\n for (const run of answer.data) if (isRunning(run)) polling.watch(run.id)\n } catch (error) {\n toast.danger(message(error))\n } finally {\n if (mine === asked) loading.value = false\n }\n}\n\nonMounted(async () => {\n void api\n .profiles()\n .then((found) => (profiles.value = found))\n .catch(() => undefined)\n\n await load()\n\n // A run handed over by the wizard or the export: open, and followed even if it is not on\n // the first page any more (a run of the past, linked from somewhere).\n const wanted = Number(route.query.run)\n\n if (Number.isInteger(wanted) && wanted > 0) open(wanted)\n})\n\nasync function open(id: number): Promise<void> {\n if (!expanded.value.includes(id)) expanded.value = [...expanded.value, id]\n\n if (page.value !== null && !page.value.data.some((one) => one.id === id)) {\n try {\n const run = await api.run(id)\n\n page.value = { ...page.value, data: [run, ...page.value.data] }\n } catch {\n return\n }\n }\n\n polling.watch(id)\n}\n\nfunction toggle(run: ExchangeRun): void {\n expanded.value = expanded.value.includes(run.id)\n ? expanded.value.filter((one) => one !== run.id)\n : [...expanded.value, run.id]\n}\n\nasync function exportAll(): Promise<void> {\n const run = await exporter({ selection: null })\n\n if (!run) return\n\n toast.success(t('panel.exchange-export-started'))\n await load({ page: 1 } as TableState)\n void open(run.id)\n}\n\nconst actions = computed<ScreenAction[]>(() => [\n ...(canImport.value\n ? [\n {\n key: 'import',\n label: t('panel.exchange-import'),\n icon: 'upload' as const,\n primary: true,\n run: () => void router.push(`${props.base}/exchange/import`),\n },\n ]\n : []),\n {\n key: 'export',\n label: t('panel.exchange-export'),\n icon: 'download',\n run: () => void exportAll(),\n },\n {\n key: 'profiles',\n label: t('panel.exchange-profiles'),\n icon: 'sliders',\n menu: true,\n run: () => void router.push(`${props.base}/exchange/profiles`),\n },\n])\n\nfunction title(run: ExchangeRun): string {\n return `${t(`panel.exchange-${run.direction}`)} #${run.id}`\n}\n\nfunction progress(run: ExchangeRun): number {\n return run.rows_total > 0 ? Math.round((run.rows_done / run.rows_total) * 100) : 0\n}\n</script>\n\n<template>\n <div class=\"wx-catalog-exchange\">\n <wx-list-screen\n :title=\"t('panel.exchange-title')\"\n :subtitle=\"t('panel.exchange-help')\"\n :back=\"`${props.base}/products`\"\n :back-label=\"t('module.products')\"\n :actions=\"actions\"\n >\n <wx-table\n v-model:expanded=\"expanded\"\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n expandable\n :cards-below=\"0\"\n flush\n layout=\"fixed\"\n :loading=\"loading\"\n :empty-text=\"t('panel.exchange-empty')\"\n :aria-label=\"t('panel.exchange-title')\"\n @state-change=\"load\"\n @row-click=\"toggle\"\n >\n <template #cell-run=\"{ row }\">\n <div class=\"wx-catalog-exchange__run\">\n <span class=\"wx-catalog-exchange__title\">\n <wx-icon\n :name=\"row.direction === 'import' ? 'upload' : 'download'\"\n size=\"sm\"\n class=\"wx-catalog-exchange__direction\"\n />\n {{ title(row) }}\n <wx-badge v-if=\"row.dry_run\" size=\"sm\" round>{{\n t('panel.exchange-check')\n }}</wx-badge>\n </span>\n <span v-if=\"profileName(row.profile_id) || row.source\" class=\"wx-catalog-exchange__sub\">\n {{ profileName(row.profile_id) ?? row.source }}\n </span>\n </div>\n </template>\n\n <template #cell-status=\"{ row }\">\n <div class=\"wx-catalog-exchange__status\">\n <wx-badge :type=\"runStatus(row, t).type\" dot>{{ runStatus(row, t).label }}</wx-badge>\n <template v-if=\"isRunning(row) && row.rows_total > 0\">\n <wx-progress\n :value=\"progress(row)\"\n size=\"sm\"\n :aria-label=\"\n t('panel.exchange-progress', {\n done: row.rows_done,\n total: row.rows_total,\n })\n \"\n />\n <wx-text size=\"xs\" tone=\"muted\">\n {{ t('panel.exchange-progress', { done: row.rows_done, total: row.rows_total }) }}\n </wx-text>\n </template>\n </div>\n </template>\n\n <template #cell-result=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.failed > 0 ? undefined : 'muted'\" truncate>\n {{\n runTotals(row, t)\n .map((one) => one.text)\n .join(' · ')\n }}\n </wx-text>\n </template>\n\n <template #cell-started=\"{ row }\">\n <wx-date :value=\"row.started_at ?? row.created_at\" compact />\n </template>\n\n <template #expanded=\"{ row }\">\n <exchange-run-detail\n :run=\"row\"\n :base=\"props.base\"\n :profile-name=\"profileName(row.profile_id)\"\n />\n </template>\n </wx-table>\n </wx-list-screen>\n </div>\n</template>\n\n<style scoped>\n.wx-catalog-exchange {\n min-width: 0;\n}\n\n.wx-catalog-exchange__run {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.wx-catalog-exchange__title {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n font-weight: var(--wx-font-weight-medium);\n min-width: 0;\n}\n\n.wx-catalog-exchange__direction {\n flex: none;\n color: var(--wx-text-muted);\n}\n\n.wx-catalog-exchange__sub {\n font-size: var(--wx-font-size-sm);\n color: var(--wx-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-catalog-exchange__status {\n display: grid;\n justify-items: start;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-catalog-exchange__status :deep(.wx-progress) {\n justify-self: stretch;\n}\n</style>\n"],"names":["props","__props","open","dismiss","useModal","admin","useAdmin","history","createHistoryApi","useCatalogMessages","t","useTranslate","message","useErrorText","rows","ref","page","last","loading","load","next","answer","error","toast","onMounted","fields","row","change","_createBlock","_unref","WxDialog","$event","WxSkeleton","WxEmpty","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_renderList","WxLink","RouterLink","_createTextVNode","_toDisplayString","_createVNode","WxText","WxButton","_cache","runTotals","run","lines","add","key","count","tone","TONES","runStatus","type","api","createExchangeApi","journal","createModal","ExchangeJournalDialog","errors","more","loadErrors","watch","totals","computed","columns","fileGone","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","WxDate","isRunning","WxAlert","_hoisted_8","total","_normalizeClass","_hoisted_9","WxTable","_withCtx","_hoisted_10","_hoisted_11","context","route","useRoute","router","useRouter","exporter","ExchangeExportDialog","expanded","profiles","canImport","polling","useRunPolling","fresh","one","profileName","id","asked","state","mine","found","wanted","toggle","exportAll","actions","title","progress","WxListScreen","WxIcon","WxBadge","WxProgress","ExchangeRunDetail"],"mappings":"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"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { defineComponent as ue, computed as x, ref as v, onMounted as se, openBlock as i, createElementBlock as d, Fragment as k, createVNode as t, unref as l, withCtx as m, createTextVNode as _, toDisplayString as b, createElementVNode as F, renderList as H, createBlock as w, createCommentVNode as V } from "vue";
|
|
2
|
+
import { useRoute as ce, useRouter as de } from "vue-router";
|
|
3
|
+
import { useAdmin as pe, useTranslate as ve, useErrorText as me, WxScreenHead as fe, WxScreen as L } from "@webx-ui/module-admin";
|
|
4
|
+
import { toast as C, WxSkeleton as G, WxCard as B, WxHeading as J, WxText as K, WxInput as ge, WxSelect as Q, WxAction as S, WxButton as X, WxEmpty as xe, WxActionBar as he, confirm as be } from "@webx-ui/core";
|
|
5
|
+
import { j as ke, a as _e, I as Y, _ as ye } from "./index-BTEbHnJ5.js";
|
|
6
|
+
const we = { class: "wx-catalog-profile" }, Ve = { class: "wx-catalog-profile__pairs" }, Ce = {
|
|
7
|
+
key: 1,
|
|
8
|
+
class: "wx-catalog-profile__codes"
|
|
9
|
+
}, $e = { class: "wx-catalog-profile__code-label" }, We = {
|
|
10
|
+
key: 2,
|
|
11
|
+
class: "wx-catalog-profile__add"
|
|
12
|
+
}, Se = /* @__PURE__ */ ue({
|
|
13
|
+
__name: "ExchangeProfilePage",
|
|
14
|
+
props: {
|
|
15
|
+
base: { default: "/catalog" }
|
|
16
|
+
},
|
|
17
|
+
setup(Z) {
|
|
18
|
+
const M = Z, N = pe(), y = ke(N), P = ce(), E = de();
|
|
19
|
+
_e();
|
|
20
|
+
const n = ve("webx-catalog"), U = me(), T = x(() => `${M.base}/exchange/profiles`), I = x(() => P.params.id === "new" ? null : Number(P.params.id)), c = x(() => N.can("catalog.manage")), O = v(!1), r = v(null), j = v([]), p = v({}), $ = v({ ...Y }), h = v([]), u = v([]), R = v(null), W = v({}), A = v(!1), f = x(
|
|
21
|
+
() => r.value?.direction ?? (P.query.direction === "export" ? "export" : "import")
|
|
22
|
+
);
|
|
23
|
+
se(async () => {
|
|
24
|
+
try {
|
|
25
|
+
const [e, a] = await Promise.all([
|
|
26
|
+
y.columns(),
|
|
27
|
+
I.value === null ? Promise.resolve(null) : y.profile(I.value)
|
|
28
|
+
]);
|
|
29
|
+
j.value = e, r.value = a, ee(a);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
C.danger(U(e));
|
|
32
|
+
} finally {
|
|
33
|
+
O.value = !0;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
function ee(e) {
|
|
37
|
+
const a = e?.options ?? {};
|
|
38
|
+
p.value = {
|
|
39
|
+
name: e?.name ?? "",
|
|
40
|
+
format: e?.format ?? (f.value === "export" ? "xlsx" : "csv"),
|
|
41
|
+
direction: f.value,
|
|
42
|
+
encoding: typeof a.encoding == "string" ? a.encoding : null,
|
|
43
|
+
delimiter: typeof a.delimiter == "string" ? a.delimiter : null
|
|
44
|
+
}, $.value = { ...Y, ...a };
|
|
45
|
+
const o = e?.mapping ?? (f.value === "export" ? [] : {});
|
|
46
|
+
Array.isArray(o) ? u.value = [...o] : h.value = Object.entries(o).map(([s, g]) => ({ header: s, code: g })), f.value === "import" && h.value.length === 0 && (h.value = [{ header: "sku", code: "sku" }]);
|
|
47
|
+
}
|
|
48
|
+
const z = x(
|
|
49
|
+
() => j.value.flatMap((e) => [
|
|
50
|
+
{ value: e.key, label: `${e.label} · ${e.key}` },
|
|
51
|
+
...e.locales.map((a) => ({
|
|
52
|
+
value: `${e.key}@${a}`,
|
|
53
|
+
label: `${e.label} (${a.toUpperCase()}) · ${e.key}@${a}`
|
|
54
|
+
}))
|
|
55
|
+
])
|
|
56
|
+
);
|
|
57
|
+
function le(e) {
|
|
58
|
+
return z.value.find((a) => a.value === e)?.label ?? e;
|
|
59
|
+
}
|
|
60
|
+
const ae = x(
|
|
61
|
+
() => z.value.filter((e) => !u.value.includes(String(e.value)))
|
|
62
|
+
);
|
|
63
|
+
function ne(e) {
|
|
64
|
+
typeof e == "string" && !u.value.includes(e) && (u.value = [...u.value, e]), R.value = null;
|
|
65
|
+
}
|
|
66
|
+
function q(e, a) {
|
|
67
|
+
const o = [...u.value], [s] = o.splice(e, 1);
|
|
68
|
+
o.splice(e + a, 0, s), u.value = o;
|
|
69
|
+
}
|
|
70
|
+
function D() {
|
|
71
|
+
const e = p.value.format === "csv" ? {
|
|
72
|
+
...p.value.encoding ? { encoding: String(p.value.encoding) } : {},
|
|
73
|
+
...p.value.delimiter ? { delimiter: String(p.value.delimiter) } : {}
|
|
74
|
+
} : {};
|
|
75
|
+
return {
|
|
76
|
+
name: String(p.value.name ?? "").trim(),
|
|
77
|
+
format: p.value.format,
|
|
78
|
+
...r.value === null ? { direction: f.value } : {},
|
|
79
|
+
options: f.value === "import" ? { ...$.value, encoding: void 0, delimiter: void 0, ...e } : {},
|
|
80
|
+
mapping: f.value === "import" ? Object.fromEntries(
|
|
81
|
+
h.value.filter((a) => a.header.trim() !== "" && a.code).map((a) => [a.header.trim(), a.code])
|
|
82
|
+
) : u.value
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async function oe() {
|
|
86
|
+
A.value = !0, W.value = {};
|
|
87
|
+
try {
|
|
88
|
+
const e = r.value === null ? await y.createProfile(D()) : await y.saveProfile(r.value.id, D());
|
|
89
|
+
C.success(n("panel.exchange-profile-saved")), r.value === null ? (r.value = e, E.replace(`${T.value}/${e.id}`)) : r.value = e;
|
|
90
|
+
} catch (e) {
|
|
91
|
+
const a = e.body?.errors;
|
|
92
|
+
a && (W.value = a), C.danger(U(e));
|
|
93
|
+
} finally {
|
|
94
|
+
A.value = !1;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function te() {
|
|
98
|
+
if (!(r.value === null || !await be({
|
|
99
|
+
title: n("panel.exchange-profile-delete-title", { name: r.value.name }),
|
|
100
|
+
message: n("panel.exchange-profile-delete-text"),
|
|
101
|
+
confirmText: n("panel.exchange-delete"),
|
|
102
|
+
cancelText: n("panel.cancel"),
|
|
103
|
+
tone: "danger"
|
|
104
|
+
})))
|
|
105
|
+
try {
|
|
106
|
+
await y.removeProfile(r.value.id), C.success(n("panel.exchange-profile-deleted")), E.push(T.value);
|
|
107
|
+
} catch (a) {
|
|
108
|
+
C.danger(U(a));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const re = x(() => r.value?.name || n("panel.exchange-profile-new")), ie = x(() => {
|
|
112
|
+
const e = [];
|
|
113
|
+
return r.value !== null && r.value.direction === "import" && c.value && e.push({
|
|
114
|
+
key: "run",
|
|
115
|
+
label: n("panel.exchange-profile-run"),
|
|
116
|
+
icon: "upload",
|
|
117
|
+
run: () => {
|
|
118
|
+
E.push({
|
|
119
|
+
path: `${M.base}/exchange/import`,
|
|
120
|
+
query: { profile: String(r.value.id) }
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}), r.value !== null && c.value && e.push({
|
|
124
|
+
key: "delete",
|
|
125
|
+
label: n("panel.exchange-delete"),
|
|
126
|
+
icon: "trash",
|
|
127
|
+
danger: !0,
|
|
128
|
+
menu: !0,
|
|
129
|
+
run: () => {
|
|
130
|
+
te();
|
|
131
|
+
}
|
|
132
|
+
}), e;
|
|
133
|
+
});
|
|
134
|
+
return (e, a) => (i(), d("div", we, [
|
|
135
|
+
O.value ? (i(), d(k, { key: 1 }, [
|
|
136
|
+
t(l(fe), {
|
|
137
|
+
divider: "",
|
|
138
|
+
back: T.value,
|
|
139
|
+
"back-label": l(n)("panel.exchange-profiles-title"),
|
|
140
|
+
title: re.value,
|
|
141
|
+
subtitle: l(n)(`panel.exchange-${f.value}`),
|
|
142
|
+
actions: ie.value
|
|
143
|
+
}, null, 8, ["back", "back-label", "title", "subtitle", "actions"]),
|
|
144
|
+
t(l(L), {
|
|
145
|
+
modelValue: p.value,
|
|
146
|
+
"onUpdate:modelValue": a[0] || (a[0] = (o) => p.value = o),
|
|
147
|
+
name: "catalog.exchange-profile",
|
|
148
|
+
errors: W.value,
|
|
149
|
+
disabled: !c.value
|
|
150
|
+
}, null, 8, ["modelValue", "errors", "disabled"]),
|
|
151
|
+
f.value === "import" ? (i(), d(k, { key: 0 }, [
|
|
152
|
+
t(l(L), {
|
|
153
|
+
modelValue: $.value,
|
|
154
|
+
"onUpdate:modelValue": a[1] || (a[1] = (o) => $.value = o),
|
|
155
|
+
name: "catalog.exchange-import",
|
|
156
|
+
errors: W.value,
|
|
157
|
+
disabled: !c.value
|
|
158
|
+
}, null, 8, ["modelValue", "errors", "disabled"]),
|
|
159
|
+
t(l(B), null, {
|
|
160
|
+
default: m(() => [
|
|
161
|
+
t(l(J), {
|
|
162
|
+
level: 3,
|
|
163
|
+
size: "md"
|
|
164
|
+
}, {
|
|
165
|
+
default: m(() => [
|
|
166
|
+
_(b(l(n)("panel.exchange-profile-mapping")), 1)
|
|
167
|
+
]),
|
|
168
|
+
_: 1
|
|
169
|
+
}),
|
|
170
|
+
t(l(K), {
|
|
171
|
+
size: "sm",
|
|
172
|
+
tone: "muted"
|
|
173
|
+
}, {
|
|
174
|
+
default: m(() => [
|
|
175
|
+
_(b(l(n)("panel.exchange-profile-mapping-help")), 1)
|
|
176
|
+
]),
|
|
177
|
+
_: 1
|
|
178
|
+
}),
|
|
179
|
+
F("div", Ve, [
|
|
180
|
+
(i(!0), d(k, null, H(h.value, (o, s) => (i(), d("div", {
|
|
181
|
+
key: s,
|
|
182
|
+
class: "wx-catalog-profile__pair"
|
|
183
|
+
}, [
|
|
184
|
+
t(l(ge), {
|
|
185
|
+
modelValue: o.header,
|
|
186
|
+
"onUpdate:modelValue": (g) => o.header = g,
|
|
187
|
+
placeholder: l(n)("panel.exchange-profile-header"),
|
|
188
|
+
"aria-label": l(n)("panel.exchange-profile-header"),
|
|
189
|
+
disabled: !c.value
|
|
190
|
+
}, null, 8, ["modelValue", "onUpdate:modelValue", "placeholder", "aria-label", "disabled"]),
|
|
191
|
+
t(l(Q), {
|
|
192
|
+
modelValue: o.code,
|
|
193
|
+
"onUpdate:modelValue": (g) => o.code = g,
|
|
194
|
+
options: z.value,
|
|
195
|
+
filterable: "",
|
|
196
|
+
clearable: "",
|
|
197
|
+
placeholder: l(n)("panel.exchange-map-skip"),
|
|
198
|
+
"aria-label": l(n)("panel.exchange-map-catalog"),
|
|
199
|
+
disabled: !c.value
|
|
200
|
+
}, null, 8, ["modelValue", "onUpdate:modelValue", "options", "placeholder", "aria-label", "disabled"]),
|
|
201
|
+
c.value ? (i(), w(l(S), {
|
|
202
|
+
key: 0,
|
|
203
|
+
icon: "close",
|
|
204
|
+
label: l(n)("panel.exchange-profile-remove"),
|
|
205
|
+
onClick: (g) => h.value.splice(s, 1)
|
|
206
|
+
}, null, 8, ["label", "onClick"])) : V("", !0)
|
|
207
|
+
]))), 128))
|
|
208
|
+
]),
|
|
209
|
+
c.value ? (i(), w(l(X), {
|
|
210
|
+
key: 0,
|
|
211
|
+
size: "sm",
|
|
212
|
+
variant: "outline",
|
|
213
|
+
icon: "plus",
|
|
214
|
+
onClick: a[2] || (a[2] = (o) => h.value.push({ header: "", code: null }))
|
|
215
|
+
}, {
|
|
216
|
+
default: m(() => [
|
|
217
|
+
_(b(l(n)("panel.exchange-profile-add")), 1)
|
|
218
|
+
]),
|
|
219
|
+
_: 1
|
|
220
|
+
})) : V("", !0)
|
|
221
|
+
]),
|
|
222
|
+
_: 1
|
|
223
|
+
})
|
|
224
|
+
], 64)) : (i(), w(l(B), { key: 1 }, {
|
|
225
|
+
default: m(() => [
|
|
226
|
+
t(l(J), {
|
|
227
|
+
level: 3,
|
|
228
|
+
size: "md"
|
|
229
|
+
}, {
|
|
230
|
+
default: m(() => [
|
|
231
|
+
_(b(l(n)("panel.exchange-export-columns")), 1)
|
|
232
|
+
]),
|
|
233
|
+
_: 1
|
|
234
|
+
}),
|
|
235
|
+
t(l(K), {
|
|
236
|
+
size: "sm",
|
|
237
|
+
tone: "muted"
|
|
238
|
+
}, {
|
|
239
|
+
default: m(() => [
|
|
240
|
+
_(b(l(n)("panel.exchange-export-columns-help")), 1)
|
|
241
|
+
]),
|
|
242
|
+
_: 1
|
|
243
|
+
}),
|
|
244
|
+
u.value.length === 0 ? (i(), w(l(xe), {
|
|
245
|
+
key: 0,
|
|
246
|
+
description: l(n)("panel.exchange-export-none")
|
|
247
|
+
}, null, 8, ["description"])) : (i(), d("ol", Ce, [
|
|
248
|
+
(i(!0), d(k, null, H(u.value, (o, s) => (i(), d("li", {
|
|
249
|
+
key: o,
|
|
250
|
+
class: "wx-catalog-profile__code"
|
|
251
|
+
}, [
|
|
252
|
+
F("span", $e, b(le(o)), 1),
|
|
253
|
+
c.value ? (i(), d(k, { key: 0 }, [
|
|
254
|
+
t(l(S), {
|
|
255
|
+
icon: "arrow-up",
|
|
256
|
+
label: l(n)("panel.exchange-profile-up"),
|
|
257
|
+
disabled: s === 0,
|
|
258
|
+
onClick: (g) => q(s, -1)
|
|
259
|
+
}, null, 8, ["label", "disabled", "onClick"]),
|
|
260
|
+
t(l(S), {
|
|
261
|
+
icon: "arrow-down",
|
|
262
|
+
label: l(n)("panel.exchange-profile-down"),
|
|
263
|
+
disabled: s === u.value.length - 1,
|
|
264
|
+
onClick: (g) => q(s, 1)
|
|
265
|
+
}, null, 8, ["label", "disabled", "onClick"]),
|
|
266
|
+
t(l(S), {
|
|
267
|
+
icon: "close",
|
|
268
|
+
label: l(n)("panel.exchange-profile-remove"),
|
|
269
|
+
onClick: (g) => u.value.splice(s, 1)
|
|
270
|
+
}, null, 8, ["label", "onClick"])
|
|
271
|
+
], 64)) : V("", !0)
|
|
272
|
+
]))), 128))
|
|
273
|
+
])),
|
|
274
|
+
c.value ? (i(), d("div", We, [
|
|
275
|
+
t(l(Q), {
|
|
276
|
+
"model-value": R.value,
|
|
277
|
+
options: ae.value,
|
|
278
|
+
filterable: "",
|
|
279
|
+
placeholder: l(n)("panel.exchange-profile-add"),
|
|
280
|
+
"aria-label": l(n)("panel.exchange-profile-add"),
|
|
281
|
+
"onUpdate:modelValue": ne
|
|
282
|
+
}, null, 8, ["model-value", "options", "placeholder", "aria-label"])
|
|
283
|
+
])) : V("", !0)
|
|
284
|
+
]),
|
|
285
|
+
_: 1
|
|
286
|
+
})),
|
|
287
|
+
c.value ? (i(), w(l(he), { key: 2 }, {
|
|
288
|
+
default: m(() => [
|
|
289
|
+
t(l(X), {
|
|
290
|
+
type: "primary",
|
|
291
|
+
loading: A.value,
|
|
292
|
+
onClick: oe
|
|
293
|
+
}, {
|
|
294
|
+
default: m(() => [
|
|
295
|
+
_(b(l(n)("panel.exchange-save")), 1)
|
|
296
|
+
]),
|
|
297
|
+
_: 1
|
|
298
|
+
}, 8, ["loading"])
|
|
299
|
+
]),
|
|
300
|
+
_: 1
|
|
301
|
+
})) : V("", !0)
|
|
302
|
+
], 64)) : (i(), d(k, { key: 0 }, [
|
|
303
|
+
t(l(G), {
|
|
304
|
+
title: "",
|
|
305
|
+
rows: 1,
|
|
306
|
+
class: "wx-catalog-profile__ghost"
|
|
307
|
+
}),
|
|
308
|
+
t(l(B), null, {
|
|
309
|
+
default: m(() => [
|
|
310
|
+
t(l(G), { rows: 6 })
|
|
311
|
+
]),
|
|
312
|
+
_: 1
|
|
313
|
+
})
|
|
314
|
+
], 64))
|
|
315
|
+
]));
|
|
316
|
+
}
|
|
317
|
+
}), ze = /* @__PURE__ */ ye(Se, [["__scopeId", "data-v-708c759a"]]);
|
|
318
|
+
export {
|
|
319
|
+
ze as default
|
|
320
|
+
};
|
|
321
|
+
//# sourceMappingURL=ExchangeProfilePage-BUnh9_D7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExchangeProfilePage-BUnh9_D7.js","sources":["../src/ExchangeProfilePage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxScreen,\n WxScreenHead,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n confirm,\n toast,\n WxAction,\n WxActionBar,\n WxButton,\n WxCard,\n WxEmpty,\n WxHeading,\n WxInput,\n WxSelect,\n WxSkeleton,\n WxText,\n type SelectOption,\n} from '@webx-ui/core'\nimport type { ScreenModel } from '@webx-ui/schema'\nimport {\n createExchangeApi,\n IMPORT_DEFAULTS,\n type ExchangeColumnInfo,\n type ExchangeDirection,\n type ExchangeProfile,\n type ExchangeProfileInput,\n} from './exchange'\nimport { useCatalogMessages } from './i18n'\n\n/**\n * One profile of the exchange (§8.1): its head (name, format, how a CSV is read) and, by\n * direction, either how an import writes and which header goes into which column, or the\n * columns an export writes in their order.\n *\n * The head and the import's settings are the two described screens the wizard uses too, so a\n * setting a project took away is gone from both. The columns are this page's own: a mapping is\n * a list of pairs the server checks against the columns the caller may write.\n */\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/catalog' })\n\nconst context = useAdmin()\nconst api = createExchangeApi(context)\nconst route = useRoute()\nconst router = useRouter()\nuseCatalogMessages()\n\nconst t = useTranslate('webx-catalog')\nconst message = useErrorText()\n\nconst list = computed(() => `${props.base}/exchange/profiles`)\nconst id = computed(() => (route.params.id === 'new' ? null : Number(route.params.id)))\nconst canManage = computed(() => context.can('catalog.manage'))\n\nconst loaded = ref(false)\nconst profile = ref<ExchangeProfile | null>(null)\nconst columns = ref<ExchangeColumnInfo[]>([])\nconst head = ref<ScreenModel>({})\nconst options = ref<ScreenModel>({ ...IMPORT_DEFAULTS })\nconst pairs = ref<{ header: string; code: string | null }[]>([])\nconst codes = ref<string[]>([])\nconst adding = ref<string | null>(null)\nconst errors = ref<Record<string, string[]>>({})\nconst saving = ref(false)\n\nconst direction = computed<ExchangeDirection>(\n () => profile.value?.direction ?? (route.query.direction === 'export' ? 'export' : 'import'),\n)\n\nonMounted(async () => {\n try {\n const [found, current] = await Promise.all([\n api.columns(),\n id.value === null ? Promise.resolve(null) : api.profile(id.value),\n ])\n\n columns.value = found\n profile.value = current\n fill(current)\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loaded.value = true\n }\n})\n\nfunction fill(current: ExchangeProfile | null): void {\n const read = current?.options ?? {}\n\n head.value = {\n name: current?.name ?? '',\n format: current?.format ?? (direction.value === 'export' ? 'xlsx' : 'csv'),\n direction: direction.value,\n encoding: typeof read.encoding === 'string' ? read.encoding : null,\n delimiter: typeof read.delimiter === 'string' ? read.delimiter : null,\n }\n options.value = { ...IMPORT_DEFAULTS, ...read }\n\n const mapping = current?.mapping ?? (direction.value === 'export' ? [] : {})\n\n if (Array.isArray(mapping)) {\n codes.value = [...mapping]\n } else {\n pairs.value = Object.entries(mapping).map(([header, code]) => ({ header, code }))\n }\n\n if (direction.value === 'import' && pairs.value.length === 0) {\n pairs.value = [{ header: 'sku', code: 'sku' }]\n }\n}\n\n/** Every column, each translation a choice of its own: `name@de`. */\nconst targets = computed<SelectOption[]>(() =>\n columns.value.flatMap((column) => [\n { value: column.key, label: `${column.label} · ${column.key}` },\n ...column.locales.map((code) => ({\n value: `${column.key}@${code}`,\n label: `${column.label} (${code.toUpperCase()}) · ${column.key}@${code}`,\n })),\n ]),\n)\n\nfunction labelOf(code: string): string {\n return targets.value.find((one) => one.value === code)?.label ?? code\n}\n\nconst spare = computed(() =>\n targets.value.filter((one) => !codes.value.includes(String(one.value))),\n)\n\nfunction addCode(value: unknown): void {\n if (typeof value === 'string' && !codes.value.includes(value))\n codes.value = [...codes.value, value]\n adding.value = null\n}\n\nfunction moveCode(index: number, by: -1 | 1): void {\n const next = [...codes.value]\n const [moved] = next.splice(index, 1)\n\n next.splice(index + by, 0, moved!)\n codes.value = next\n}\n\nfunction values(): ExchangeProfileInput {\n const read =\n head.value.format === 'csv'\n ? {\n ...(head.value.encoding ? { encoding: String(head.value.encoding) } : {}),\n ...(head.value.delimiter ? { delimiter: String(head.value.delimiter) } : {}),\n }\n : {}\n\n return {\n name: String(head.value.name ?? '').trim(),\n format: head.value.format as ExchangeProfileInput['format'],\n ...(profile.value === null ? { direction: direction.value } : {}),\n options:\n direction.value === 'import'\n ? { ...options.value, encoding: undefined, delimiter: undefined, ...read }\n : {},\n mapping:\n direction.value === 'import'\n ? Object.fromEntries(\n pairs.value\n .filter((pair) => pair.header.trim() !== '' && pair.code)\n .map((pair) => [pair.header.trim(), pair.code!]),\n )\n : codes.value,\n }\n}\n\nasync function save(): Promise<void> {\n saving.value = true\n errors.value = {}\n\n try {\n const saved =\n profile.value === null\n ? await api.createProfile(values())\n : await api.saveProfile(profile.value.id, values())\n\n toast.success(t('panel.exchange-profile-saved'))\n\n if (profile.value === null) {\n profile.value = saved\n void router.replace(`${list.value}/${saved.id}`)\n } else {\n profile.value = saved\n }\n } catch (error) {\n const refused = (error as { body?: { errors?: Record<string, string[]> } }).body?.errors\n\n if (refused) errors.value = refused\n toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n\nasync function remove(): Promise<void> {\n if (profile.value === null) return\n\n const sure = await confirm({\n title: t('panel.exchange-profile-delete-title', { name: profile.value.name }),\n message: t('panel.exchange-profile-delete-text'),\n confirmText: t('panel.exchange-delete'),\n cancelText: t('panel.cancel'),\n tone: 'danger',\n })\n\n if (!sure) return\n\n try {\n await api.removeProfile(profile.value.id)\n toast.success(t('panel.exchange-profile-deleted'))\n void router.push(list.value)\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nconst title = computed(() => profile.value?.name || t('panel.exchange-profile-new'))\n\nconst actions = computed<ScreenAction[]>(() => {\n const all: ScreenAction[] = []\n\n if (profile.value !== null && profile.value.direction === 'import' && canManage.value) {\n all.push({\n key: 'run',\n label: t('panel.exchange-profile-run'),\n icon: 'upload',\n run: () =>\n void router.push({\n path: `${props.base}/exchange/import`,\n query: { profile: String(profile.value!.id) },\n }),\n })\n }\n\n if (profile.value !== null && canManage.value) {\n all.push({\n key: 'delete',\n label: t('panel.exchange-delete'),\n icon: 'trash',\n danger: true,\n menu: true,\n run: () => void remove(),\n })\n }\n\n return all\n})\n</script>\n\n<template>\n <div class=\"wx-catalog-profile\">\n <template v-if=\"!loaded\">\n <wx-skeleton title :rows=\"1\" class=\"wx-catalog-profile__ghost\" />\n <wx-card><wx-skeleton :rows=\"6\" /></wx-card>\n </template>\n\n <template v-else>\n <wx-screen-head\n divider\n :back=\"list\"\n :back-label=\"t('panel.exchange-profiles-title')\"\n :title=\"title\"\n :subtitle=\"t(`panel.exchange-${direction}`)\"\n :actions=\"actions\"\n />\n\n <wx-screen\n v-model=\"head\"\n name=\"catalog.exchange-profile\"\n :errors=\"errors\"\n :disabled=\"!canManage\"\n />\n\n <template v-if=\"direction === 'import'\">\n <wx-screen\n v-model=\"options\"\n name=\"catalog.exchange-import\"\n :errors=\"errors\"\n :disabled=\"!canManage\"\n />\n\n <wx-card>\n <wx-heading :level=\"3\" size=\"md\">{{ t('panel.exchange-profile-mapping') }}</wx-heading>\n <wx-text size=\"sm\" tone=\"muted\">{{ t('panel.exchange-profile-mapping-help') }}</wx-text>\n\n <div class=\"wx-catalog-profile__pairs\">\n <div v-for=\"(pair, index) in pairs\" :key=\"index\" class=\"wx-catalog-profile__pair\">\n <wx-input\n v-model=\"pair.header\"\n :placeholder=\"t('panel.exchange-profile-header')\"\n :aria-label=\"t('panel.exchange-profile-header')\"\n :disabled=\"!canManage\"\n />\n <wx-select\n v-model=\"pair.code\"\n :options=\"targets\"\n filterable\n clearable\n :placeholder=\"t('panel.exchange-map-skip')\"\n :aria-label=\"t('panel.exchange-map-catalog')\"\n :disabled=\"!canManage\"\n />\n <wx-action\n v-if=\"canManage\"\n icon=\"close\"\n :label=\"t('panel.exchange-profile-remove')\"\n @click=\"pairs.splice(index, 1)\"\n />\n </div>\n </div>\n\n <wx-button\n v-if=\"canManage\"\n size=\"sm\"\n variant=\"outline\"\n icon=\"plus\"\n @click=\"pairs.push({ header: '', code: null })\"\n >\n {{ t('panel.exchange-profile-add') }}\n </wx-button>\n </wx-card>\n </template>\n\n <wx-card v-else>\n <wx-heading :level=\"3\" size=\"md\">{{ t('panel.exchange-export-columns') }}</wx-heading>\n <wx-text size=\"sm\" tone=\"muted\">{{ t('panel.exchange-export-columns-help') }}</wx-text>\n\n <wx-empty v-if=\"codes.length === 0\" :description=\"t('panel.exchange-export-none')\" />\n <ol v-else class=\"wx-catalog-profile__codes\">\n <li v-for=\"(code, index) in codes\" :key=\"code\" class=\"wx-catalog-profile__code\">\n <span class=\"wx-catalog-profile__code-label\">{{ labelOf(code) }}</span>\n <template v-if=\"canManage\">\n <wx-action\n icon=\"arrow-up\"\n :label=\"t('panel.exchange-profile-up')\"\n :disabled=\"index === 0\"\n @click=\"moveCode(index, -1)\"\n />\n <wx-action\n icon=\"arrow-down\"\n :label=\"t('panel.exchange-profile-down')\"\n :disabled=\"index === codes.length - 1\"\n @click=\"moveCode(index, 1)\"\n />\n <wx-action\n icon=\"close\"\n :label=\"t('panel.exchange-profile-remove')\"\n @click=\"codes.splice(index, 1)\"\n />\n </template>\n </li>\n </ol>\n\n <div v-if=\"canManage\" class=\"wx-catalog-profile__add\">\n <wx-select\n :model-value=\"adding\"\n :options=\"spare\"\n filterable\n :placeholder=\"t('panel.exchange-profile-add')\"\n :aria-label=\"t('panel.exchange-profile-add')\"\n @update:model-value=\"addCode\"\n />\n </div>\n </wx-card>\n\n <wx-action-bar v-if=\"canManage\">\n <wx-button type=\"primary\" :loading=\"saving\" @click=\"save\">\n {{ t('panel.exchange-save') }}\n </wx-button>\n </wx-action-bar>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-catalog-profile {\n display: flex;\n flex-direction: column;\n gap: var(--wx-gap, var(--wx-space-16));\n min-width: 0;\n container-type: inline-size;\n}\n\n.wx-catalog-profile__ghost {\n max-width: 420px;\n}\n\n.wx-catalog-profile__pairs {\n display: grid;\n gap: var(--wx-space-8);\n margin: var(--wx-space-16) 0 var(--wx-space-12);\n}\n\n.wx-catalog-profile__pair {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wx-space-8);\n}\n\n.wx-catalog-profile__codes {\n display: grid;\n gap: var(--wx-space-4);\n margin: var(--wx-space-16) 0 var(--wx-space-12);\n padding: 0;\n list-style: none;\n counter-reset: code;\n}\n\n.wx-catalog-profile__code {\n display: flex;\n align-items: center;\n gap: var(--wx-space-4);\n min-width: 0;\n padding: var(--wx-space-4) var(--wx-space-8);\n border-radius: var(--wx-radius-sm);\n background: var(--wx-bg-subtle);\n counter-increment: code;\n}\n\n.wx-catalog-profile__code::before {\n content: counter(code);\n min-width: var(--wx-space-24);\n color: var(--wx-text-muted);\n font-variant-numeric: tabular-nums;\n}\n\n.wx-catalog-profile__code-label {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-catalog-profile__add {\n max-width: 360px;\n}\n\n@container (max-width: 520px) {\n .wx-catalog-profile__pair {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n .wx-catalog-profile__pair > :deep(.wx-select) {\n grid-column: 1;\n }\n}\n</style>\n"],"names":["props","__props","context","useAdmin","api","createExchangeApi","route","useRoute","router","useRouter","useCatalogMessages","t","useTranslate","message","useErrorText","list","computed","id","canManage","loaded","ref","profile","columns","head","options","IMPORT_DEFAULTS","pairs","codes","adding","errors","saving","direction","onMounted","found","current","fill","error","toast","read","mapping","header","code","targets","column","labelOf","one","spare","addCode","value","moveCode","index","by","next","moved","values","pair","save","saved","refused","remove","confirm","title","actions","all","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_createVNode","_unref","WxScreenHead","WxScreen","$event","WxCard","WxHeading","WxText","_createElementVNode","_hoisted_2","_renderList","WxInput","WxSelect","_createBlock","WxAction","WxButton","_cache","WxEmpty","_hoisted_3","_hoisted_4","_toDisplayString","_hoisted_5","WxActionBar","WxSkeleton"],"mappings":";;;;;;;;;;;;;;;;;AA8CA,UAAMA,IAAQC,GAERC,IAAUC,GAAA,GACVC,IAAMC,GAAkBH,CAAO,GAC/BI,IAAQC,GAAA,GACRC,IAASC,GAAA;AACf,IAAAC,GAAA;AAEA,UAAMC,IAAIC,GAAa,cAAc,GAC/BC,IAAUC,GAAA,GAEVC,IAAOC,EAAS,MAAM,GAAGhB,EAAM,IAAI,oBAAoB,GACvDiB,IAAKD,EAAS,MAAOV,EAAM,OAAO,OAAO,QAAQ,OAAO,OAAOA,EAAM,OAAO,EAAE,CAAE,GAChFY,IAAYF,EAAS,MAAMd,EAAQ,IAAI,gBAAgB,CAAC,GAExDiB,IAASC,EAAI,EAAK,GAClBC,IAAUD,EAA4B,IAAI,GAC1CE,IAAUF,EAA0B,EAAE,GACtCG,IAAOH,EAAiB,EAAE,GAC1BI,IAAUJ,EAAiB,EAAE,GAAGK,GAAiB,GACjDC,IAAQN,EAA+C,EAAE,GACzDO,IAAQP,EAAc,EAAE,GACxBQ,IAASR,EAAmB,IAAI,GAChCS,IAAST,EAA8B,EAAE,GACzCU,IAASV,EAAI,EAAK,GAElBW,IAAYf;AAAA,MAChB,MAAMK,EAAQ,OAAO,cAAcf,EAAM,MAAM,cAAc,WAAW,WAAW;AAAA,IAAA;AAGrF,IAAA0B,GAAU,YAAY;AACpB,UAAI;AACF,cAAM,CAACC,GAAOC,CAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,UACzC9B,EAAI,QAAA;AAAA,UACJa,EAAG,UAAU,OAAO,QAAQ,QAAQ,IAAI,IAAIb,EAAI,QAAQa,EAAG,KAAK;AAAA,QAAA,CACjE;AAED,QAAAK,EAAQ,QAAQW,GAChBZ,EAAQ,QAAQa,GAChBC,GAAKD,CAAO;AAAA,MACd,SAASE,GAAO;AACd,QAAAC,EAAM,OAAOxB,EAAQuB,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAjB,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF,CAAC;AAED,aAASgB,GAAKD,GAAuC;AACnD,YAAMI,IAAOJ,GAAS,WAAW,CAAA;AAEjC,MAAAX,EAAK,QAAQ;AAAA,QACX,MAAMW,GAAS,QAAQ;AAAA,QACvB,QAAQA,GAAS,WAAWH,EAAU,UAAU,WAAW,SAAS;AAAA,QACpE,WAAWA,EAAU;AAAA,QACrB,UAAU,OAAOO,EAAK,YAAa,WAAWA,EAAK,WAAW;AAAA,QAC9D,WAAW,OAAOA,EAAK,aAAc,WAAWA,EAAK,YAAY;AAAA,MAAA,GAEnEd,EAAQ,QAAQ,EAAE,GAAGC,GAAiB,GAAGa,EAAA;AAEzC,YAAMC,IAAUL,GAAS,YAAYH,EAAU,UAAU,WAAW,CAAA,IAAK;AAEzE,MAAI,MAAM,QAAQQ,CAAO,IACvBZ,EAAM,QAAQ,CAAC,GAAGY,CAAO,IAEzBb,EAAM,QAAQ,OAAO,QAAQa,CAAO,EAAE,IAAI,CAAC,CAACC,GAAQC,CAAI,OAAO,EAAE,QAAAD,GAAQ,MAAAC,IAAO,GAG9EV,EAAU,UAAU,YAAYL,EAAM,MAAM,WAAW,MACzDA,EAAM,QAAQ,CAAC,EAAE,QAAQ,OAAO,MAAM,OAAO;AAAA,IAEjD;AAGA,UAAMgB,IAAU1B;AAAA,MAAyB,MACvCM,EAAQ,MAAM,QAAQ,CAACqB,MAAW;AAAA,QAChC,EAAE,OAAOA,EAAO,KAAK,OAAO,GAAGA,EAAO,KAAK,MAAMA,EAAO,GAAG,GAAA;AAAA,QAC3D,GAAGA,EAAO,QAAQ,IAAI,CAACF,OAAU;AAAA,UAC/B,OAAO,GAAGE,EAAO,GAAG,IAAIF,CAAI;AAAA,UAC5B,OAAO,GAAGE,EAAO,KAAK,KAAKF,EAAK,YAAA,CAAa,OAAOE,EAAO,GAAG,IAAIF,CAAI;AAAA,QAAA,EACtE;AAAA,MAAA,CACH;AAAA,IAAA;AAGH,aAASG,GAAQH,GAAsB;AACrC,aAAOC,EAAQ,MAAM,KAAK,CAACG,MAAQA,EAAI,UAAUJ,CAAI,GAAG,SAASA;AAAA,IACnE;AAEA,UAAMK,KAAQ9B;AAAA,MAAS,MACrB0B,EAAQ,MAAM,OAAO,CAACG,MAAQ,CAAClB,EAAM,MAAM,SAAS,OAAOkB,EAAI,KAAK,CAAC,CAAC;AAAA,IAAA;AAGxE,aAASE,GAAQC,GAAsB;AACrC,MAAI,OAAOA,KAAU,YAAY,CAACrB,EAAM,MAAM,SAASqB,CAAK,MAC1DrB,EAAM,QAAQ,CAAC,GAAGA,EAAM,OAAOqB,CAAK,IACtCpB,EAAO,QAAQ;AAAA,IACjB;AAEA,aAASqB,EAASC,GAAeC,GAAkB;AACjD,YAAMC,IAAO,CAAC,GAAGzB,EAAM,KAAK,GACtB,CAAC0B,CAAK,IAAID,EAAK,OAAOF,GAAO,CAAC;AAEpC,MAAAE,EAAK,OAAOF,IAAQC,GAAI,GAAGE,CAAM,GACjC1B,EAAM,QAAQyB;AAAA,IAChB;AAEA,aAASE,IAA+B;AACtC,YAAMhB,IACJf,EAAK,MAAM,WAAW,QAClB;AAAA,QACE,GAAIA,EAAK,MAAM,WAAW,EAAE,UAAU,OAAOA,EAAK,MAAM,QAAQ,EAAA,IAAM,CAAA;AAAA,QACtE,GAAIA,EAAK,MAAM,YAAY,EAAE,WAAW,OAAOA,EAAK,MAAM,SAAS,MAAM,CAAA;AAAA,MAAC,IAE5E,CAAA;AAEN,aAAO;AAAA,QACL,MAAM,OAAOA,EAAK,MAAM,QAAQ,EAAE,EAAE,KAAA;AAAA,QACpC,QAAQA,EAAK,MAAM;AAAA,QACnB,GAAIF,EAAQ,UAAU,OAAO,EAAE,WAAWU,EAAU,MAAA,IAAU,CAAA;AAAA,QAC9D,SACEA,EAAU,UAAU,WAChB,EAAE,GAAGP,EAAQ,OAAO,UAAU,QAAW,WAAW,QAAW,GAAGc,EAAA,IAClE,CAAA;AAAA,QACN,SACEP,EAAU,UAAU,WAChB,OAAO;AAAA,UACLL,EAAM,MACH,OAAO,CAAC6B,MAASA,EAAK,OAAO,KAAA,MAAW,MAAMA,EAAK,IAAI,EACvD,IAAI,CAACA,MAAS,CAACA,EAAK,OAAO,KAAA,GAAQA,EAAK,IAAK,CAAC;AAAA,QAAA,IAEnD5B,EAAM;AAAA,MAAA;AAAA,IAEhB;AAEA,mBAAe6B,KAAsB;AACnC,MAAA1B,EAAO,QAAQ,IACfD,EAAO,QAAQ,CAAA;AAEf,UAAI;AACF,cAAM4B,IACJpC,EAAQ,UAAU,OACd,MAAMjB,EAAI,cAAckD,EAAA,CAAQ,IAChC,MAAMlD,EAAI,YAAYiB,EAAQ,MAAM,IAAIiC,GAAQ;AAEtD,QAAAjB,EAAM,QAAQ1B,EAAE,8BAA8B,CAAC,GAE3CU,EAAQ,UAAU,QACpBA,EAAQ,QAAQoC,GACXjD,EAAO,QAAQ,GAAGO,EAAK,KAAK,IAAI0C,EAAM,EAAE,EAAE,KAE/CpC,EAAQ,QAAQoC;AAAA,MAEpB,SAASrB,GAAO;AACd,cAAMsB,IAAWtB,EAA2D,MAAM;AAElF,QAAIsB,QAAgB,QAAQA,IAC5BrB,EAAM,OAAOxB,EAAQuB,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAN,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,mBAAe6B,KAAwB;AAWrC,UAVI,EAAAtC,EAAQ,UAAU,QAUlB,CARS,MAAMuC,GAAQ;AAAA,QACzB,OAAOjD,EAAE,uCAAuC,EAAE,MAAMU,EAAQ,MAAM,MAAM;AAAA,QAC5E,SAASV,EAAE,oCAAoC;AAAA,QAC/C,aAAaA,EAAE,uBAAuB;AAAA,QACtC,YAAYA,EAAE,cAAc;AAAA,QAC5B,MAAM;AAAA,MAAA,CACP;AAID,YAAI;AACF,gBAAMP,EAAI,cAAciB,EAAQ,MAAM,EAAE,GACxCgB,EAAM,QAAQ1B,EAAE,gCAAgC,CAAC,GAC5CH,EAAO,KAAKO,EAAK,KAAK;AAAA,QAC7B,SAASqB,GAAO;AACd,UAAAC,EAAM,OAAOxB,EAAQuB,CAAK,CAAC;AAAA,QAC7B;AAAA,IACF;AAEA,UAAMyB,KAAQ7C,EAAS,MAAMK,EAAQ,OAAO,QAAQV,EAAE,4BAA4B,CAAC,GAE7EmD,KAAU9C,EAAyB,MAAM;AAC7C,YAAM+C,IAAsB,CAAA;AAE5B,aAAI1C,EAAQ,UAAU,QAAQA,EAAQ,MAAM,cAAc,YAAYH,EAAU,SAC9E6C,EAAI,KAAK;AAAA,QACP,KAAK;AAAA,QACL,OAAOpD,EAAE,4BAA4B;AAAA,QACrC,MAAM;AAAA,QACN,KAAK,MAAA;AACH,UAAKH,EAAO,KAAK;AAAA,YACf,MAAM,GAAGR,EAAM,IAAI;AAAA,YACnB,OAAO,EAAE,SAAS,OAAOqB,EAAQ,MAAO,EAAE,EAAA;AAAA,UAAE,CAC7C;AAAA;AAAA,MAAA,CACJ,GAGCA,EAAQ,UAAU,QAAQH,EAAU,SACtC6C,EAAI,KAAK;AAAA,QACP,KAAK;AAAA,QACL,OAAOpD,EAAE,uBAAuB;AAAA,QAChC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,KAAK,MAAA;AAAM,UAAKgD,GAAA;AAAA;AAAA,MAAO,CACxB,GAGII;AAAA,IACT,CAAC;sBAICC,EAAA,GAAAC,EAyHM,OAzHNC,IAyHM;AAAA,MAxHa/C,EAAA,cAKjB8C,EAkHWE,GAAA,EAAA,KAAA,KAAA;AAAA,QAjHTC,EAOEC,EAAAC,EAAA,GAAA;AAAA,UANA,SAAA;AAAA,UACC,MAAMvD,EAAA;AAAA,UACN,cAAYsD,EAAA1D,CAAA,EAAC,+BAAA;AAAA,UACb,OAAOkD,GAAA;AAAA,UACP,UAAUQ,EAAA1D,CAAA,EAAC,kBAAmBoB,EAAA,KAAS,EAAA;AAAA,UACvC,SAAS+B,GAAA;AAAA,QAAA;QAGZM,EAKEC,EAAAE,CAAA,GAAA;AAAA,sBAJShD,EAAA;AAAA,wDAAAA,EAAI,QAAAiD;AAAA,UACb,MAAK;AAAA,UACJ,QAAQ3C,EAAA;AAAA,UACR,WAAWX,EAAA;AAAA,QAAA;QAGEa,EAAA,UAAS,iBAAzBkC,EAgDWE,GAAA,EAAA,KAAA,KAAA;AAAA,UA/CTC,EAKEC,EAAAE,CAAA,GAAA;AAAA,wBAJS/C,EAAA;AAAA,0DAAAA,EAAO,QAAAgD;AAAA,YAChB,MAAK;AAAA,YACJ,QAAQ3C,EAAA;AAAA,YACR,WAAWX,EAAA;AAAA,UAAA;UAGdkD,EAuCUC,EAAAI,CAAA,GAAA,MAAA;AAAA,uBAtCR,MAAuF;AAAA,cAAvFL,EAAuFC,EAAAK,CAAA,GAAA;AAAA,gBAA1E,OAAO;AAAA,gBAAG,MAAK;AAAA,cAAA;2BAAK,MAAyC;AAAA,sBAAtCL,EAAA1D,CAAA,EAAC,gCAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;cACrCyD,EAAwFC,EAAAM,CAAA,GAAA;AAAA,gBAA/E,MAAK;AAAA,gBAAK,MAAK;AAAA,cAAA;2BAAQ,MAA8C;AAAA,sBAA3CN,EAAA1D,CAAA,EAAC,qCAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;cAEpCiE,EAwBM,OAxBNC,IAwBM;AAAA,iBAvBJb,EAAA,EAAA,GAAAC,EAsBME,GAAA,MAAAW,EAtBuBpD,EAAA,OAAK,CAArB6B,GAAML,YAAnBe,EAsBM,OAAA;AAAA,kBAtB+B,KAAKf;AAAA,kBAAO,OAAM;AAAA,gBAAA;kBACrDkB,EAKEC,EAAAU,EAAA,GAAA;AAAA,oBAJS,YAAAxB,EAAK;AAAA,oBAAL,uBAAA,CAAAiB,MAAAjB,EAAK,SAAMiB;AAAA,oBACnB,aAAaH,EAAA1D,CAAA,EAAC,+BAAA;AAAA,oBACd,cAAY0D,EAAA1D,CAAA,EAAC,+BAAA;AAAA,oBACb,WAAWO,EAAA;AAAA,kBAAA;kBAEdkD,EAQEC,EAAAW,CAAA,GAAA;AAAA,oBAPS,YAAAzB,EAAK;AAAA,oBAAL,uBAAA,CAAAiB,MAAAjB,EAAK,OAAIiB;AAAA,oBACjB,SAAS9B,EAAA;AAAA,oBACV,YAAA;AAAA,oBACA,WAAA;AAAA,oBACC,aAAa2B,EAAA1D,CAAA,EAAC,yBAAA;AAAA,oBACd,cAAY0D,EAAA1D,CAAA,EAAC,4BAAA;AAAA,oBACb,WAAWO,EAAA;AAAA,kBAAA;kBAGNA,EAAA,cADR+D,EAKEZ,EAAAa,CAAA,GAAA;AAAA;oBAHA,MAAK;AAAA,oBACJ,OAAOb,EAAA1D,CAAA,EAAC,+BAAA;AAAA,oBACR,SAAK,CAAA6D,MAAE9C,EAAA,MAAM,OAAOwB,GAAK,CAAA;AAAA,kBAAA;;;cAMxBhC,EAAA,cADR+D,EAQYZ,EAAAc,CAAA,GAAA;AAAA;gBANV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACJ,SAAKC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAZ,MAAE9C,EAAA,MAAM,KAAI,EAAA,QAAA,IAAA,MAAA,MAAA;AAAA,cAAA;2BAElB,MAAqC;AAAA,sBAAlC2C,EAAA1D,CAAA,EAAC,4BAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;wBAKVsE,EAwCUZ,EAAAI,CAAA,GAAA,EAAA,KAAA,KAAA;AAAA,qBAvCR,MAAsF;AAAA,YAAtFL,EAAsFC,EAAAK,CAAA,GAAA;AAAA,cAAzE,OAAO;AAAA,cAAG,MAAK;AAAA,YAAA;yBAAK,MAAwC;AAAA,oBAArCL,EAAA1D,CAAA,EAAC,+BAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YACrCyD,EAAuFC,EAAAM,CAAA,GAAA;AAAA,cAA9E,MAAK;AAAA,cAAK,MAAK;AAAA,YAAA;yBAAQ,MAA6C;AAAA,oBAA1CN,EAAA1D,CAAA,EAAC,oCAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAEpBgB,EAAA,MAAM,WAAM,UAA5BsD,EAAqFZ,EAAAgB,EAAA,GAAA;AAAA;cAAhD,aAAahB,EAAA1D,CAAA,EAAC,4BAAA;AAAA,YAAA,iCACnDqD,KAAAC,EAuBK,MAvBLqB,IAuBK;AAAA,eAtBHtB,EAAA,EAAA,GAAAC,EAqBKE,GAAA,MAAAW,EArBuBnD,EAAA,OAAK,CAArBc,GAAMS,YAAlBe,EAqBK,MAAA;AAAA,gBArB+B,KAAKxB;AAAA,gBAAM,OAAM;AAAA,cAAA;gBACnDmC,EAAuE,QAAvEW,IAAuEC,EAAvB5C,GAAQH,CAAI,CAAA,GAAA,CAAA;AAAA,gBAC5CvB,EAAA,cAAhB+C,EAkBWE,GAAA,EAAA,KAAA,KAAA;AAAA,kBAjBTC,EAKEC,EAAAa,CAAA,GAAA;AAAA,oBAJA,MAAK;AAAA,oBACJ,OAAOb,EAAA1D,CAAA,EAAC,2BAAA;AAAA,oBACR,UAAUuC,MAAK;AAAA,oBACf,SAAK,CAAAsB,MAAEvB,EAASC,GAAK,EAAA;AAAA,kBAAA;kBAExBkB,EAKEC,EAAAa,CAAA,GAAA;AAAA,oBAJA,MAAK;AAAA,oBACJ,OAAOb,EAAA1D,CAAA,EAAC,6BAAA;AAAA,oBACR,UAAUuC,MAAUvB,EAAA,MAAM,SAAM;AAAA,oBAChC,SAAK,CAAA6C,MAAEvB,EAASC,GAAK,CAAA;AAAA,kBAAA;kBAExBkB,EAIEC,EAAAa,CAAA,GAAA;AAAA,oBAHA,MAAK;AAAA,oBACJ,OAAOb,EAAA1D,CAAA,EAAC,+BAAA;AAAA,oBACR,SAAK,CAAA6D,MAAE7C,EAAA,MAAM,OAAOuB,GAAK,CAAA;AAAA,kBAAA;;;;YAMvBhC,EAAA,SAAX8C,EAAA,GAAAC,EASM,OATNwB,IASM;AAAA,cARJrB,EAOEC,EAAAW,CAAA,GAAA;AAAA,gBANC,eAAapD,EAAA;AAAA,gBACb,SAASkB,GAAA;AAAA,gBACV,YAAA;AAAA,gBACC,aAAauB,EAAA1D,CAAA,EAAC,4BAAA;AAAA,gBACd,cAAY0D,EAAA1D,CAAA,EAAC,4BAAA;AAAA,gBACb,uBAAoBoC;AAAA,cAAA;;;;;QAKN7B,EAAA,cAArB+D,EAIgBZ,EAAAqB,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,qBAHd,MAEY;AAAA,YAFZtB,EAEYC,EAAAc,CAAA,GAAA;AAAA,cAFD,MAAK;AAAA,cAAW,SAASrD,EAAA;AAAA,cAAS,SAAO0B;AAAA,YAAA;yBAClD,MAA8B;AAAA,oBAA3Ba,EAAA1D,CAAA,EAAC,qBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;;sBApHVsD,EAGWE,GAAA,EAAA,KAAA,KAAA;AAAA,QAFTC,EAAiEC,EAAAsB,CAAA,GAAA;AAAA,UAApD,OAAA;AAAA,UAAO,MAAM;AAAA,UAAG,OAAM;AAAA,QAAA;QACnCvB,EAA4CC,EAAAI,CAAA,GAAA,MAAA;AAAA,qBAAnC,MAAyB;AAAA,YAAzBL,EAAyBC,EAAAsB,CAAA,GAAA,EAAX,MAAM,GAAC;AAAA,UAAA;;;;;;;"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { defineComponent as C, ref as E, computed as f, onMounted as M, openBlock as h, createElementBlock as P, createVNode as r, unref as t, withCtx as o, createBlock as k, withModifiers as q, createTextVNode as p, toDisplayString as u, createElementVNode as w } from "vue";
|
|
2
|
+
import { useRouter as R, RouterLink as S } from "vue-router";
|
|
3
|
+
import { useAdmin as z, useTranslate as L, useErrorText as N, rowMenuWidth as V, WxListScreen as A, WxRowMenu as I } from "@webx-ui/module-admin";
|
|
4
|
+
import { WxTable as j, WxLink as D, WxText as F, WxBadge as U, WxIcon as G, toast as m, confirm as H } from "@webx-ui/core";
|
|
5
|
+
import { j as J, a as K, _ as O } from "./index-BTEbHnJ5.js";
|
|
6
|
+
const Q = { class: "wx-catalog-profiles" }, X = { class: "wx-catalog-profiles__name" }, Y = { class: "wx-catalog-profiles__direction" }, Z = /* @__PURE__ */ C({
|
|
7
|
+
__name: "ExchangeProfilesPage",
|
|
8
|
+
props: {
|
|
9
|
+
base: { default: "/catalog" }
|
|
10
|
+
},
|
|
11
|
+
setup(v) {
|
|
12
|
+
const i = v, x = z(), g = J(x), s = R();
|
|
13
|
+
K();
|
|
14
|
+
const e = L("webx-catalog"), _ = N(), c = E(null), d = f(() => x.can("catalog.manage"));
|
|
15
|
+
async function b() {
|
|
16
|
+
try {
|
|
17
|
+
c.value = await g.profiles();
|
|
18
|
+
} catch (n) {
|
|
19
|
+
m.danger(_(n)), c.value = [];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
M(b);
|
|
23
|
+
const W = f(() => [
|
|
24
|
+
{ key: "name", label: e("panel.exchange-profile-name"), minWidth: 200 },
|
|
25
|
+
{ key: "direction", label: e("panel.exchange-profile-direction"), width: 150, hideBelow: 560 },
|
|
26
|
+
{ key: "format", label: e("panel.exchange-format"), width: 100, hideBelow: 480 },
|
|
27
|
+
{ key: "last_run_id", label: e("panel.exchange-profile-last-run"), width: 150, hideBelow: 720 },
|
|
28
|
+
{ key: "actions", label: "", width: V, align: "right" }
|
|
29
|
+
]), $ = f(
|
|
30
|
+
() => d.value ? [
|
|
31
|
+
{
|
|
32
|
+
key: "new-import",
|
|
33
|
+
label: e("panel.exchange-new-import-profile"),
|
|
34
|
+
icon: "plus",
|
|
35
|
+
primary: !0,
|
|
36
|
+
run: () => {
|
|
37
|
+
s.push({
|
|
38
|
+
path: `${i.base}/exchange/profiles/new`,
|
|
39
|
+
query: { direction: "import" }
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: "new-export",
|
|
45
|
+
label: e("panel.exchange-new-export-profile"),
|
|
46
|
+
icon: "plus",
|
|
47
|
+
run: () => {
|
|
48
|
+
s.push({
|
|
49
|
+
path: `${i.base}/exchange/profiles/new`,
|
|
50
|
+
query: { direction: "export" }
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
] : []
|
|
55
|
+
);
|
|
56
|
+
function y(n) {
|
|
57
|
+
s.push(`${i.base}/exchange/profiles/${n.id}`);
|
|
58
|
+
}
|
|
59
|
+
async function B(n) {
|
|
60
|
+
if (await H({
|
|
61
|
+
title: e("panel.exchange-profile-delete-title", { name: n.name }),
|
|
62
|
+
message: e("panel.exchange-profile-delete-text"),
|
|
63
|
+
confirmText: e("panel.exchange-delete"),
|
|
64
|
+
cancelText: e("panel.cancel"),
|
|
65
|
+
tone: "danger"
|
|
66
|
+
}))
|
|
67
|
+
try {
|
|
68
|
+
await g.removeProfile(n.id), m.success(e("panel.exchange-profile-deleted")), await b();
|
|
69
|
+
} catch (a) {
|
|
70
|
+
m.danger(_(a));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function T(n) {
|
|
74
|
+
const l = [];
|
|
75
|
+
return n.direction === "import" && d.value && l.push({
|
|
76
|
+
key: "run",
|
|
77
|
+
icon: "upload",
|
|
78
|
+
label: e("panel.exchange-profile-run"),
|
|
79
|
+
run: () => {
|
|
80
|
+
s.push({
|
|
81
|
+
path: `${i.base}/exchange/import`,
|
|
82
|
+
query: { profile: String(n.id) }
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}), l.push({
|
|
86
|
+
key: "edit",
|
|
87
|
+
icon: "edit",
|
|
88
|
+
label: e("panel.exchange-profile-edit"),
|
|
89
|
+
run: () => y(n)
|
|
90
|
+
}), d.value && l.push({
|
|
91
|
+
key: "delete",
|
|
92
|
+
icon: "trash",
|
|
93
|
+
label: e("panel.exchange-delete"),
|
|
94
|
+
danger: !0,
|
|
95
|
+
run: () => {
|
|
96
|
+
B(n);
|
|
97
|
+
}
|
|
98
|
+
}), l;
|
|
99
|
+
}
|
|
100
|
+
return (n, l) => (h(), P("div", Q, [
|
|
101
|
+
r(t(A), {
|
|
102
|
+
title: t(e)("panel.exchange-profiles-title"),
|
|
103
|
+
subtitle: t(e)("panel.exchange-profiles-help"),
|
|
104
|
+
back: `${i.base}/exchange`,
|
|
105
|
+
"back-label": t(e)("panel.exchange-title"),
|
|
106
|
+
actions: $.value
|
|
107
|
+
}, {
|
|
108
|
+
default: o(() => [
|
|
109
|
+
r(t(j), {
|
|
110
|
+
data: c.value ?? [],
|
|
111
|
+
columns: W.value,
|
|
112
|
+
"row-key": "id",
|
|
113
|
+
flush: "",
|
|
114
|
+
layout: "fixed",
|
|
115
|
+
loading: c.value === null,
|
|
116
|
+
"empty-text": t(e)("panel.exchange-profiles-empty"),
|
|
117
|
+
"aria-label": t(e)("panel.exchange-profiles-title"),
|
|
118
|
+
onRowClick: y
|
|
119
|
+
}, {
|
|
120
|
+
"cell-name": o(({ row: a }) => [
|
|
121
|
+
w("span", X, u(a.name), 1)
|
|
122
|
+
]),
|
|
123
|
+
"cell-direction": o(({ row: a }) => [
|
|
124
|
+
w("span", Y, [
|
|
125
|
+
r(t(G), {
|
|
126
|
+
name: a.direction === "import" ? "upload" : "download",
|
|
127
|
+
size: "sm"
|
|
128
|
+
}, null, 8, ["name"]),
|
|
129
|
+
p(" " + u(t(e)(`panel.exchange-${a.direction}`)), 1)
|
|
130
|
+
])
|
|
131
|
+
]),
|
|
132
|
+
"cell-format": o(({ row: a }) => [
|
|
133
|
+
r(t(U), { size: "sm" }, {
|
|
134
|
+
default: o(() => [
|
|
135
|
+
p(u(a.format.toUpperCase()), 1)
|
|
136
|
+
]),
|
|
137
|
+
_: 2
|
|
138
|
+
}, 1024)
|
|
139
|
+
]),
|
|
140
|
+
"cell-last_run_id": o(({ row: a }) => [
|
|
141
|
+
a.last_run_id !== null ? (h(), k(t(D), {
|
|
142
|
+
key: 0,
|
|
143
|
+
as: t(S),
|
|
144
|
+
to: { path: `${i.base}/exchange`, query: { run: String(a.last_run_id) } },
|
|
145
|
+
onClick: l[0] || (l[0] = q(() => {
|
|
146
|
+
}, ["stop"]))
|
|
147
|
+
}, {
|
|
148
|
+
default: o(() => [
|
|
149
|
+
p(" #" + u(a.last_run_id), 1)
|
|
150
|
+
]),
|
|
151
|
+
_: 2
|
|
152
|
+
}, 1032, ["as", "to"])) : (h(), k(t(F), {
|
|
153
|
+
key: 1,
|
|
154
|
+
size: "sm",
|
|
155
|
+
tone: "muted"
|
|
156
|
+
}, {
|
|
157
|
+
default: o(() => [...l[1] || (l[1] = [
|
|
158
|
+
p("—", -1)
|
|
159
|
+
])]),
|
|
160
|
+
_: 1
|
|
161
|
+
}))
|
|
162
|
+
]),
|
|
163
|
+
"cell-actions": o(({ row: a }) => [
|
|
164
|
+
r(t(I), {
|
|
165
|
+
actions: T(a),
|
|
166
|
+
label: a.name
|
|
167
|
+
}, null, 8, ["actions", "label"])
|
|
168
|
+
]),
|
|
169
|
+
_: 1
|
|
170
|
+
}, 8, ["data", "columns", "loading", "empty-text", "aria-label"])
|
|
171
|
+
]),
|
|
172
|
+
_: 1
|
|
173
|
+
}, 8, ["title", "subtitle", "back", "back-label", "actions"])
|
|
174
|
+
]));
|
|
175
|
+
}
|
|
176
|
+
}), oe = /* @__PURE__ */ O(Z, [["__scopeId", "data-v-6359059c"]]);
|
|
177
|
+
export {
|
|
178
|
+
oe as default
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=ExchangeProfilesPage-T6G3HHD8.js.map
|