Data Entry Form: Definition in TypeScript and HTML

The following topic describes how to configure a data entry form depending on its layout.

View Definition in TypeScript

For a form with a Summary area and multiple tabs, you use the following in the TypeScript file of the form:

  • For the summary view and the views that display one record, the createSingle method.
  • For each property for the view that displays a grid, the createCollection method.
  • For the summary view and each view for a tab, a class that extends PXView with the full list of fields to be displayed.
  • The headerDescription decorator for fields in the Summary area whose value should be included in the record title below the form name.
  • The gridConfig and columnConfig decorators for each grid and its columns. For details, see Table (Grid): Configuration of the Table and Its Columns.

The following code shows an example of the TypeScript configuration for the Sales Orders (SO301000) form.

import
{
    createCollection,
    createSingle,
    PXScreen,
    graphInfo,
    PXActionState
} from "client-controls";
  
@graphInfo({
    graphType: 'PX.Objects.SO.SOOrderEntry',
    primaryView: 'Document'
})
export class SO301000 extends PXScreen {
    //Actions that are used in qp-button tags in HTML
    AddInvoiceOK: PXActionState;
    OverrideBlanketTaxZone: PXActionState;
    ...
 
    //Properties for view classes
    Document = createSingle(SOOrderHeader);
    Transactions = createCollection(SOLine);
    Taxes = createCollection(SOTaxTran);
    CurrentDocument = createSingle(SOOrder);
    ...
}
  
//View classes
export class SOOrderHeader extends PXView {
    OrderType: PXFieldState;
    OrderNbr: PXFieldState;
    Status: PXFieldState<PXFieldOptions.Disabled>;
    DontApprove: PXFieldState<PXFieldOptions.Disabled>;
    Approved: PXFieldState<PXFieldOptions.Disabled>;
    OrderDate: PXFieldState<PXFieldOptions.CommitChanges>;
    RequestDate: PXFieldState<PXFieldOptions.CommitChanges>;
    CustomerOrderNbr: PXFieldState<PXFieldOptions.CommitChanges>;
    CustomerRefNbr: PXFieldState;
    CuryInfoID: PXFieldState;
 
    @headerDescription
    CustomerID: PXFieldState<PXFieldOptions.CommitChanges>;
    CustomerLocationID: PXFieldState<PXFieldOptions.CommitChanges>;
    ContactID: PXFieldState<PXFieldOptions.CommitChanges>;
    CuryID: PXFieldState<PXFieldOptions.CommitChanges>;
    DestinationSiteID: PXFieldState<PXFieldOptions.CommitChanges>;
    ProjectID: PXFieldState<PXFieldOptions.CommitChanges>;
    OrderDesc: PXFieldState;
 
    OrderQty: PXFieldState<PXFieldOptions.Disabled>;
    CuryDiscTot: PXFieldState<PXFieldOptions.CommitChanges>;
    CuryVatExemptTotal: PXFieldState<PXFieldOptions.Disabled>;
    CuryVatTaxableTotal: PXFieldState<PXFieldOptions.Disabled>;
    CuryTaxTotal: PXFieldState<PXFieldOptions.Disabled>;
    CuryOrderTotal: PXFieldState<PXFieldOptions.Disabled>;
    CuryControlTotal: PXFieldState<PXFieldOptions.CommitChanges>;
    ArePaymentsApplicable: PXFieldState<PXFieldOptions.CommitChanges>;
    IsRUTROTDeductible: PXFieldState<PXFieldOptions.CommitChanges>;
    IsFSIntegrated: PXFieldState<PXFieldOptions.Disabled>;
 
    ShowDiscountsTab: PXFieldState;
    ShowShipmentsTab: PXFieldState;
    ShowOrdersTab: PXFieldState;
}
 
export class SOOrder extends PXView {
    BranchID: PXFieldState<PXFieldOptions.CommitChanges>;
    BranchBaseCuryID: PXFieldState;
    DisableAutomaticTaxCalculation: PXFieldState<PXFieldOptions.CommitChanges>;
    ...
}
 
@gridConfig({
    preset: GridPreset.Details,
    initNewRow: true,
    syncPosition: true,
    wrapToolbar: true,
    statusField: "Availability"
})
export class SOLine extends PXView {
    //Table toolbar actions
    AddInvBySite: PXActionState;
    ShowMatrixPanel: PXActionState;
    ...
  
    //Table columns
    Availability: PXFieldState<PXFieldOptions.Hidden>;

    @columnConfig({ allowShowHide: GridColumnShowHideMode.Server })
    ExcludedFromExport: PXFieldState;
    IsConfigurable: PXFieldState;

    @columnConfig({ hideViewLink: true })
    BranchID: PXFieldState<PXFieldOptions.CommitChanges>;
    ...
}

Layout in HTML

You define the layout of a data entry form by adding the following tags to the HTML code of the form:

  • A qp-template tag. For details on using templates, see Form Layout: Predefined Templates.
  • A qp-tabbar tag with a nested qp-tab element for each tab.
  • For each tab that does not contain a grid, a nested qp-template tag.

The following example shows the HTML template for the Sales Orders (SO301000) form.

<template>
    <qp-template name="7-10-7" id="form-Document" wg-container>
        <qp-fieldset id="fsColumnA" slot="A" view.bind="Document">
            <field name="OrderType"></field>
            <field name="OrderNbr"></field>
            ...
        </qp-fieldset>
        <qp-fieldset id="fsColumnB" slot="B" view.bind="Document">
            <field name="CustomerID" config-allow-edit.bind="true"></field>
            <field name="CustomerLocationID" config-allow-edit.bind="true"></field>
            ...
        </qp-fieldset>
        <qp-fieldset id="fsColumnC-summary" slot="C" view.bind="Document" 
            caption="Summary">
            <field name="OrderQty"></field>
            <field name="CuryDiscTot"></field>
            ...
        </qp-fieldset>
    </qp-template>
 
    <qp-tabbar active-tab-id="tabDetails" id="tabs">
        <qp-tab id="tabDetails" caption="Details">
            <qp-grid view.bind="Transactions" topBarConfig.bind="{disableMenu: false}">
            </qp-grid>
        </qp-tab>
        <qp-tab id="tabFinancial" caption="Financial">
            <qp-template id="form-Financial" name="1-1-1">
                <qp-fieldset id="fsColumnA-Financial" slot="A" view.bind="CurrentDocument"
                             caption="Financial Information">
                    <field name="BranchID"></field>
                    <field name="BranchBaseCuryID"></field>
                    ...
                </qp-fieldset>
                <div slot="B">
                    <qp-fieldset id="fsColumnB-Payment"
                                 view.bind="CurrentDocument"
                                 caption="Payment Information">
                        <field name="OverridePrepayment"></field>
                        <field name="PrepaymentReqPct"></field>
                        ...
                    </qp-fieldset>
                    <qp-fieldset id="fsColumnB-Ownership"
                                 view.bind="CurrentDocument"
                                 caption="Ownership">
                        <field name="WorkgroupID"></field>
                        <field name="OwnerID"></field>
                    </qp-fieldset>
                    <qp-fieldset id="fsColumnB-Other" view.bind="CurrentDocument"
                                 caption="Other Information">
                        <field name="OrigOrderType" config-enabled.bind="false"></field>
                        <field name="OrigOrderNbr" config-allow-edit.bind="true"
                               config-enabled.bind="false"></field>
                        ...
                    </qp-fieldset>
                </div>
            </qp-template>
        </qp-tab>
        ...
    </qp-tabbar>
</template>