@webx-ui/module-catalog-landings 0.2.2 → 0.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CL_q1v5T.js","sources":["../src/editor.ts","../src/messages.ts","../src/i18n.ts","../src/LandingProductsField.vue","../src/api.ts","../src/LandingSetField.vue","../src/LandingSlugField.vue","../src/LandingSortField.vue","../src/module.ts","../src/index.ts"],"sourcesContent":["import { inject, provide, type InjectionKey, type Ref } from 'vue'\nimport type { ScreenModel } from '@webx-ui/schema'\nimport type { LandingDetail } from './types'\n\n/**\n * What the landing's form shares with the fields of its screen: the set builder reads the base\n * from the values, the address reads the set's suggestion, the recommended products read the\n * names the server sent with the ids.\n */\nexport interface LandingEditorContext {\n /** As the server last answered; `null` for a landing not created yet. */\n landing: Ref<LandingDetail | null>\n values: Ref<ScreenModel>\n locked: Ref<boolean>\n /** The slugs the set suggests, per language — written by the set builder after each count. */\n suggested: Ref<Record<string, string>>\n /** Where the landings' list is: `/catalog/landings`. */\n list: string\n}\n\nexport const landingEditorKey: InjectionKey<LandingEditorContext> = Symbol('wx-catalog-landing')\n\nexport function provideLandingEditor(context: LandingEditorContext): void {\n provide(landingEditorKey, context)\n}\n\n/** `null` outside the landing's page — a field put on another screen keeps working on its own. */\nexport function useLandingEditor(): LandingEditorContext | null {\n return inject(landingEditorKey, null)\n}\n","import type { Messages } from '@webx-ui/module-admin'\n\n/**\n * The English this package speaks on its own, before the server's dictionary arrives, or without\n * one. The server ships the same lines under `webx-catalog-landings::` and overrides these — the\n * Russian is there; `messages.test.ts` keeps the two sets of keys equal.\n */\nexport const catalogLandingsMessages: Record<string, Messages> = {\n module: {\n title: 'Landings',\n landing: 'Landing',\n },\n landing: {\n category_id: 'Base',\n filters: 'Set',\n name: 'Name',\n slug: 'Address',\n h1: 'H1',\n text_above: 'Text above the list',\n text_below: 'Text under the list',\n sort: 'Default sort',\n on_category: 'In the category’s collections',\n position: 'Order',\n is_published: 'Published',\n attention: 'Needs attention',\n 'whole-catalog': 'The whole catalogue',\n 'tab-main': 'Main',\n 'tab-texts': 'Texts',\n 'tab-recommended': 'Recommended',\n 'tab-seo': 'SEO',\n 'tab-history': 'History',\n display: 'On the site',\n 'name-help': 'The label in the panel and in the links of the collections.',\n 'category-help': 'The list the landing narrows. Empty — the whole catalogue.',\n 'slug-help': 'From the site’s root, like a category’s: /laptops-apple/.',\n 'sort-help': 'The order a reader sees first; the one they choose wins.',\n 'sort-default': 'As the category',\n 'on-category-help': 'A link in «Collections» on the page of the base.',\n 'position-help': 'Smaller first, in the collections and among the neighbours.',\n 'h1-help': 'Empty — the name.',\n 'text-help': 'Shown on the landing’s first page with nothing more chosen.',\n recommended: 'Recommended products',\n 'recommended-help': 'A strip over the list, in this order; the list itself does not change.',\n 'recommended-search': 'Find a product by name or SKU',\n 'recommended-empty': 'No products picked.',\n 'recommended-remove': 'Remove',\n 'set-add': 'Add a facet',\n 'set-empty': 'Add a facet and choose its values.',\n 'set-remove': 'Remove the facet',\n 'set-values': 'Choose values',\n 'set-from': 'From',\n 'set-to': 'To',\n 'set-count': 'Products: :count',\n 'set-counting': 'Counting…',\n 'set-taken': 'This set on this base is already the landing «:name».',\n 'set-open-taken': 'Open it',\n 'slug-suggested': 'Suggested: :slug',\n 'slug-use': 'Use',\n 'attention-value_removed': 'A value of the set was deleted',\n 'attention-duplicate': 'The set became another landing’s',\n 'attention-empty_set': 'Nothing is left of the set',\n },\n panel: {\n new: 'New landing',\n generate: 'Create in bulk',\n empty: 'No landings yet.',\n 'empty-help':\n 'A landing is a category’s list with filters chosen in advance, under an address, texts and SEO of its own.',\n 'nothing-found': 'Nothing matches the filters.',\n search: 'Name or address',\n 'column-name': 'Name',\n 'column-base': 'Base',\n 'column-set': 'Set',\n 'column-count': 'Products',\n 'column-state': 'State',\n 'column-updated': 'Updated',\n 'filter-base': 'Base',\n 'filter-attention': 'Needs attention',\n 'filter-published': 'Published only',\n 'filter-empty': 'Empty only',\n 'filter-trashed': 'In the bin',\n published: 'Published',\n unpublished: 'Not published',\n 'not-counted': 'Not counted yet',\n open: 'Open',\n 'open-site': 'Open on the site',\n publish: 'Publish',\n unpublish: 'Unpublish',\n delete: 'Delete',\n restore: 'Restore',\n 'delete-title': 'Delete «:name»?',\n 'delete-text':\n 'It goes to the bin, and its address stops answering. Its set stays taken until it is gone for good.',\n deleted: 'The landing is in the bin.',\n restored: 'The landing is back.',\n 'published-toast': 'The landing is published.',\n 'unpublished-toast': 'The landing is unpublished.',\n saved: 'The landing is saved.',\n created: 'The landing is created.',\n save: 'Save',\n create: 'Create',\n 'save-failed': 'Not saved — see the fields.',\n cancel: 'Cancel',\n 'leave-title': 'Leave without saving?',\n 'leave-text': 'What you changed here will be lost.',\n leave: 'Leave',\n untitled: 'A new landing',\n 'in-bin': 'In the bin',\n trail: 'Where you are',\n },\n generate: {\n title: 'Create landings in bulk',\n bases: 'Bases',\n 'bases-help': 'One category or several; a landing per category and value.',\n subtree: 'With every category under them',\n facet: 'Facet',\n values: 'Values',\n 'values-help': 'Empty — every value with products on the base.',\n 'min-products': 'At least products',\n 'min-products-help': 'For «every value»: values with fewer products on the base are left out.',\n templates: 'Templates',\n 'templates-help':\n '{category} and {value} are replaced: the slugs in the address, the names in the texts.',\n slug: 'Address',\n name: 'Name',\n h1: 'H1',\n 'seo-title': 'SEO title',\n 'seo-description': 'SEO description',\n 'template-empty': 'Empty — not set',\n publish: 'Publish at once',\n preview: 'Preview',\n back: 'Back',\n run: 'Create :count',\n close: 'Close',\n 'column-address': 'Address',\n 'column-h1': 'H1',\n 'column-count': 'Products',\n 'column-conflict': 'Skipped because',\n summary: 'Will be created: :free; skipped: :skipped.',\n nothing: 'Nothing to create: every row is skipped.',\n running: 'Creating landings…',\n done: 'Created: :done; skipped: :skipped; refused: :failed.',\n failed: 'The generation stopped. What was created stays.',\n 'conflict-slug-taken': 'The address :slug is taken.',\n 'conflict-set-taken': 'The set is already the landing «:name».',\n 'conflict-empty': 'No products.',\n 'conflict-no-slug': 'A slug or a name to fill the template with is missing.',\n },\n}\n","import { useAdmin } from '@webx-ui/module-admin'\nimport { catalogLandingsMessages } from './messages'\n\n/** The server's dictionary for this package: `webx-catalog-landings::`. */\nexport const NAMESPACE = 'webx-catalog-landings'\n\nconst seeded = new WeakSet<object>()\n\n/** Puts this package's English under the panel's dictionary, once per panel. */\nexport function useCatalogLandingsMessages(): void {\n try {\n const { i18n } = useAdmin()\n\n if (!seeded.has(i18n)) {\n i18n.defaults(NAMESPACE, catalogLandingsMessages)\n seeded.add(i18n)\n }\n } catch {\n // Outside a panel there is no dictionary to seed, and `useTranslate` falls back on its own.\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n WxAutocomplete,\n WxBadge,\n WxButton,\n WxIcon,\n WxSortableList,\n WxText,\n type AutocompleteOption,\n WxPopconfirm,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText, useRemoveConfirm, useTranslate } from '@webx-ui/module-admin'\nimport { createCatalogApi } from '@webx-ui/module-catalog'\nimport { useLandingEditor } from './editor'\nimport { NAMESPACE, useCatalogLandingsMessages } from './i18n'\nimport type { RecommendedItem } from './types'\n\n/**\n * `wx-catalog-landing-products`: the recommended strip of a landing (decision 8) — products found\n * by name or SKU and put in order by dragging. The field's value is the ids in their order; the\n * names come with the landing from the server and with each product found, so the list never asks\n * for products one by one.\n */\ndefineOptions({ name: 'WxCatalogLandingProducts' })\n\nconst value = defineModel<number[] | null>({ default: null })\n\nconst admin = useAdmin()\nconst catalog = createCatalogApi(admin)\nconst editor = useLandingEditor()\nuseCatalogLandingsMessages()\n\nconst t = useTranslate(NAMESPACE)\nconst askRemove = useRemoveConfirm()\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst locked = computed(() => editor?.locked.value ?? false)\n\n/** Every product this field has seen a name for: the saved ones and the ones found since. */\nconst known = ref(new Map<number, RecommendedItem>())\n\nwatch(\n () => editor?.landing.value?.recommended_items,\n (items) => {\n for (const item of items ?? []) known.value.set(item.id, item)\n },\n { immediate: true },\n)\n\nconst items = computed<RecommendedItem[]>({\n get: () =>\n (value.value ?? []).map(\n (id) => known.value.get(id) ?? { id, name: `#${id}`, sku: null, deleted: false },\n ),\n set: (next) => {\n value.value = next.map((item) => item.id)\n },\n})\n\nconst term = ref('')\nconst options = ref<AutocompleteOption[]>([])\nconst searching = ref(false)\nconst failed = ref('')\nlet asked = 0\n\nasync function search(q: string): Promise<void> {\n const ticket = ++asked\n\n searching.value = true\n failed.value = ''\n\n try {\n const page = await catalog.products({ q, per_page: 10 })\n\n if (ticket !== asked) return\n\n const taken = new Set(value.value ?? [])\n\n options.value = page.data\n .filter((product) => !taken.has(product.id))\n .map((product) => {\n known.value.set(product.id, { id: product.id, name: product.name, sku: product.sku })\n\n return {\n value: String(product.id),\n label: product.name,\n description: product.sku ?? undefined,\n }\n })\n } catch (error) {\n if (ticket === asked) failed.value = message(error)\n } finally {\n if (ticket === asked) searching.value = false\n }\n}\n\nfunction pick(option: AutocompleteOption): void {\n const id = Number(option.value)\n\n if (!Number.isFinite(id) || (value.value ?? []).includes(id)) return\n\n value.value = [...(value.value ?? []), id]\n term.value = ''\n options.value = []\n}\n\nfunction drop(id: number): void {\n value.value = (value.value ?? []).filter((one) => one !== id)\n}\n</script>\n\n<template>\n <div class=\"wx-catalog-landing-products\">\n <wx-autocomplete\n v-if=\"!locked\"\n v-model=\"term\"\n :options=\"options\"\n remote\n :loading=\"searching\"\n :min-length=\"1\"\n clearable\n :placeholder=\"t('landing.recommended-search')\"\n :aria-label=\"t('landing.recommended-search')\"\n @search=\"search\"\n @select=\"pick\"\n />\n <wx-text v-if=\"failed\" size=\"sm\" tone=\"danger\">{{ failed }}</wx-text>\n\n <wx-sortable-list\n v-model=\"items\"\n :drag-label=\"panel('filters.reorder')\"\n item-key=\"id\"\n item-label=\"name\"\n size=\"sm\"\n :disabled=\"locked\"\n :empty-text=\"t('landing.recommended-empty')\"\n :aria-label=\"t('landing.recommended')\"\n >\n <template #default=\"{ item }\">\n <span class=\"wx-catalog-landing-products__item\">\n <span class=\"wx-catalog-landing-products__name\">{{ item.name }}</span>\n <wx-text v-if=\"item.sku\" size=\"sm\" tone=\"muted\">{{ item.sku }}</wx-text>\n <wx-badge v-if=\"item.deleted\" size=\"sm\" type=\"warning\" round>\n {{ t('panel.in-bin') }}\n </wx-badge>\n </span>\n </template>\n <template #actions=\"{ item }\">\n <wx-popconfirm\n v-if=\"!locked\"\n :title=\"askRemove.confirm\"\n :confirm-text=\"askRemove.confirmText\"\n :cancel-text=\"askRemove.cancelText\"\n confirm-type=\"danger\"\n @confirm=\"drop(item.id)\"\n >\n <template #trigger>\n <wx-button\n variant=\"text\"\n size=\"sm\"\n :aria-label=\"`${t('landing.recommended-remove')}: ${item.name}`\"\n >\n <template #icon><wx-icon name=\"close\" /></template>\n </wx-button>\n </template>\n </wx-popconfirm>\n </template>\n </wx-sortable-list>\n </div>\n</template>\n\n<style scoped>\n.wx-catalog-landing-products {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-catalog-landing-products__item {\n display: flex;\n align-items: baseline;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-catalog-landing-products__name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n</style>\n","import type { AdminContext } from '@webx-ui/module-admin'\nimport type {\n BaseFacet,\n GenerateParams,\n GeneratePreview,\n GenerateRun,\n LandingDetail,\n LandingFilters,\n LandingQuery,\n LandingsPage,\n SetCount,\n} from './types'\n\n/** Where the landings answer under the panel's API (§8.4 of the landings spec). */\nexport const LANDINGS_API = 'catalog/landings'\n\n/** The list's question as a query string; a filter left unset is not sent at all. */\nexport function landingSearch(query: LandingQuery): URLSearchParams {\n const search = new URLSearchParams()\n\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === '') continue\n\n search.set(key, typeof value === 'boolean' ? (value ? '1' : '0') : String(value))\n }\n\n return search\n}\n\nexport interface CatalogLandingsApi {\n list(query?: LandingQuery): Promise<LandingsPage>\n get(id: number): Promise<LandingDetail>\n create(values: Record<string, unknown>): Promise<LandingDetail>\n save(id: number, values: Record<string, unknown>): Promise<LandingDetail>\n remove(id: number): Promise<void>\n restore(id: number): Promise<LandingDetail>\n publish(id: number, on: boolean): Promise<LandingDetail>\n count(\n categoryId: number | null,\n filters: LandingFilters,\n except?: number | null,\n ): Promise<SetCount>\n facets(categoryId: number | null): Promise<BaseFacet[]>\n preview(params: GenerateParams): Promise<GeneratePreview>\n generate(params: GenerateParams): Promise<GenerateRun>\n run(id: number): Promise<GenerateRun>\n}\n\nexport function createLandingsApi(admin: AdminContext): CatalogLandingsApi {\n const base = `${admin.apiPath}/${LANDINGS_API}`\n const data = <T>(body: { data: T }): T => body.data\n\n return {\n list: (query = {}) => {\n const search = landingSearch(query)\n\n return admin.http.get<LandingsPage>(search.size > 0 ? `${base}?${search}` : base)\n },\n get: (id) => admin.http.get<{ data: LandingDetail }>(`${base}/${id}`).then(data),\n create: (values) => admin.http.post<{ data: LandingDetail }>(base, values).then(data),\n save: (id, values) =>\n admin.http.put<{ data: LandingDetail }>(`${base}/${id}`, values).then(data),\n remove: (id) => admin.http.delete<void>(`${base}/${id}`).then(() => undefined),\n restore: (id) =>\n admin.http.post<{ data: LandingDetail }>(`${base}/${id}/restore`, {}).then(data),\n publish: (id, on) =>\n admin.http\n .post<{ data: LandingDetail }>(`${base}/${id}/${on ? 'publish' : 'unpublish'}`, {})\n .then(data),\n count: (categoryId, filters, except = null) =>\n admin.http\n .post<{ data: SetCount }>(`${base}/count`, { category_id: categoryId, filters, except })\n .then(data),\n facets: (categoryId) =>\n admin.http\n .get<{\n data: BaseFacet[]\n }>(categoryId === null ? `${base}/facets` : `${base}/facets?category=${categoryId}`)\n .then(data),\n preview: (params) =>\n admin.http\n .post<{ data: GeneratePreview }>(`${base}/generate`, { ...params, dry_run: true })\n .then(data),\n generate: (params) =>\n admin.http.post<{ data: GenerateRun }>(`${base}/generate`, params).then(data),\n run: (id) => admin.http.get<{ data: GenerateRun }>(`${base}/generate/${id}`).then(data),\n }\n}\n\n/** The fields of the form a save sends; what the list shows beside them is not the form's. */\nexport const FORM_FIELDS = [\n 'category_id',\n 'filters',\n 'name',\n 'slug',\n 'h1',\n 'text_above',\n 'text_below',\n 'sort',\n 'on_category',\n 'position',\n 'recommended',\n 'seo',\n] as const\n\n/** A landing's values as the form holds them. */\nexport function formValues(detail: LandingDetail): Record<string, unknown> {\n const values: Record<string, unknown> = {}\n\n for (const field of FORM_FIELDS) values[field] = detail[field] ?? null\n\n // The table keeps an empty set as `[]` when PHP encodes an empty array.\n if (Array.isArray(values.filters)) values.filters = {}\n\n return values\n}\n\n/**\n * A set without the facets that say nothing — a list with no value, a range with no end — so\n * that a half-built facet neither counts nor fails a save.\n */\nexport function cleanSet(filters: LandingFilters | null | undefined): LandingFilters {\n const clean: LandingFilters = {}\n\n for (const [key, choice] of Object.entries(filters ?? {})) {\n if ('values' in choice) {\n if (choice.values.length > 0) clean[key] = { values: [...choice.values] }\n } else if (choice.min !== null || choice.max !== null) {\n clean[key] = { min: choice.min, max: choice.max }\n }\n }\n\n return clean\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { RouterLink } from 'vue-router'\nimport {\n WxAlert,\n WxBadge,\n WxButton,\n WxIcon,\n WxInputNumber,\n WxLink,\n WxSelect,\n WxText,\n type SelectOption,\n WxPopconfirm,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText, useRemoveConfirm, useTranslate } from '@webx-ui/module-admin'\nimport { cleanSet, createLandingsApi } from './api'\nimport { useLandingEditor } from './editor'\nimport { NAMESPACE, useCatalogLandingsMessages } from './i18n'\nimport type { BaseFacet, LandingFilters, SetChoice, SetCount } from './types'\n\n/**\n * `wx-catalog-landing-set`: the set of a landing (§8.2 of the landings spec) — «add a facet» out of\n * the facets the base offers, its values in the same controls the products' filter uses (a list\n * of values with search, a range from–to), and beside them the live number of products and a\n * warning when another landing of the base already holds the set.\n *\n * The facets are asked again when the base changes; a facet of the set the new base does not offer\n * stays, labelled by its key, so that changing the base never drops a choice silently — the save\n * says whether the set still makes sense.\n */\ndefineOptions({ name: 'WxCatalogLandingSet' })\n\nconst value = defineModel<LandingFilters | null>({ default: null })\n\nconst admin = useAdmin()\nconst api = createLandingsApi(admin)\nconst editor = useLandingEditor()\nuseCatalogLandingsMessages()\n\nconst t = useTranslate(NAMESPACE)\nconst askRemove = useRemoveConfirm()\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst locked = computed(() => editor?.locked.value ?? false)\n\nconst category = computed<number | null>(() => {\n const id = editor?.values.value.category_id\n\n return typeof id === 'number' ? id : id ? Number(id) : null\n})\n\nconst offered = ref<BaseFacet[]>([])\nconst loadFailed = ref('')\nconst set = computed<LandingFilters>(() =>\n value.value && !Array.isArray(value.value) ? value.value : {},\n)\n\nconst facetOf = (key: string) => offered.value.find((facet) => facet.key === key)\n\nconst adding = computed<SelectOption[]>(() =>\n offered.value\n .filter((facet) => !(facet.key in set.value))\n .map((facet) => ({ value: facet.key, label: facet.label })),\n)\n\nlet asked = 0\n\nasync function loadFacets(): Promise<void> {\n const ticket = ++asked\n\n loadFailed.value = ''\n\n try {\n const answer = await api.facets(category.value)\n\n if (ticket === asked) offered.value = answer\n } catch (error) {\n if (ticket === asked) loadFailed.value = message(error)\n }\n}\n\nwatch(category, () => void loadFacets(), { immediate: true })\n\nfunction isRange(key: string, choice: SetChoice): boolean {\n const facet = facetOf(key)\n\n return facet ? facet.kind === 'range' : !('values' in choice)\n}\n\nfunction write(next: LandingFilters): void {\n value.value = next\n}\n\nfunction add(key: unknown): void {\n const facet = facetOf(String(key))\n\n if (!facet) return\n\n write({\n ...set.value,\n [facet.key]: facet.kind === 'range' ? { min: null, max: null } : { values: [] },\n })\n}\n\nfunction remove(key: string): void {\n const next = { ...set.value }\n\n delete next[key]\n write(next)\n}\n\nfunction valuesOf(choice: SetChoice): string[] {\n return 'values' in choice ? choice.values : []\n}\n\nfunction rangeOf(choice: SetChoice): { min: number | null; max: number | null } {\n return 'values' in choice ? { min: null, max: null } : choice\n}\n\nfunction optionsOf(key: string, choice: SetChoice): SelectOption[] {\n const known = facetOf(key)?.values ?? []\n const options: SelectOption[] = known.map((one) => ({\n value: one.value,\n label: `${one.label} (${one.count})`,\n }))\n\n // A chosen value the base has no products of is still a choice: shown, not dropped.\n for (const chosen of valuesOf(choice)) {\n if (!known.some((one) => one.value === chosen)) {\n const word = chipWord(key, chosen)\n options.push({ value: chosen, label: `${word} (0)` })\n }\n }\n\n return options\n}\n\n/** The saved landing's chip says what a value is called when the base no longer counts it. */\nfunction chipWord(key: string, chosen: string): string {\n return editor?.landing.value?.chips.find((chip) => chip.key === key)?.text ?? `#${chosen}`\n}\n\nfunction pick(key: string, picked: unknown): void {\n write({ ...set.value, [key]: { values: Array.isArray(picked) ? picked.map(String) : [] } })\n}\n\nfunction bound(key: string, end: 'min' | 'max', picked: number | null | undefined): void {\n const choice = set.value[key]\n const range = choice ? rangeOf(choice) : { min: null, max: null }\n\n write({ ...set.value, [key]: { ...range, [end]: picked ?? null } })\n}\n\nfunction labelOf(key: string): string {\n return facetOf(key)?.label ?? key\n}\n\n/* -------------------------------------------------------------------- the count --- */\n\nconst counted = ref<SetCount | null>(null)\nconst counting = ref(false)\nconst countFailed = ref('')\nlet timer: ReturnType<typeof setTimeout> | undefined\nlet countTicket = 0\n\nconst question = computed(() => JSON.stringify([category.value, cleanSet(set.value)]))\n\nasync function count(): Promise<void> {\n const ticket = ++countTicket\n const clean = cleanSet(set.value)\n\n if (Object.keys(clean).length === 0) {\n counted.value = null\n counting.value = false\n if (editor) editor.suggested.value = {}\n\n return\n }\n\n counting.value = true\n countFailed.value = ''\n\n try {\n const answer = await api.count(category.value, clean, editor?.landing.value?.id ?? null)\n\n if (ticket !== countTicket) return\n\n counted.value = answer\n if (editor) editor.suggested.value = Array.isArray(answer.suggested) ? {} : answer.suggested\n } catch (error) {\n if (ticket === countTicket) {\n counted.value = null\n countFailed.value = message(error)\n }\n } finally {\n if (ticket === countTicket) counting.value = false\n }\n}\n\nwatch(\n question,\n () => {\n clearTimeout(timer)\n timer = setTimeout(() => void count(), 350)\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => clearTimeout(timer))\n\nconst takenLink = computed(() =>\n counted.value?.taken && editor ? `${editor.list}/${counted.value.taken.id}` : null,\n)\n</script>\n\n<template>\n <div class=\"wx-catalog-landing-set\">\n <wx-alert v-if=\"loadFailed\" type=\"danger\">{{ loadFailed }}</wx-alert>\n\n <wx-text v-if=\"Object.keys(set).length === 0\" tone=\"muted\" size=\"sm\">\n {{ t('landing.set-empty') }}\n </wx-text>\n\n <div\n v-for=\"(choice, key) in set\"\n :key=\"key\"\n class=\"wx-catalog-landing-set__row\"\n :data-facet=\"key\"\n >\n <wx-text class=\"wx-catalog-landing-set__label\" size=\"sm\" weight=\"medium\">\n {{ labelOf(String(key)) }}\n </wx-text>\n\n <div v-if=\"isRange(String(key), choice)\" class=\"wx-catalog-landing-set__range\">\n <wx-input-number\n :model-value=\"rangeOf(choice).min\"\n :controls=\"false\"\n :disabled=\"locked\"\n size=\"sm\"\n :placeholder=\"facetOf(String(key))?.min?.toString() ?? t('landing.set-from')\"\n :aria-label=\"`${labelOf(String(key))}: ${t('landing.set-from')}`\"\n @update:model-value=\"\n (picked: number | null | undefined) => bound(String(key), 'min', picked)\n \"\n />\n <wx-input-number\n :model-value=\"rangeOf(choice).max\"\n :controls=\"false\"\n :disabled=\"locked\"\n size=\"sm\"\n :placeholder=\"facetOf(String(key))?.max?.toString() ?? t('landing.set-to')\"\n :aria-label=\"`${labelOf(String(key))}: ${t('landing.set-to')}`\"\n @update:model-value=\"\n (picked: number | null | undefined) => bound(String(key), 'max', picked)\n \"\n />\n </div>\n\n <wx-select\n v-else\n :empty-text=\"panel('filters.nothing-found')\"\n class=\"wx-catalog-landing-set__values\"\n :model-value=\"valuesOf(choice)\"\n :options=\"optionsOf(String(key), choice)\"\n multiple\n filterable\n clearable\n size=\"sm\"\n :disabled=\"locked\"\n :placeholder=\"t('landing.set-values')\"\n :aria-label=\"labelOf(String(key))\"\n @update:model-value=\"(picked: unknown) => pick(String(key), picked)\"\n />\n\n <wx-popconfirm\n :title=\"askRemove.confirm\"\n :confirm-text=\"askRemove.confirmText\"\n :cancel-text=\"askRemove.cancelText\"\n confirm-type=\"danger\"\n :disabled=\"locked\"\n @confirm=\"remove(String(key))\"\n >\n <template #trigger>\n <wx-button\n variant=\"text\"\n size=\"sm\"\n :disabled=\"locked\"\n :aria-label=\"t('landing.set-remove')\"\n :title=\"t('landing.set-remove')\"\n >\n <template #icon><wx-icon name=\"close\" /></template>\n </wx-button>\n </template>\n </wx-popconfirm>\n </div>\n\n <div class=\"wx-catalog-landing-set__foot\">\n <wx-select\n v-if=\"adding.length > 0\"\n :empty-text=\"panel('filters.nothing-found')\"\n class=\"wx-catalog-landing-set__add\"\n :model-value=\"null\"\n :options=\"adding\"\n filterable\n size=\"sm\"\n :disabled=\"locked\"\n :placeholder=\"t('landing.set-add')\"\n :aria-label=\"t('landing.set-add')\"\n @update:model-value=\"add\"\n />\n\n <wx-text v-if=\"counting\" size=\"sm\" tone=\"muted\">{{ t('landing.set-counting') }}</wx-text>\n <wx-badge\n v-else-if=\"counted\"\n class=\"wx-catalog-landing-set__count\"\n :type=\"counted.count > 0 ? 'success' : 'warning'\"\n size=\"sm\"\n round\n >\n {{ t('landing.set-count', { count: counted.count }) }}\n </wx-badge>\n </div>\n\n <wx-alert v-if=\"countFailed\" type=\"danger\">{{ countFailed }}</wx-alert>\n\n <wx-alert v-if=\"counted?.taken\" type=\"warning\">\n {{ t('landing.set-taken', { name: counted.taken.name }) }}\n <wx-link v-if=\"takenLink\" :as=\"RouterLink\" :to=\"takenLink\">\n {{ t('landing.set-open-taken') }}\n </wx-link>\n </wx-alert>\n </div>\n</template>\n\n<style scoped>\n.wx-catalog-landing-set {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n container-type: inline-size;\n min-width: 0;\n}\n\n.wx-catalog-landing-set__row {\n display: grid;\n grid-template-columns: minmax(96px, 160px) minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--wx-space-8);\n}\n\n.wx-catalog-landing-set__range {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: var(--wx-space-8);\n}\n\n.wx-catalog-landing-set__foot {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-12);\n}\n\n.wx-catalog-landing-set__add {\n width: 240px;\n max-width: 100%;\n}\n\n@container (max-width: 480px) {\n .wx-catalog-landing-set__row {\n grid-template-columns: minmax(0, 1fr) auto;\n }\n\n .wx-catalog-landing-set__label {\n grid-column: 1 / -1;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useLocales, WxButton, WxInput, WxText, type LocalizedValue } from '@webx-ui/core'\nimport { useTranslate } from '@webx-ui/module-admin'\nimport { useLandingEditor } from './editor'\nimport { NAMESPACE, useCatalogLandingsMessages } from './i18n'\n\n/**\n * `wx-catalog-landing-slug`: the address of a landing, per language, with the suggestion its set\n * makes under it — `{category}-{value}` of the slugs, as «Create in bulk» fills it (§8.2). The\n * set builder asks the server and puts the suggestion into the editor; «Use» writes it into the\n * language being edited and into the languages still empty.\n */\ndefineOptions({ name: 'WxCatalogLandingSlug' })\n\nconst props = withDefaults(defineProps<{ localized?: boolean }>(), { localized: false })\nconst value = defineModel<LocalizedValue | string | null>({ default: null })\n\nconst editor = useLandingEditor()\nconst locales = useLocales()\nuseCatalogLandingsMessages()\n\nconst t = useTranslate(NAMESPACE)\n\nconst locked = computed(() => editor?.locked.value ?? false)\nconst record = computed<LocalizedValue>(() =>\n value.value && typeof value.value === 'object' ? value.value : {},\n)\n\nconst suggestion = computed(() => {\n const suggested = editor?.suggested.value ?? {}\n const locale = locales.active.value || Object.keys(suggested)[0] || ''\n const slug = suggested[locale]\n\n if (!slug) return null\n\n const current = props.localized ? record.value[locale] : value.value\n\n return current === slug ? null : slug\n})\n\nfunction use(): void {\n const suggested = editor?.suggested.value ?? {}\n\n if (!props.localized) {\n value.value = suggestion.value\n\n return\n }\n\n const next: LocalizedValue = { ...record.value }\n const active = locales.active.value\n\n for (const [locale, slug] of Object.entries(suggested)) {\n if (locale === active || !next[locale]) next[locale] = slug\n }\n\n value.value = next\n}\n</script>\n\n<template>\n <div class=\"wx-catalog-landing-slug\">\n <wx-input\n :model-value=\"value ?? undefined\"\n :localized=\"props.localized\"\n :disabled=\"locked\"\n :maxlength=\"255\"\n @update:model-value=\"(next: unknown) => (value = next as LocalizedValue | string)\"\n />\n <div v-if=\"suggestion && !locked\" class=\"wx-catalog-landing-slug__hint\">\n <wx-text size=\"sm\" tone=\"muted\">{{\n t('landing.slug-suggested', { slug: suggestion })\n }}</wx-text>\n <wx-button size=\"sm\" variant=\"text\" @click=\"use\">{{ t('landing.slug-use') }}</wx-button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-catalog-landing-slug {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-catalog-landing-slug__hint {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted } from 'vue'\nimport { WxSelect, type SelectOption } from '@webx-ui/core'\nimport { useAdmin, useTranslate } from '@webx-ui/module-admin'\nimport { useFacetRegistry } from '@webx-ui/module-catalog'\nimport { useLandingEditor } from './editor'\nimport { NAMESPACE, useCatalogLandingsMessages } from './i18n'\n\n/**\n * `wx-catalog-landing-sort`: the landing's default order (decision 7) — one of the catalogue's\n * sorts, or none, which leaves the category's. The sorts come from the same registry the products'\n * list reads, so the panel never offers one the storefront does not know.\n */\ndefineOptions({ name: 'WxCatalogLandingSort' })\n\nconst value = defineModel<string | null>({ default: null })\n\nconst NONE = 'default'\n\nconst admin = useAdmin()\nconst registry = useFacetRegistry(admin)\nconst editor = useLandingEditor()\nuseCatalogLandingsMessages()\n\nconst t = useTranslate(NAMESPACE)\n\nconst options = computed<SelectOption[]>(() => [\n // The registry's own 'default' stands for «none of the landing's own»: the category's order.\n { value: NONE, label: t('landing.sort-default') },\n ...registry.sorts.value\n .filter((sort) => sort.key !== NONE)\n .map((sort) => ({ value: sort.key, label: sort.label })),\n])\n\nonMounted(() => void registry.load().catch(() => undefined))\n</script>\n\n<template>\n <wx-select\n :model-value=\"value ?? NONE\"\n :options=\"options\"\n :disabled=\"editor?.locked.value ?? false\"\n @update:model-value=\"\n (picked: unknown) => (value = picked && picked !== NONE ? String(picked) : null)\n \"\n />\n</template>\n","import type { AdminModule } from '@webx-ui/module-admin'\nimport LandingProductsField from './LandingProductsField.vue'\nimport LandingSetField from './LandingSetField.vue'\nimport LandingSlugField from './LandingSlugField.vue'\nimport LandingSortField from './LandingSortField.vue'\n\nexport interface CatalogLandingsOptions {\n /** Where the catalogue lives inside the panel — the same as `catalog({ path })`. */\n path?: string\n}\n\n/**\n * Landings as a section of the panel (§8 of the landings spec): the list with its filters and\n * «Create in bulk», and the page of one — new at `…/landings/new` — which is the server's\n * `catalog.landing-form`. «Catalog» → «Landings» after «Brands» on the server's side (order 303).\n *\n * The node types are the parts of that form a plain field cannot be: the set builder with its\n * live count, the address with the set's suggestion, the default sort out of the catalogue's\n * registry, and the recommended products found and put in order.\n */\nexport function catalogLandings(options: CatalogLandingsOptions = {}): AdminModule[] {\n const catalog = options.path ?? '/catalog'\n const props = { base: catalog }\n\n return [\n {\n id: 'catalog-landings',\n path: `${catalog}/landings`,\n routes: [\n {\n path: `${catalog}/landings`,\n name: 'webx.catalog-landings',\n component: () => import('./LandingsPage.vue'),\n props,\n },\n {\n path: `${catalog}/landings/new`,\n name: 'webx.catalog-landings.new',\n component: () => import('./LandingEditorPage.vue'),\n props,\n },\n {\n path: `${catalog}/landings/:id(\\\\d+)`,\n name: 'webx.catalog-landings.edit',\n component: () => import('./LandingEditorPage.vue'),\n props,\n },\n ],\n types: {\n // Wide: a facet's row is a label, a list of values and a button, and half a form is too\n // narrow for a combobox of brands beside its label.\n 'wx-catalog-landing-set': { component: LandingSetField, kind: 'field', wide: true },\n 'wx-catalog-landing-slug': { component: LandingSlugField, kind: 'field' },\n 'wx-catalog-landing-sort': { component: LandingSortField, kind: 'field' },\n 'wx-catalog-landing-products': {\n component: LandingProductsField,\n kind: 'field',\n wide: true,\n },\n },\n },\n ]\n}\n","import { defineAsyncComponent } from 'vue'\nimport './style.css'\n\nexport { catalogLandings, type CatalogLandingsOptions } from './module'\nexport { catalogLandingsMessages } from './messages'\nexport {\n cleanSet,\n createLandingsApi,\n formValues,\n landingSearch,\n FORM_FIELDS,\n LANDINGS_API,\n type CatalogLandingsApi,\n} from './api'\nexport {\n landingEditorKey,\n provideLandingEditor,\n useLandingEditor,\n type LandingEditorContext,\n} from './editor'\nexport const WxCatalogLandingsPage = defineAsyncComponent(() => import('./LandingsPage.vue'))\nexport const WxCatalogLandingEditor = defineAsyncComponent(() => import('./LandingEditorPage.vue'))\nexport { default as WxCatalogLandingSet } from './LandingSetField.vue'\nexport { default as WxCatalogLandingSlug } from './LandingSlugField.vue'\nexport { default as WxCatalogLandingSort } from './LandingSortField.vue'\nexport { default as WxCatalogLandingProducts } from './LandingProductsField.vue'\nexport type {\n BaseFacet,\n GenerateConflict,\n GenerateParams,\n GeneratePreview,\n GenerateRow,\n GenerateRun,\n LandingAttention,\n LandingChip,\n LandingDetail,\n LandingFilters,\n LandingQuery,\n LandingRow,\n LandingsPage,\n RecommendedItem,\n SetChoice,\n SetCount,\n} from './types'\n"],"names":["landingEditorKey","provideLandingEditor","context","provide","useLandingEditor","inject","catalogLandingsMessages","NAMESPACE","seeded","useCatalogLandingsMessages","i18n","useAdmin","value","_useModel","__props","admin","catalog","createCatalogApi","editor","t","useTranslate","askRemove","useRemoveConfirm","panel","message","useErrorText","locked","computed","known","ref","watch","items","item","id","next","term","options","searching","failed","asked","search","q","ticket","page","taken","product","error","pick","option","drop","one","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_unref","WxAutocomplete","$event","WxText","_createVNode","WxSortableList","_withCtx","_createElementVNode","_hoisted_2","_hoisted_3","_toDisplayString","_createTextVNode","WxBadge","WxPopconfirm","WxButton","WxIcon","LANDINGS_API","landingSearch","query","key","createLandingsApi","base","data","body","values","on","categoryId","filters","except","params","FORM_FIELDS","formValues","detail","field","cleanSet","clean","choice","api","category","offered","loadFailed","set","facetOf","facet","adding","loadFacets","answer","isRange","write","add","remove","valuesOf","rangeOf","optionsOf","chosen","word","chipWord","chip","picked","bound","end","range","labelOf","counted","counting","countFailed","timer","countTicket","question","count","onBeforeUnmount","takenLink","WxAlert","_Fragment","_renderList","WxInputNumber","WxSelect","_hoisted_4","WxLink","RouterLink","props","locales","useLocales","record","suggestion","suggested","locale","slug","use","active","WxInput","_cache","NONE","registry","useFacetRegistry","sort","onMounted","catalogLandings","LandingSetField","LandingSlugField","LandingSortField","LandingProductsField","WxCatalogLandingsPage","defineAsyncComponent","WxCatalogLandingEditor"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "vue";
2
- import { F as g, L as i, W as d, b as o, d as t, e, g as l, h as L, i as r, j as c, a as x, c as S, f as W, l as C, k as p, p as E, m } from "./index-DEreqbgG.js";
2
+ import { F as g, L as i, W as d, b as o, d as t, e, g as l, h as L, i as r, j as c, a as x, c as S, f as W, l as C, k as p, p as E, m } from "./index-CL_q1v5T.js";
3
3
  export {
4
4
  g as FORM_FIELDS,
5
5
  i as LANDINGS_API,
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .wx-catalog-landing-products[data-v-e1b47273]{display:flex;flex-direction:column;gap:var(--wx-space-8);min-width:0}.wx-catalog-landing-products__item[data-v-e1b47273]{display:flex;align-items:baseline;gap:var(--wx-space-8);min-width:0}.wx-catalog-landing-products__name[data-v-e1b47273]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-catalog-landing-set[data-v-899dfed0]{display:flex;flex-direction:column;gap:var(--wx-space-8);container-type:inline-size;min-width:0}.wx-catalog-landing-set__row[data-v-899dfed0]{display:grid;grid-template-columns:minmax(96px,160px) minmax(0,1fr) auto;align-items:center;gap:var(--wx-space-8)}.wx-catalog-landing-set__range[data-v-899dfed0]{display:grid;grid-template-columns:1fr 1fr;gap:var(--wx-space-8)}.wx-catalog-landing-set__foot[data-v-899dfed0]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--wx-space-12)}.wx-catalog-landing-set__add[data-v-899dfed0]{width:240px;max-width:100%}@container (max-width: 480px){.wx-catalog-landing-set__row[data-v-899dfed0]{grid-template-columns:minmax(0,1fr) auto}.wx-catalog-landing-set__label[data-v-899dfed0]{grid-column:1 / -1}}.wx-catalog-landing-slug[data-v-b1f93497]{display:flex;flex-direction:column;gap:var(--wx-space-4);min-width:0}.wx-catalog-landing-slug__hint[data-v-b1f93497]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--wx-space-8)}.wx-catalog-landings-generate[data-v-9deeece3]{display:flex;flex-direction:column;gap:var(--wx-space-12);min-width:0}.wx-catalog-landings-generate__mono[data-v-9deeece3]{font-family:var(--wx-font-family-mono);font-size:var(--wx-font-size-sm)}.wx-catalog-landings-generate__errors[data-v-9deeece3]{margin:0;padding-inline-start:var(--wx-space-16);font-size:var(--wx-font-size-sm)}.wx-catalog-landings[data-v-eccbf1d9]{min-width:0}.wx-catalog-landings__name[data-v-eccbf1d9]{display:flex;flex-direction:column;min-width:0}.wx-catalog-landings__title[data-v-eccbf1d9],.wx-catalog-landings__slug[data-v-eccbf1d9]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-catalog-landings__slug[data-v-eccbf1d9]{color:var(--wx-text-muted);font-size:var(--wx-font-size-sm)}.wx-catalog-landings__chips[data-v-eccbf1d9]{display:flex;flex-wrap:wrap;gap:var(--wx-space-4)}.wx-catalog-landings__count[data-v-eccbf1d9]{font-variant-numeric:tabular-nums}.wx-catalog-landings__state[data-v-eccbf1d9]{display:flex;align-items:center;gap:var(--wx-space-6)}.wx-catalog-landings__sr[data-v-eccbf1d9]{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.wx-catalog-landing-editor[data-v-0d735844]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));container-type:inline-size}.wx-catalog-landing-editor__ghost[data-v-0d735844]{max-width:420px}
1
+ .wx-catalog-landing-products[data-v-2ff197ef]{display:flex;flex-direction:column;gap:var(--wx-space-8);min-width:0}.wx-catalog-landing-products__item[data-v-2ff197ef]{display:flex;align-items:baseline;gap:var(--wx-space-8);min-width:0}.wx-catalog-landing-products__name[data-v-2ff197ef]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-catalog-landing-set[data-v-375f27f3]{display:flex;flex-direction:column;gap:var(--wx-space-8);container-type:inline-size;min-width:0}.wx-catalog-landing-set__row[data-v-375f27f3]{display:grid;grid-template-columns:minmax(96px,160px) minmax(0,1fr) auto;align-items:center;gap:var(--wx-space-8)}.wx-catalog-landing-set__range[data-v-375f27f3]{display:grid;grid-template-columns:1fr 1fr;gap:var(--wx-space-8)}.wx-catalog-landing-set__foot[data-v-375f27f3]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--wx-space-12)}.wx-catalog-landing-set__add[data-v-375f27f3]{width:240px;max-width:100%}@container (max-width: 480px){.wx-catalog-landing-set__row[data-v-375f27f3]{grid-template-columns:minmax(0,1fr) auto}.wx-catalog-landing-set__label[data-v-375f27f3]{grid-column:1 / -1}}.wx-catalog-landing-slug[data-v-b1f93497]{display:flex;flex-direction:column;gap:var(--wx-space-4);min-width:0}.wx-catalog-landing-slug__hint[data-v-b1f93497]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--wx-space-8)}.wx-catalog-landings-generate[data-v-5b95e3af]{display:flex;flex-direction:column;gap:var(--wx-space-12);min-width:0}.wx-catalog-landings-generate__mono[data-v-5b95e3af]{font-family:var(--wx-font-family-mono);font-size:var(--wx-font-size-sm)}.wx-catalog-landings-generate__errors[data-v-5b95e3af]{margin:0;padding-inline-start:var(--wx-space-16);font-size:var(--wx-font-size-sm)}.wx-catalog-landings[data-v-528d5912]{min-width:0}.wx-catalog-landings__name[data-v-528d5912]{display:flex;flex-direction:column;min-width:0}.wx-catalog-landings__title[data-v-528d5912],.wx-catalog-landings__slug[data-v-528d5912]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-catalog-landings__slug[data-v-528d5912]{color:var(--wx-text-muted);font-size:var(--wx-font-size-sm)}.wx-catalog-landings__chips[data-v-528d5912]{display:flex;flex-wrap:wrap;gap:var(--wx-space-4)}.wx-catalog-landings__count[data-v-528d5912]{font-variant-numeric:tabular-nums}.wx-catalog-landings__state[data-v-528d5912]{display:flex;align-items:center;gap:var(--wx-space-6)}.wx-catalog-landings__sr[data-v-528d5912]{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.wx-catalog-landing-editor[data-v-0d735844]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));container-type:inline-size}.wx-catalog-landing-editor__ghost[data-v-0d735844]{max-width:420px}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webx-ui/module-catalog-landings",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Landing pages for the catalogue of the WebX UI admin panel: a category list with filters chosen in advance under an address, texts and SEO of its own, the set builder with a live count, recommended products, and creating landings in bulk.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -46,10 +46,10 @@
46
46
  "vue-router": "^4.5.0"
