Skip to content

Items Catalog

The Items page (/point-of-sale/items) provides read-only catalog browsing and quick product management for cashiers, showing only active products.

Items Catalog

┌──────────────────────────────────────────────────────────┐
│ Add item | Search | Sync catalog │
├──────────────────────────────────────────────────────────┤
│ Items table (sortable) │
│ - Product | SKU | Category | Price | Stock | Status │
│ - Click row → Edit modal │
└──────────────────────────────────────────────────────────┘

Button: Blue “Add item” button with plus icon

Opens simplified product creation modal:

  1. Basic info: Name, SKU, category
  2. Pricing: Base price, unit type
  3. Stock: Initial quantity (if tracking enabled)
  4. Status: Auto-set to “active”

Created products immediately appear in table and sale catalog.

  • Searches: Product name, SKU, barcode
  • Debounced 350ms
  • Full-text search across visible fields
  • Clear to reset

Force refresh catalog from server:

  • Click sync icon → fetches latest items/grouped payload
  • Updates local cache (IndexedDB or SQLite)
  • Background auto-sync runs every 5 minutes when online
ColumnContentSortableNotes
ProductName + image thumbnailYes (name_asc/desc)Primary identifier
SKUStock keeping unitNoShows ”—” if empty
CategoryCategory nameNo“(No category)” for uncategorized
PriceBase unit priceYes (price_asc/desc)Formatted currency
StockAvailable quantityYes (stock_asc/desc)Only if stock tracking enabled
StatusStatus badgeNoAlways “Active” on this page

Click column header to sort:

  • Name: Alphabetical (A→Z or Z→A)
  • Price: Low to high, or high to low
  • Stock: Ascending or descending

Default sort: newest (most recently created first).

Sort persists in URL param: ?sort=name_asc

Opens quick edit modal showing:

  • Product name, SKU, category
  • Base price (editable)
  • Stock quantity (editable if tracking enabled)
  • Image thumbnail
  • Save/Cancel buttons

Limitations:

  • Cannot change variants from this modal
  • Cannot edit advanced fields (tax, cost, etc.)
  • For full edit, must use Dashboard → Products

Name (text input):

  • Required, max 200 chars
  • Updates product display name

SKU (text input):

  • Optional, must be unique
  • Updates catalog search index

Price (number input):

  • Base price in major currency units
  • Applies to default unit/variant

Stock (number input, if tracking enabled):

  • Adjusts available quantity
  • Creates adjustment record in inventory log

Category (dropdown):

  • Select from existing categories
  • “(No category)” = unassigned
  1. Validates form (required fields, format)
  2. API call: PATCH /vendor/products/:id
  3. Success → Toast, modal closes, table refreshes
  4. Error → Shows inline errors

Quick edit unavailable when offline:

  • “Offline” badge in modal
  • Save button disabled
  • Must sync before editing

Product info:

  • Name (required): Display name
  • SKU (optional): Unique identifier
  • Category (dropdown): Select from store categories

Pricing:

  • Price (required): Base price
  • Unit type (dropdown): ea, lb, kg, box, etc.

Stock (if tracking enabled):

  • Initial stock (number): Starting quantity
  • Warehouse (dropdown): Where stock is located

Tax:

  • Taxable (checkbox): Whether to apply tax
  • Tax rate (auto-filled from store default)
  1. Validates form
  2. API call: POST /vendor/products with store_id
  3. Success:
    • Product created with status = "active"
    • Appears in Items table
    • Appears in Sale catalog immediately
    • Toast: “Product created”
  4. Error → Shows validation errors
  • Default page size: 20 rows
  • Options: 10, 20, 50, 100
  • Jump to page: Type page number + Enter
  • Total: “X items” at bottom

Pagination resets to page 1 when:

  • Search query changes
  • Sort changes
  • Page size changes

Items page uses same cache as Sale catalog:

  • Cache key: POS_LOCAL_CATALOG_CACHE_KEYS.itemsGrouped
  • Shows cached products immediately
  • Fetches fresh data in background
  • Seamless transition when fresh data arrives

Server payload PosItemsGroupedResponse transformed to:

  • Flattened product list (ungrouped)
  • Client-side pagination
  • Client-side search (filters cached data)

When offline (Desktop shows amber banner):

  • Cannot edit: Quick edit modal disabled
  • Cannot create: Quick add button disabled
  • Read-only: Viewing cached catalog only

Products filtered by:

  1. Store ID: Only products assigned to selected store
  2. Status: Only status = "active" (inactive products hidden)

Employee accounts see only their assigned store’s products.

Products added/edited on Items page immediately affect Sale:

  • New products: Appear in catalog grid
  • Price changes: Reflected in cart when product added
  • Stock changes: Updated in availability checks

No manual refresh needed — queryClient.invalidateQueries() handles sync.

Not active: Items page only shows status = "active" Solution: Activate product in Dashboard → Products

Missing permission: Requires catalog write Offline: Desktop must be online to save changes Solution: Grant permission or reconnect to network

Stock tracking disabled: Store configuration has stock tracking off Not an issue: Stock column hidden intentionally

Causes:

  • Duplicate SKU
  • Missing required fields
  • Validation errors

Solution: Check error message, fix issue, retry