• Tier 1 customization comes alive in the SPA: custom fields
    declared in YAML metadata now render automatically in create
    forms without any compile-time knowledge of the field.
    
    New component: DynamicExtFields
      - Fetches custom field declarations from the existing
        /api/v1/_meta/metadata/custom-fields/{entityName} endpoint
      - Renders one input per declared field, type-matched:
        string → text, integer → number (step=1), decimal/money/
        quantity → number (step=0.01), boolean → checkbox,
        date → date picker, dateTime → datetime-local,
        enum → select dropdown, uuid → text
      - Labels resolve from labelTranslations using the active
        locale (i18n integration)
      - Required fields show a red asterisk
      - Values are collected in the ext map and sent with the
        create request
    
    Wired into: CreateItemPage (entityName="Item"),
    CreatePartnerPage (entityName="Partner"). Both now show a
    "Custom fields" section below the static fields when the
    entity has custom field declarations in metadata.
    
    No new backend code — the existing /api/v1/_meta/metadata/
    custom-fields endpoint already returns exactly the shape
    the component needs. This is P3.1: the runtime form renderer
    for Tier 1 customization.
    zichun authored
     
    Browse Code »
  • Extends the R1 SPA with create forms for the four entities operators
    interact with most. Each page follows the same pattern proven by
    CreateSalesOrderPage: a card-scoped form with dropdowns populated
    from the API, inline validation, and a redirect to the detail or
    list page on success.
    
    New pages:
      - CreateItemPage — code, name, type (GOOD/SERVICE/DIGITAL),
        UoM dropdown populated from /api/v1/catalog/uoms
      - CreatePartnerPage — code, name, type (CUSTOMER/SUPPLIER/BOTH),
        optional email + phone
      - CreatePurchaseOrderPage — symmetric to CreateSalesOrderPage;
        supplier dropdown filtered to SUPPLIER/BOTH partners,
        optional expected date, dynamic line items
      - CreateWorkOrderPage — output item + quantity + optional due
        date, dynamic BOM inputs (item + qty/unit + source location
        dropdown), dynamic routing operations (op code + work center
        + std minutes). The most complex form in the SPA — matches
        the EBC-PP-001 work order creation flow
    
    API client additions: catalog.createItem, partners.create,
    purchaseOrders.create, production.createWorkOrder — each a
    typed wrapper around POST to the corresponding endpoint.
    
    List pages updated: Items, Partners, Purchase Orders, Work Orders
    all now show a "+ New" button in the PageHeader that links to
    the create form.
    
    Routes wired: /items/new, /partners/new, /purchase-orders/new,
    /work-orders/new — all covered by the existing SpaController
    wildcard patterns and SecurityConfiguration permitAll rules.
    zichun authored
     
    Browse Code »