Skip to content

Phase 3: Vendor Page — Field Inventory

Purpose: Define which vendor fields appear in the grid list vs the detail panel, based on the BusinessAffiliate domain model and API schema.

The BusinessAffiliate entity (/v1/business-affiliate) contains:

BusinessAffiliate
├── eId (uuid)
├── name (string, required, unique per tenant)
├── legal: CompanyInformation
│ ├── name
│ ├── legalName
│ ├── country (CountrySymbol)
│ ├── taxId
│ ├── registrationId
│ └── naicsCode
├── contact: Contact (main contact)
│ ├── salutation, firstName, middleName, lastName
│ ├── jobTitle
│ ├── email, phone
│ ├── postalAddress: PostalAddress
│ ├── emails (map), phones (map), addresses (map), sites (map)
│ └── notes
├── mainAddress: PostalAddress
│ ├── addressLine1, addressLine2
│ ├── city, state, postalCode
│ ├── country (CountrySymbol)
│ └── geoLocation
├── contacts (map of tagged Contacts)
├── addresses (map of tagged Addresses)
└── roles[] (via BusinessRole sub-entity)
├── eId, name, role (VENDOR|CUSTOMER|CARRIER|OPERATOR|OTHER)
└── notes

Grid Columns (vendor list — scannable, sortable, filterable)

Section titled “Grid Columns (vendor list — scannable, sortable, filterable)”

These are fields users need to see at a glance when browsing vendors. All are inline-editable where it makes sense.

ColumnSource FieldCell TypeEditableSortableNotes
SelectCheckboxNoNoRow selection checkbox. Enables bulk actions (delete, export, etc.) when one or more rows selected. Pinned left.
NamenameTextYesYesPrimary identifier, required
Roleroles[].roleTag/BadgeNo (panel)YesDisplay as badges (Vendor, Customer, etc.). Multiple roles possible.
Main Contactcontact.firstName + contact.lastNameText (composite)No (panel)YesGrouped display: “Jane Smith”
Emailcontact.emailText (link)YesYesClickable mailto:
Phonecontact.phoneTextYesNo
AddressmainAddress (composite)Address (grouped)YesNoFull address in one cell: “123 Main St, Austin, TX 78701”. Easy to copy. Grouped column — splits into component fields on edit.
CitymainAddress.cityTextYesYesAlso available as standalone column if user prefers
StatemainAddress.stateTextYesYesAlso available as standalone column
CountrymainAddress.countrySelectYesYesCountry code dropdown
Postal CodemainAddress.postalCodeTextYesNo
Items(computed)NumberNoYesCount of items sourced from this vendor
Status(derived)BadgeNoYesActive/Inactive — may not exist yet in API
Job Titlecontact.jobTitleTextYesYesMain contact’s role
Tax IDlegal.taxIdTextYesNo
Legal Namelegal.legalNameTextYesYesIf different from display name
ActionsAction buttonsNoNoRow-level actions: open detail panel, overflow menu (edit, delete, etc.). Pinned right.

Default visible: Name, Role, Main Contact, Email, Phone, Address Hidden by default (user can toggle via filterable column dropdown): City, State, Country, Postal Code, Items, Status, Job Title, Tax ID, Legal Name

Fixed columns:

  • Select — pinned left, always visible, not toggleable
  • Actions — pinned right, always visible, not toggleable

Bulk actions (enabled when rows are selected via Select column):

  • Delete selected vendors (confirmation dialog)
  • Export selected (future)

Column visibility dropdown: Like the items grid “View” menu, but with a search/filter field at the top so users can quickly find columns by name in long lists. This is an improvement over the current items grid which has no filter on the column list.

Detail Panel (side panel — form view, not a grid)

Section titled “Detail Panel (side panel — form view, not a grid)”

The detail panel is a form layout, not another grid. It shows all vendor fields organized into collapsible sections with standard form inputs. Opens when user clicks a row or deep-links to a vendor.

Header Section:

  • Vendor name (large, editable)
  • Role badges (editable — add/remove roles)
  • Status indicator

Company Information Section:

FieldSourceInput TypeNotes
Legal Namelegal.legalNameTextFalls back to name
Country of Registrationlegal.countryCountry select
Tax IDlegal.taxIdText
Registration IDlegal.registrationIdText
NAICS Codelegal.naicsCodeText (future: typeahead)Industry classification

Main Address Section (composite input):

FieldSourceInput TypeNotes
Address Line 1mainAddress.addressLine1Text
Address Line 2mainAddress.addressLine2Text
CitymainAddress.cityText
StatemainAddress.stateText (future: state select)
Postal CodemainAddress.postalCodeText
CountrymainAddress.countryCountry select

Main Contact Section:

FieldSourceInput TypeNotes
Salutationcontact.salutationSelect (Mr., Ms., Dr., etc.)
First Namecontact.firstNameText
Middle Namecontact.middleNameText
Last Namecontact.lastNameText
Job Titlecontact.jobTitleText
Emailcontact.emailEmail input
Phonecontact.phonePhone input
Addresscontact.postalAddressAddress compositeIf different from main

Additional Contacts Section (expandable list):

  • Each tagged contact from contacts map
  • Add/remove contacts
  • Same fields as main contact

Additional Addresses Section (expandable list):

  • Each tagged address from addresses map
  • Add/remove addresses
  • Tag name editable (e.g. “Warehouse”, “Billing”, “Returns”)

Related Items Section (read-only list):

  • Items that reference this vendor in their primarySupply or secondarySupply
  • Links to item detail page
  • Shows item name, SKU, order method, unit cost

Notes/Activity Section:

  • Role-level notes (roles[].notes)
  • Future: activity log, order history
ActionBehavior
Click rowOpen detail panel for that vendor (push layout)
Double-click cellInline edit (if editable column)
Deep link (/vendors?id=xxx)Open page with panel pre-opened
Click “Add Vendor”Open panel in create mode (empty form)
Delete from gridConfirmation dialog, then DELETE API call
Delete from panelSame, via panel action button

This page exercises the following cell editor types from the Phase 2 grid, making it a good proving ground:

Cell TypeUsed For
TextName, email, phone
Text (composite display)Contact name (first + last)
SelectCountry
Tag/Badge (read-only)Roles
Number (read-only, computed)Item count
Badge (read-only)Status
Link (clickable)Email (mailto:)

Not exercised by vendor page (will need item grid migration to test): Image, Color, Boolean/Checkbox, Date, Money, Quantity, Duration, Memo, Typeahead, Grouped/Composite edit


Copyright: (c) Arda Systems 2025-2026, All rights reserved