Vendors
Catalog, under Components: Vendors (/vendors, with vendor:read, covered by every viewer’s *:read
floor) is the directory of vendors: the organizations behind the products in the fleet, on
the same flat-registry pattern as Location Types and Tags.
A vendor is not a device; it is the company a device comes from. Each row shows the name
(for example crestron), the label, its kind
(manufacturer, integrator, or developer), an optional icon glyph key, and its
origin (official or custom). A vendor also carries an id, a uuid
minted by the database, the internal address the handle resolves to
(ADR-0062); the handle is what you type and read.
A vendor is consumed by the product catalog: a product (“Acme 123A,
by Acme”) references its vendor through an optional vendor_id, chosen from a vendor picker on
the product’s create and edit forms, and a component then points at that product. Several shipped
official products carry a vendor this way. See
core entities for where the vendor registry sits in the fleet
model, and Drivers for the other leaf catalog beside it.
- Kind classifies the organization: a manufacturer builds hardware, an integrator assembles and installs systems, a developer ships software. It defaults to manufacturer and is a closed set; a value outside it is refused (422).
- New vendor (with
vendor:create, an admin permission) opens a create drawer: give it a name (unique tenant-wide, e.g.crestron) and a label; choose its kind (defaults to manufacturer); icon (a glyph key), support phone, and website are optional. - Pick a row to open its detail blade. The footer Edit pencil (with
vendor:update) edits the label, kind, icon, support phone, and website; the name is fixed, since a catalog row carries no rename. Delete (withvendor:delete) removes the row, behind a confirm. A verb you lack greys just that button, its hover reason naming the permission (Requires vendor:update,Requires vendor:delete); the pair never disappears. - An official row is always read-only: the blade keeps the Edit and Delete pair in place, greyed, with the reason on hover: “Official: ships with Omniglass and updates with it.” Omniglass ships eight official vendors (Crestron, Biamp, QSC, Shure, Cisco, Extron, Sony, Samsung), all manufacturers, as a starter baseline, upserted idempotently at boot so the shared set cannot drift install to install; add a custom vendor for anything else.
- Website is validated to an
http/httpsURL, on both the create/edit form and the API: a value in another scheme (for examplejavascript:) is refused with a 422 rather than stored. A valid website renders as a live link on the blade; a value that fails the check (entered off console, through a raw API call that bypassed the client) still renders, as plain text, never as a dead or unsafe link. - Delete carries no in-use guard: a product references a
vendorthrough its optionalvendor_id, but that link ison delete set null, so deleting a vendor detaches it from those products (their vendor clears) rather than blocking. Removing a custom row is unconditional (still refused for an official row, 422). The 409 delete-refused-while-referenced rule the Location Types registry enforces lives instead oncomponent.product_id(a product with components cannot be deleted), not on the vendor.
Minting a vendor is admin-gated; the picker that consumes it lives on the
product create and edit forms. The same operations are omniglass vendor list/get/create/update/delete from the CLI (see the CLI reference).