Modules
Catalogue module for PhoenixKit.
PhoenixKitAI.Translatable adapter for catalogue resources —
the small per-module hook into PhoenixKitAI's generic AI-translation pipeline.
PhoenixKitAI.Components.AITranslate.FormBinding for catalogue forms —
the storage-specific half of the shared AI-translate glue.
Folder-scoped file attachments + featured image for catalogue resources (items and catalogues share the exact same pattern).
Context module for managing catalogues, manufacturers, suppliers, categories, and items.
Attribute SETS — the 2026-08-18 rework of the group/attribute system.
Subscribes to entities blueprint lifecycle events and prunes item attachments whose set blueprint was deleted out from under them — the "suspenders" to the delete guard's "belt" (the guard refuses deleting attached sets; this cleans up after deletes that bypassed it, e.g. repo-level operations or a host that never registered the guard). The design doc always claimed this subscriber; the 2026-08-18 panel review noticed it was never actually wired.
Attribute groups — reusable, translatable sets of product characteristics.
Pure browse-state reducer for paged, searchable, category-filtered item
browsing — the shared brain of ItemSelectorModal and any embedded
browse surface.
Catalogue-level item and category counts. Includes both per-uuid helpers and single-query batch versions to avoid N+1 lookups when rendering catalogue lists with associated item / category counts.
Links a catalogue directory row to the CRM party it represents.
Copies of items and categories — the "Duplicate" bulk action.
Context for managing the phoenix_kit_cat_item_supplier_info junction table.
Manufacturer ↔ Supplier many-to-many links.
Manufacturers — company directory used as the source of items.
Engine chain for PDF text extraction: pdfium (in-app, precompiled NIF)
first, poppler (pdfinfo/pdftotext system binaries) as the fallback
when installed.
PDF library — upload, extract, search.
Real-time fan-out for catalogue mutations.
Smart-catalogue rules — one row per (item, referenced_catalogue) pair.
Item search — global, per-catalogue, and per-category, with optional
scope composition (catalogue_uuids AND category_uuids).
Public smart-pricing evaluator — the canonical implementation of the
algorithm previously documented as a copy-paste reference in
guides/smart_catalogues.md.
Where a supplier's comments about ONE item live.
Admin-defined EXTRA fields on a supplier row — "incoterm", "carton quantity", "certification expiry" — added without a migration.
Suppliers — delivery companies linked to manufacturers via the
many-to-many phoenix_kit_cat_manufacturer_suppliers table.
Multilang data JSONB helpers — read merged language data from a
record and write language-specific overrides through the entity's own
update function.
Central mapping from error atoms (returned by PhoenixKitCatalogue.Catalogue
and the import pipeline) to translated, user-facing strings.
Export context for the Catalogue module.
Behaviour for export destinations (e.g. PRO100, Universal).
PRO100 export destination.
Universal export destination.
Universal JSON export encoder.
Gettext backend for phoenix_kit_catalogue.
Import context: source registry (inbound mirror of Export).
Executes an import plan by creating categories and items.
Maps file columns to catalogue fields and transforms row data into validated item attribute maps ready for insertion.
Matches PRO100 rows to existing catalogue items.
Parses XLSX and CSV files into structured row data.
Parses the PRO100 fixed-layout text formats (# Parts / # Materials).
Builds the PRO100 sync diff/report. Rows fall into three buckets
Applies a Pro100TemplatePlan to the catalogue.
Parses a PRO100 configTables export — the estimate/price template PRO100 uses
to quote a project. XML, despite the extension the exporter gives it.
Turns a parsed PRO100 estimate template into the catalogue structure to create.
Behaviour for import sources — the inbound mirror of Export.Destination.
PRO100 import source: fixed-layout # Parts / # Materials, update-by-id.
Universal import source: XLSX/CSV (existing parser) + JSON (export round-trip).
Global, code-defined list of metadata fields that catalogue resources (items and catalogues) can opt into.
Centralized path helpers for the Catalogue module.
PRO100 numeric id: the SKU reduced to digits only ("76.0026.12" ->
"76002612"). Shared by the PRO100 export (id column) and import (match key)
so the two never drift. nil/no-digit -> "".
Schema for attributes within an attribute group ("Color", "Trim").
Schema for attribute groups — reusable, translatable sets of product characteristics ("Idea doors": Color, Trim, Surface…).
Schema for values within an attribute ("White", "Oak", "Anthracite").
Schema for catalogues — top-level groupings (e.g., Kitchen Furniture, Plumbing).
Smart-catalogue rule: one row per (item, referenced_catalogue) pair.
Schema for categories within a catalogue.
Schema for catalogue folders — a nesting layer for organizing catalogues on the admin index. Folders are module-global (not scoped to a catalogue) and are unrelated to the media-folder system.
Schema for catalogue items — individual products/materials with SKU and pricing.
Item ↔ attribute-group assignment row.
Join row: an item's attachment of one attribute SET (a managed
entities blueprint — "Ikea colors"). Items attach any number of sets,
ordered by position.
Junction table row linking a catalogue item to a supplier.
Schema for manufacturers.
Join table linking manufacturers to suppliers (many-to-many).
Per-upload row in the catalogue's PDF library.
Extraction state for one unique PDF file content.
Per-page join row keyed by (file_uuid, page_number).
Content-addressed cache of PDF page text.
Schema for suppliers.
Create/edit form for attribute groups, with the inline attribute/value editor on :edit.
Create/edit form for attribute SETS (the 2026-08-18 rework): one dimension from one vendor — "Ikea colors" — stored as a managed entities blueprint whose data records are the values.
Detail view for a single catalogue, with infinite-scroll paging over its categories and items.
Create/edit form for catalogues with multilang support.
Landing page for the Catalogue module.
Create/edit form for categories within a catalogue.
Reusable UI components for the Catalogue module.
Embeddable, selection-agnostic building blocks for browsing catalogue
items — the pieces ItemSelectorModal is assembled from, exposed so a
host LiveView can compose its own browse surface (a storefront section,
a picker, a read-only category wall) without copying markup.
Embeddable catalogue browse surface: search, category chips, and the
photo-forward item grid as one drop-in LiveComponent — the same
BrowseState + Browse.* stack ItemSelectorModal runs on, minus the
selection chrome. Put a catalogue (or a scoped slice of one) on any
logged-in page
Combobox LiveComponent for picking a single item from the catalogue via server-side search.
Catalogue item selector modal: the catalogue's analogue of core's
MediaSelectorModal. A logged-in user browses the catalogue inside a
modal — search, category chips, photo-forward card grid — picks items,
sets a quantity per item, reviews the selection in a tray, and confirms.
LiveComponent that searches the PDF library for any page whose text matches one of the given item's translated names.
A read-only product card for a catalogue %Item{} — opened from the
ItemPicker thumbnail or a list's featured-image thumb, and potentially
shown to a CLIENT, not just admins, so it has to stand on its own.
LiveView for the catalogue activity events subtab.
Stateless controller for the catalogue export download.
Export tab LiveView.
Tiny utilities shared by every catalogue LiveView. Imported into LVs
via the standard import PhoenixKitCatalogue.Web.Helpers line.
Multi-step import wizard for catalogue items.
Create/edit form for catalogue items with multilang support.
Single-PDF detail page. Shows metadata + extraction status, embeds
the vendored PDF.js viewer in an iframe pre-bound to the file and
the optional ?page=N URL param.
Admin index for the PDF library subtab.
Route module for PhoenixKit Catalogue admin routes.
Column metadata for the catalogue admin tables, keyed by scope
(:catalogues, :suppliers, :manufacturers). Pure data — cell and
card rendering live in the LiveView. Labels are zero-arity fns so they
resolve in the request's current locale.
Pure, in-memory search → filter → sort pipeline over a list of row maps (catalogues/suppliers/manufacturers already loaded by the LiveView).
Toolbar pieces for the catalogue admin tables: the column-settings modal,
the sort select+direction control, and an enum filter select. All emit
plain events handled by CataloguesLive against the active scope.
Per-user table view config (columns / sort / filters / view mode) for the
catalogue admin tables. Stored in phoenix_kit_users.custom_fields under
the "catalogue_view_configs" key — no dedicated table. Precedent:
PhoenixKit.Notifications.Prefs.
Oban worker that extracts text page-by-page from a PDF through the
PdfEngines chain: pdfium (in-app precompiled NIF — no system
packages needed) first, poppler (pdfinfo/pdftotext) as the
fallback when installed.
Mix Tasks
Reports junction rows in phoenix_kit_cat_item_supplier_info whose
supplier_uuid does not resolve in the expected source.