=a!gridRowLayout( id: ri!index, contents: { a!textField( /* Labels are not visible in grid cells but are necessary to meet accessibility requirements */ label: "summary " & ri!index, value: ri!items[ri!index].summary, saveInto: ri!items[ri!index].summary, required: true ), a!integerField( label: "qty " & ri!index, value: ri!items[ri!index].qty, saveInto: ri!items[ri!index].qty, validations: if(tointeger(ri!items[ri!index].qty) < 1, "Quantity must be greater than 0", null), align: "RIGHT" ), a!floatingPointField( label: "unitPrice " & ri!index, value: ri!items[ri!index].unitPrice, saveInto: ri!items[ri!index].unitPrice, validations: if(todecimal(ri!items[ri!index].unitPrice) < 1, "Unit price must be greater than 0", null), align: "RIGHT" ), a!textField( label: "amount " & ri!index, value: if( or(isnull(ri!items[ri!index].qty), isnull(ri!items[ri!index].unitPrice)), null, dollar(tointeger(ri!items[ri!index].qty) * todecimal(ri!items[ri!index].unitPrice)) ), readOnly: true, align: "RIGHT" ), a!dropdownField( label: "dept " & ri!index, choiceLabels: {"Finance", "Sales"}, placeholderLabel: "--Select-- ", choiceValues: {"Finance", "Sales"}, value: ri!items[ri!index].dept, saveInto: ri!items[ri!index].dept ), a!dateField( label: "due " & ri!index, value: ri!items[ri!index].due, saveInto: ri!items[ri!index].due, validations: if(todate(ri!items[ri!index].due) < today(), "The due date cannot be in the past", null), align: "RIGHT" ), a!imageField( label: "delete " & ri!index, images: a!documentImage( document: a!iconIndicator("REMOVE"), altText: "Remove", caption: "Remove " & ri!items[ri!index].summary, link: a!dynamicLink( value: ri!index, saveInto: { a!save(ri!items, remove(ri!items, save!value)), /* When modifying the size of the array used in a!applyComponents, */ /* make the same change in the "token" array variable */ a!save(ri!itemsToken, remove(ri!itemsToken, save!value)) } ) ), size: "ICON" ) } )