47
47
  },
48
48
  "dependencies": {
49
- "@webx-ui/core": "^0.44.0",
50
- "@webx-ui/module-admin": "^0.32.0",
51
- "@webx-ui/module-catalog": "^0.9.2",
52
- "@webx-ui/schema": "^0.9.4"
49
+ "@webx-ui/core": "^0.45.0",
50
+ "@webx-ui/module-admin": "^0.33.0",
51
+ "@webx-ui/module-catalog": "^0.10.0",
52
+ "@webx-ui/schema": "^0.9.5"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@types/node": "^24.10.1",
@@ -1 +0,0 @@
1
- {"version":3,"file":"LandingsPage-BAIQAJv2.js","sources":["../src/GenerateDialog.vue","../src/LandingsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport {\n useLocales,\n useModal,\n WxAlert,\n WxButton,\n WxDialog,\n WxFormItem,\n WxInput,\n WxInputNumber,\n WxProgress,\n WxSelect,\n WxSpace,\n WxSwitch,\n WxTable,\n WxText,\n WxTreeSelect,\n type SelectOption,\n type TableColumn,\n type TreeSelectValue,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { useCategoryTree } from '@webx-ui/module-catalog'\nimport { createLandingsApi } from './api'\nimport { NAMESPACE, useCatalogLandingsMessages } from './i18n'\nimport type { BaseFacet, GenerateParams, GeneratePreview, GenerateRow, GenerateRun } from './types'\n\n/**\n * «Create in bulk» (§8.3 of the landings spec), three steps in one dialog: the bases, the facet and\n * its values, the templates — then the preview, a row per landing with the reason it is skipped —\n * then the run, done at once or polled while the queue makes it. Resolves with the run, or `null`\n * when nothing was made.\n */\nconst { open, resolve } = useModal<GenerateRun | null>()\n\nconst admin = useAdmin()\nconst api = createLandingsApi(admin)\nconst tree = useCategoryTree(admin)\nconst locales = useLocales()\nuseCatalogLandingsMessages()\n\nconst t = useTranslate(NAMESPACE)\nconst message = useErrorText()\n\ntype Step = 'form' | 'preview' | 'run'\n\nconst step = ref<Step>('form')\nconst categories = ref<number[]>([])\nconst subtree = ref(false)\nconst facet = ref<string | null>(null)\nconst values = ref<string[]>([])\nconst minProducts = ref<number | null>(1)\nconst templates = ref({ slug: '', name: '', h1: '', title: '', description: '' })\nconst publish = ref(false)\n\nconst facets = ref<BaseFacet[]>([])\nconst errors = ref<Record<string, string[]>>({})\nconst failure = ref('')\nconst busy = ref(false)\nconst preview = ref<GeneratePreview | null>(null)\nconst run = ref<GenerateRun | null>(null)\n\nonMounted(() => void tree.load().catch(() => undefined))\n\n/* The facets of values the first base offers: a range has no value to make a landing of. */\nwatch(\n () => categories.value[0] ?? null,\n async (first) => {\n if (first === null) {\n facets.value = []\n\n return\n }\n\n try {\n facets.value = (await api.facets(first)).filter((one) => one.kind !== 'range')\n } catch (error) {\n failure.value = message(error)\n }\n },\n)\n\nconst facetOptions = computed<SelectOption[]>(() =>\n facets.value.map((one) => ({ value: one.key, label: one.label })),\n)\n\nconst valueOptions = computed<SelectOption[]>(() =>\n (facets.value.find((one) => one.key === facet.value)?.values ?? []).map((one) => ({\n value: one.value,\n label: `${one.label} (${one.count})`,\n })),\n)\n\nwatch(facet, () => (values.value = []))\n\nconst params = computed<GenerateParams>(() => ({\n categories: categories.value,\n subtree: subtree.value,\n facet: facet.value ?? '',\n values: values.value.length > 0 ? values.value : null,\n min_products: minProducts.value,\n ...templates.value,\n publish: publish.value,\n}))\n\nconst ready = computed(() => categories.value.length > 0 && facet.value !== null)\n\nfunction first(field: string): string | undefined {\n return errors.value[field]?.[0]\n}\n\nfunction refuse(error: unknown): void {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) errors.value = body.errors\n else failure.value = message(error)\n}\n\nasync function toPreview(): Promise<void> {\n if (!ready.value || busy.value) return\n\n busy.value = true\n errors.value = {}\n failure.value = ''\n\n try {\n preview.value = await api.preview(params.value)\n step.value = 'preview'\n } catch (error) {\n refuse(error)\n } finally {\n busy.value = false\n }\n}\n\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nasync function poll(id: number, delay = 1500): Promise<void> {\n timer = setTimeout(async () => {\n try {\n run.value = await api.run(id)\n\n if (run.value.status === 'queued' || run.value.status === 'running') void poll(id)\n } catch {\n void poll(id, Math.min(delay * 2, 15000))\n }\n }, delay)\n}\n\nasync function start(): Promise<void> {\n if (busy.value) return\n\n busy.value = true\n failure.value = ''\n\n try {\n run.value = await api.generate(params.value)\n step.value = 'run'\n\n if (run.value.id !== null && !finished.value) void poll(run.value.id)\n } catch (error) {\n refuse(error)\n step.value = 'form'\n } finally {\n busy.value = false\n }\n}\n\nonBeforeUnmount(() => clearTimeout(timer))\n\nconst finished = computed(() => run.value?.status === 'done' || run.value?.status === 'failed')\n\nfunction close(): void {\n resolve(run.value && run.value.done > 0 ? run.value : null)\n}\n\n/* --------------------------------------------------------------- the preview --- */\n\nconst word = (record: Record<string, string>) =>\n record[locales.active.value] ?? Object.values(record)[0] ?? ''\n\nconst columns = computed<TableColumn<GenerateRow>[]>(() => [\n { key: 'address', label: t('generate.column-address'), minWidth: 180 },\n { key: 'title', label: t('generate.column-h1'), minWidth: 180, hideBelow: 560 },\n { key: 'count', label: t('generate.column-count'), width: 100, align: 'right' },\n { key: 'conflict', label: t('generate.column-conflict'), minWidth: 180 },\n])\n\nconst rows = computed(() =>\n (preview.value?.rows ?? []).map((row, index) => ({ ...row, id: index })),\n)\n</script>\n\n<template>\n <wx-dialog\n v-model:open=\"open\"\n :title=\"t('generate.title')\"\n :width=\"step === 'form' ? 600 : 860\"\n @update:open=\"(on: boolean) => !on && close()\"\n >\n <wx-alert v-if=\"failure\" type=\"danger\">{{ failure }}</wx-alert>\n\n <div v-if=\"step === 'form'\" class=\"wx-catalog-landings-generate\">\n <wx-form-item\n :label=\"t('generate.bases')\"\n :help=\"t('generate.bases-help')\"\n :error=\"first('categories')\"\n required\n >\n <wx-tree-select\n :model-value=\"categories\"\n :nodes=\"tree.nodes.value ?? []\"\n node-key=\"id\"\n label-key=\"name\"\n children-key=\"children\"\n multiple\n check-strictly\n filterable\n clearable\n @update:model-value=\"\n (picked: TreeSelectValue) =>\n (categories = Array.isArray(picked)\n ? picked.map(Number)\n : picked\n ? [Number(picked)]\n : [])\n \"\n />\n </wx-form-item>\n <wx-form-item>\n <wx-switch v-model=\"subtree\">{{ t('generate.subtree') }}</wx-switch>\n </wx-form-item>\n\n <wx-form-item :label=\"t('generate.facet')\" :error=\"first('facet')\" required>\n <wx-select v-model=\"facet\" :options=\"facetOptions\" :disabled=\"categories.length === 0\" />\n </wx-form-item>\n <wx-form-item :label=\"t('generate.values')\" :help=\"t('generate.values-help')\">\n <wx-select\n v-model=\"values\"\n :options=\"valueOptions\"\n multiple\n filterable\n clearable\n :disabled=\"facet === null\"\n />\n </wx-form-item>\n <wx-form-item :label=\"t('generate.min-products')\" :help=\"t('generate.min-products-help')\">\n <wx-input-number v-model=\"minProducts\" :min=\"0\" :disabled=\"values.length > 0\" />\n </wx-form-item>\n\n <wx-text weight=\"medium\">{{ t('generate.templates') }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\">{{ t('generate.templates-help') }}</wx-text>\n <wx-form-item :label=\"t('generate.slug')\" :error=\"first('slug')\">\n <wx-input v-model=\"templates.slug\" placeholder=\"{category}-{value}\" />\n </wx-form-item>\n <wx-form-item :label=\"t('generate.name')\">\n <wx-input v-model=\"templates.name\" placeholder=\"{category} {value}\" />\n </wx-form-item>\n <wx-form-item :label=\"t('generate.h1')\">\n <wx-input v-model=\"templates.h1\" :placeholder=\"t('generate.template-empty')\" />\n </wx-form-item>\n <wx-form-item :label=\"t('generate.seo-title')\">\n <wx-input v-model=\"templates.title\" :placeholder=\"t('generate.template-empty')\" />\n </wx-form-item>\n <wx-form-item :label=\"t('generate.seo-description')\">\n <wx-input v-model=\"templates.description\" :placeholder=\"t('generate.template-empty')\" />\n </wx-form-item>\n <wx-form-item>\n <wx-switch v-model=\"publish\">{{ t('generate.publish') }}</wx-switch>\n </wx-form-item>\n </div>\n\n <div v-else-if=\"step === 'preview' && preview\" class=\"wx-catalog-landings-generate\">\n <wx-text>\n {{\n preview.free > 0\n ? t('generate.summary', { free: preview.free, skipped: preview.total - preview.free })\n : t('generate.nothing')\n }}\n </wx-text>\n <wx-table :data=\"rows\" :columns=\"columns\" row-key=\"id\" flush layout=\"fixed\">\n <template #cell-address=\"{ row }\">\n <span class=\"wx-catalog-landings-generate__mono\">/{{ word(row.slug) }}/</span>\n </template>\n <template #cell-title=\"{ row }\">\n {{ word(Object.keys(row.h1).length > 0 ? row.h1 : row.name) }}\n </template>\n <template #cell-conflict=\"{ row }\">\n <wx-text v-if=\"row.conflict\" size=\"sm\" tone=\"warning\">{{ row.message }}</wx-text>\n </template>\n </wx-table>\n </div>\n\n <div v-else-if=\"step === 'run' && run\" class=\"wx-catalog-landings-generate\">\n <template v-if=\"!finished\">\n <wx-text>{{ t('generate.running') }}</wx-text>\n <wx-progress :value=\"run.done + run.failed\" :max=\"Math.max(1, run.total - run.skipped)\" />\n </template>\n <wx-alert v-else :type=\"run.status === 'failed' ? 'danger' : 'success'\">\n {{\n run.status === 'failed'\n ? t('generate.failed')\n : t('generate.done', { done: run.done, skipped: run.skipped, failed: run.failed })\n }}\n </wx-alert>\n <ul v-if=\"run.errors.length > 0\" class=\"wx-catalog-landings-generate__errors\">\n <li v-for=\"(one, index) in run.errors\" :key=\"index\">\n <strong>/{{ one.slug }}/</strong> — {{ one.message }}\n </li>\n </ul>\n </div>\n\n <template #footer>\n <wx-space size=\"sm\">\n <template v-if=\"step === 'form'\">\n <wx-button variant=\"outline\" @click=\"close\">{{ t('panel.cancel') }}</wx-button>\n <wx-button type=\"primary\" :loading=\"busy\" :disabled=\"!ready\" @click=\"toPreview\">\n {{ t('generate.preview') }}\n </wx-button>\n </template>\n <template v-else-if=\"step === 'preview'\">\n <wx-button variant=\"outline\" @click=\"step = 'form'\">{{ t('generate.back') }}</wx-button>\n <wx-button\n type=\"primary\"\n :loading=\"busy\"\n :disabled=\"(preview?.free ?? 0) === 0\"\n @click=\"start\"\n >\n {{ t('generate.run', { count: preview?.free ?? 0 }) }}\n </wx-button>\n </template>\n <wx-button v-else type=\"primary\" :disabled=\"!finished\" @click=\"close\">\n {{ t('generate.close') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-catalog-landings-generate {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-catalog-landings-generate__mono {\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-catalog-landings-generate__errors {\n margin: 0;\n padding-inline-start: var(--wx-space-16);\n font-size: var(--wx-font-size-sm);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useRoute, useRouter, type LocationQueryRaw } from 'vue-router'\nimport {\n confirm,\n createModal,\n toast,\n useLocales,\n localizedValue,\n WxBadge,\n WxButton,\n WxFormItem,\n WxIcon,\n WxSwitch,\n WxTable,\n WxText,\n WxTooltip,\n WxTreeSelect,\n type TableColumn,\n type TableState,\n type TreeSelectValue,\n} from '@webx-ui/core'\nimport {\n rowMenuWidth,\n useAdmin,\n useErrorText,\n useTranslate,\n WxDate,\n WxFilterChips,\n WxListScreen,\n WxRowMenu,\n type AppliedFilter,\n type RowAction,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport { useCategoryTree, type CategoryNode } from '@webx-ui/module-catalog'\nimport { createLandingsApi } from './api'\nimport GenerateDialog from './GenerateDialog.vue'\nimport { NAMESPACE, useCatalogLandingsMessages } from './i18n'\nimport type { GenerateRun, LandingQuery, LandingRow, LandingsPage } from './types'\n\n/**\n * The landings (§8.1 of the landings spec): name and address, the base, the set as chips, the\n * products, the state and the mark of attention; filtered by the base as a tree (the whole\n * catalogue is a choice of its own), «needs attention», published, empty, the bin; searched by\n * name and address. The filters live in the address, so coming back from a landing lands where\n * the list was left.\n */\ndefineOptions({ name: 'WxCatalogLandingsPage' })\n\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/catalog' })\n\n/** The base filter's value for «the whole catalogue», beside the categories' ids. */\nconst ROOT = 'root'\n\nconst admin = useAdmin()\nconst api = createLandingsApi(admin)\nconst tree = useCategoryTree(admin)\nconst route = useRoute()\nconst router = useRouter()\nconst locales = useLocales()\nuseCatalogLandingsMessages()\n\nconst t = useTranslate(NAMESPACE)\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst generate = createModal<GenerateRun | null, { base: string }>(GenerateDialog)\n\nconst list = computed(() => `${props.base}/landings`)\nconst canManage = computed(() => admin.can('catalog.manage'))\n\nconst page = ref<LandingsPage | null>(null)\nconst loading = ref(true)\n\nconst flag = (key: string) => route.query[key] === '1'\n\nconst search = ref(String(route.query.q ?? ''))\nconst pageNumber = ref(Number(route.query.page ?? 1) || 1)\nconst chosenBase = ref<string | null>(route.query.category ? String(route.query.category) : null)\nconst attention = ref(flag('attention'))\nconst published = ref(flag('published'))\nconst empty = ref(flag('empty'))\nconst trashed = ref(flag('trashed'))\nlet perPage = 25\n\nconst title = computed(\n () =>\n admin.state.manifest?.modules.find((module) => module.id === 'catalog-landings')?.title ??\n t('module.title'),\n)\n\n/** The tree of categories with «the whole catalogue» on top of it. */\nconst baseNodes = computed<CategoryNode[]>(() => [\n {\n id: ROOT as unknown as number,\n name: t('landing.whole-catalog'),\n parent_id: null,\n children: [],\n } as unknown as CategoryNode,\n ...(tree.nodes.value ?? []),\n])\n\nconst baseName = computed(() => {\n if (chosenBase.value === null) return ''\n if (chosenBase.value === ROOT) return t('landing.whole-catalog')\n\n const find = (nodes: CategoryNode[]): string =>\n nodes.reduce<string>(\n (found, node) =>\n found || (String(node.id) === chosenBase.value ? node.name : find(node.children ?? [])),\n '',\n )\n\n return find(tree.nodes.value ?? []) || `#${chosenBase.value}`\n})\n\nconst applied = computed<AppliedFilter[]>(() => {\n const chips: AppliedFilter[] = []\n\n if (chosenBase.value !== null) {\n chips.push({\n key: 'base',\n label: `${t('panel.filter-base')}: ${baseName.value}`,\n clear: () => (chosenBase.value = null),\n })\n }\n\n for (const [key, on, word] of [\n ['attention', attention, 'panel.filter-attention'],\n ['published', published, 'panel.filter-published'],\n ['empty', empty, 'panel.filter-empty'],\n ['trashed', trashed, 'panel.filter-trashed'],\n ] as const) {\n if (on.value) chips.push({ key, label: t(word), clear: () => (on.value = false) })\n }\n\n return chips\n})\n\nfunction clearFilters(): void {\n chosenBase.value = null\n attention.value = false\n published.value = false\n empty.value = false\n trashed.value = false\n}\n\nfunction query(state?: TableState): LandingQuery {\n return {\n q: state?.search ?? search.value,\n category: chosenBase.value ?? undefined,\n attention: attention.value || undefined,\n published: published.value || undefined,\n empty: empty.value || undefined,\n trashed: trashed.value || undefined,\n page: state?.page ?? pageNumber.value,\n per_page: state?.perPage ?? perPage,\n }\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.list(query(state))\n\n if (mine === asked) page.value = answer\n } catch (error) {\n toast.danger(message(error))\n } finally {\n if (mine === asked) loading.value = false\n }\n}\n\nfunction remember(): void {\n const wanted: LocationQueryRaw = {}\n const q = query()\n\n if (q.q) wanted.q = q.q\n if (q.category) wanted.category = q.category\n if (q.page && q.page > 1) wanted.page = String(q.page)\n\n for (const key of ['attention', 'published', 'empty', 'trashed'] as const) {\n if (q[key]) wanted[key] = '1'\n }\n\n void router.replace({ query: wanted })\n}\n\nfunction onState(state: TableState): void {\n perPage = state.perPage\n void load(state)\n}\n\nwatch([chosenBase, attention, published, empty, trashed], () => {\n pageNumber.value = 1\n remember()\n void load()\n})\n\nwatch([search, pageNumber], remember)\n\nconst columns = computed<TableColumn<LandingRow>[]>(() => [\n { key: 'name', label: t('panel.column-name'), minWidth: 220 },\n { key: 'category', label: t('panel.column-base'), width: 180, hideBelow: 760 },\n { key: 'chips', label: t('panel.column-set'), minWidth: 180, hideBelow: 640 },\n { key: 'products_count', label: t('panel.column-count'), width: 110, align: 'right' },\n { key: 'state', label: t('panel.column-state'), width: 170, hideBelow: 900 },\n { key: 'updated_at', label: t('panel.column-updated'), width: 130, hideBelow: 1180 },\n { key: 'actions', label: '', width: rowMenuWidth, align: 'right' },\n])\n\nconst nameOf = (row: LandingRow) =>\n localizedValue(row.name, locales.active.value, '') || `#${row.id}`\nconst slugOf = (row: LandingRow) => localizedValue(row.slug, locales.active.value, '')\n\nfunction open(row: LandingRow): void {\n void router.push(`${list.value}/${row.id}`)\n}\n\nasync function publish(row: LandingRow, on: boolean): Promise<void> {\n try {\n await api.publish(row.id, on)\n toast.success(t(on ? 'panel.published-toast' : 'panel.unpublished-toast'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function remove(row: LandingRow): Promise<void> {\n const agreed = await confirm({\n title: t('panel.delete-title', { name: nameOf(row) }),\n message: t('panel.delete-text'),\n confirmText: t('panel.delete'),\n cancelText: t('panel.cancel'),\n tone: 'danger',\n })\n\n if (!agreed) return\n\n try {\n await api.remove(row.id)\n toast.success(t('panel.deleted'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function restore(row: LandingRow): Promise<void> {\n try {\n await api.restore(row.id)\n toast.success(t('panel.restored'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nfunction actionsFor(row: LandingRow): RowAction[] {\n if (row.deleted_at !== null) {\n return canManage.value\n ? [\n {\n key: 'restore',\n icon: 'refresh',\n label: t('panel.restore'),\n run: () => void restore(row),\n },\n ]\n : []\n }\n\n const actions: RowAction[] = [\n { key: 'open', icon: 'edit', label: t('panel.open'), run: () => open(row) },\n ]\n\n if (row.url)\n actions.push({ key: 'site', icon: 'link', label: t('panel.open-site'), href: row.url })\n\n if (canManage.value) {\n actions.push(\n row.is_published\n ? {\n key: 'unpublish',\n icon: 'eye-off',\n label: t('panel.unpublish'),\n run: () => void publish(row, false),\n }\n : {\n key: 'publish',\n icon: 'eye',\n label: t('panel.publish'),\n run: () => void publish(row, true),\n },\n {\n key: 'delete',\n icon: 'trash',\n label: t('panel.delete'),\n danger: true,\n run: () => void remove(row),\n },\n )\n }\n\n return actions\n}\n\nasync function bulk(): Promise<void> {\n const run = await generate({ base: props.base })\n\n if (run) await load()\n}\n\nconst actions = computed<ScreenAction[]>(() =>\n canManage.value\n ? [\n {\n key: 'new',\n label: t('panel.new'),\n icon: 'plus',\n primary: true,\n run: () =>\n void router.push({\n path: `${list.value}/new`,\n query:\n chosenBase.value && chosenBase.value !== ROOT ? { category: chosenBase.value } : {},\n }),\n },\n { key: 'generate', label: t('panel.generate'), icon: 'grid', run: () => void bulk() },\n ]\n : [],\n)\n\nconst emptyText = computed(() =>\n applied.value.length > 0 || search.value ? t('panel.nothing-found') : t('panel.empty'),\n)\n\nonMounted(() => {\n void tree.load().catch(() => undefined)\n})\n</script>\n\n<template>\n <div class=\"wx-catalog-landings\">\n <wx-list-screen :title=\"title\" :actions=\"actions\">\n <wx-table\n v-model:search=\"search\"\n v-model:page=\"pageNumber\"\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n clickable\n hover\n flush\n :loading=\"loading\"\n layout=\"fixed\"\n :filters-count=\"applied.length\"\n :filters-label=\"panel('filters.title')\"\n :search-placeholder=\"t('panel.search')\"\n :empty-text=\"emptyText\"\n :aria-label=\"title\"\n @row-click=\"open\"\n @state-change=\"onState\"\n >\n <template #filters>\n <wx-form-item :label=\"t('panel.filter-base')\">\n <wx-tree-select\n :model-value=\"chosenBase\"\n :nodes=\"baseNodes\"\n node-key=\"id\"\n label-key=\"name\"\n children-key=\"children\"\n check-strictly\n filterable\n clearable\n size=\"sm\"\n @update:model-value=\"\n (picked: TreeSelectValue) =>\n (chosenBase =\n picked === null || picked === undefined || Array.isArray(picked)\n ? null\n : String(picked))\n \"\n />\n </wx-form-item>\n <wx-form-item>\n <wx-switch v-model=\"attention\" size=\"sm\" :label=\"t('panel.filter-attention')\" />\n </wx-form-item>\n <wx-form-item>\n <wx-switch v-model=\"published\" size=\"sm\" :label=\"t('panel.filter-published')\" />\n </wx-form-item>\n <wx-form-item>\n <wx-switch v-model=\"empty\" size=\"sm\" :label=\"t('panel.filter-empty')\" />\n </wx-form-item>\n <wx-form-item>\n <wx-switch v-model=\"trashed\" size=\"sm\" :label=\"t('panel.filter-trashed')\" />\n </wx-form-item>\n\n <wx-button v-if=\"applied.length > 0\" variant=\"text\" size=\"sm\" block @click=\"clearFilters\">\n <template #icon><wx-icon name=\"close\" /></template>\n {{ panel('filters.reset') }}\n </wx-button>\n </template>\n\n <template #applied>\n <wx-filter-chips :filters=\"applied\" />\n </template>\n\n <template #cell-name=\"{ row }\">\n <div class=\"wx-catalog-landings__name\">\n <span class=\"wx-catalog-landings__title\">{{ nameOf(row) }}</span>\n <span class=\"wx-catalog-landings__slug\">/{{ slugOf(row) }}/</span>\n </div>\n </template>\n\n <template #cell-category=\"{ row }\">\n <wx-text size=\"sm\" truncate :tone=\"row.category === null ? 'muted' : undefined\">\n {{ row.category ?? t('landing.whole-catalog') }}\n </wx-text>\n </template>\n\n <template #cell-chips=\"{ row }\">\n <div class=\"wx-catalog-landings__chips\">\n <wx-badge v-for=\"chip in row.chips\" :key=\"chip.key\" size=\"sm\" variant=\"soft\">\n {{ chip.label }}: {{ chip.text }}\n </wx-badge>\n </div>\n </template>\n\n <template #cell-products_count=\"{ row }\">\n <wx-text v-if=\"row.products_count === null\" size=\"sm\" tone=\"muted\">\n {{ t('panel.not-counted') }}\n </wx-text>\n <wx-badge v-else-if=\"row.products_count === 0\" type=\"warning\" size=\"sm\" round>0</wx-badge>\n <span v-else class=\"wx-catalog-landings__count\">{{ row.products_count }}</span>\n </template>\n\n <template #cell-state=\"{ row }\">\n <div class=\"wx-catalog-landings__state\">\n <wx-badge v-if=\"row.deleted_at\" dot size=\"sm\">{{ t('panel.in-bin') }}</wx-badge>\n <wx-badge v-else :type=\"row.is_published ? 'success' : 'default'\" dot size=\"sm\">\n {{ t(row.is_published ? 'panel.published' : 'panel.unpublished') }}\n </wx-badge>\n <wx-tooltip v-if=\"row.attention\" :content=\"t(`landing.attention-${row.attention}`)\">\n <wx-badge type=\"warning\" size=\"sm\" round>\n <wx-icon name=\"warning\" size=\"sm\" />\n <span class=\"wx-catalog-landings__sr\">{{ t('landing.attention') }}</span>\n </wx-badge>\n </wx-tooltip>\n </div>\n </template>\n\n <template #cell-updated_at=\"{ row }\">\n <wx-date :value=\"row.updated_at\" compact />\n </template>\n\n <template #cell-actions=\"{ row }\">\n <wx-row-menu :actions=\"actionsFor(row)\" :label=\"nameOf(row)\" />\n </template>\n </wx-table>\n </wx-list-screen>\n </div>\n</template>\n\n<style scoped>\n.wx-catalog-landings {\n min-width: 0;\n}\n\n.wx-catalog-landings__name {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.wx-catalog-landings__title,\n.wx-catalog-landings__slug {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-catalog-landings__slug {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-catalog-landings__chips {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n}\n\n.wx-catalog-landings__count {\n font-variant-numeric: tabular-nums;\n}\n\n.wx-catalog-landings__state {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-catalog-landings__sr {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n</style>\n"],"names":["open","resolve","useModal","admin","useAdmin","api","createLandingsApi","tree","useCategoryTree","locales","useLocales","useCatalogLandingsMessages","t","useTranslate","NAMESPACE","message","useErrorText","step","ref","categories","subtree","facet","values","minProducts","templates","publish","facets","errors","failure","busy","preview","run","onMounted","watch","first","one","error","facetOptions","computed","valueOptions","params","ready","field","refuse","body","toPreview","timer","poll","id","delay","start","finished","onBeforeUnmount","close","word","record","columns","rows","row","index","_createBlock","_unref","WxDialog","$event","on","_createVNode","WxSpace","_createElementBlock","_Fragment","WxButton","WxAlert","_openBlock","_hoisted_1","WxFormItem","WxTreeSelect","_cache","picked","WxSwitch","WxSelect","WxInputNumber","WxText","WxInput","_hoisted_2","_createTextVNode","_toDisplayString","WxTable","_withCtx","_createElementVNode","_hoisted_3","_hoisted_4","WxProgress","_hoisted_5","ROOT","props","__props","route","useRoute","router","useRouter","panel","generate","createModal","GenerateDialog","list","canManage","page","loading","flag","key","search","pageNumber","chosenBase","attention","published","empty","trashed","perPage","title","module","baseNodes","baseName","find","nodes","found","node","applied","chips","clearFilters","query","state","asked","load","mine","answer","toast","remember","wanted","q","onState","rowMenuWidth","nameOf","localizedValue","slugOf","remove","confirm","restore","actionsFor","actions","bulk","emptyText","WxListScreen","WxIcon","WxFilterChips","_renderList","chip","WxBadge","_hoisted_6","_hoisted_7","WxTooltip","_hoisted_8","WxDate","WxRowMenu"],"mappings":"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"}