Hello Team,
I have build an editable grind and now I want to save the values inside my records. I have record table and rule input in my interface the problem is how I can save this data for each request I have. The data is a sample there are around 15 rows which I want the user to be able to save some of them can be null some of them can be filled out. Basically the property is read only, once user enter value we can use a!save to save the property for the respective row, but I always get cannot index rule input records..
rows: { a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Melting Point"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Freezing Point"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Boiling Point"} ) } ),
Discussion posts and replies are publicly visible
Can you share details about the error reveived?
a!gridLayout( label: "", labelPosition: "ABOVE", headerCells: { a!gridLayoutHeaderCell(label: "Properties", align: "LEFT"), a!gridLayoutHeaderCell(label: "Value"), a!gridLayoutHeaderCell(label: "Unit"), a!gridLayoutHeaderCell(label: "Concentration"), a!gridLayoutHeaderCell(label: "Temperature"), a!gridLayoutHeaderCell(label: "Temperature Unit"), a!gridLayoutHeaderCell( label: "Explanation for Absence of data", helpTooltip: "Explanation for Absence of data is required if value is not provided" ) }, columnConfigs: { a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3) }, rows: { a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Melting Point"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: { a!save( target: ri!AOS_PhysChemDetails['recordType!{45e1c911-2882-4182-a967-cf53ca64dedd}AOS_Phys_Chem_Details.fields.{ccaef7c1-7157-4e57-a526-485f924be718}value'], value: ri!AOS_PhysChemDetails['recordType!{45e1c911-2882-4182-a967-cf53ca64dedd}AOS_Phys_Chem_Details.fields.{ccaef7c1-7157-4e57-a526-485f924be718}value'], ), a!save( target: ri!AOS_PhysChemDetails['recordType!{45e1c911-2882-4182-a967-cf53ca64dedd}AOS_Phys_Chem_Details.fields.{fd570ddd-2f11-477c-8de1-852a31e5c186}property'], value: "Melting Point" ) } ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {}
Could not display interface. Please check definition and inputs. Interface Definition: Expression evaluation error [evaluation ID = 005f7:92346] : An error occurred while executing a save: Expression evaluation error: Cannot index null List of AOS_Phys_Chem_Details
I see only a single row in that code snippet. Is that by intention? If not, I suggest to try one of the examples from the documentation
https://docs.appian.com/suite/help/24.2/Editable_Grid_Component.html#examples
Yes is set as an array, since I need to save multiple rows in the same ri!AOS_PhysChemDetailsThere are around 15 rows that need to be saved.
Yes I need to save multiple rows around 15.
This might work, but how do I save the values in rule input? Since with this I can initialize the property in the localvariable. and save the data for each row in new row.
a!localVariables( local!items: { {item: "Item 1", qty: 1, unitPrice: 10}, {item: "Item 2", qty: 2, unitPrice: 20} }, a!gridLayout( label: "Products", instructions: "Update the item name, quantity, or unit price.", headerCells: { a!gridLayoutHeaderCell(label: "Item"), a!gridLayoutHeaderCell(label: "Qty"), a!gridLayoutHeaderCell(label: "Unit Price"), a!gridLayoutHeaderCell(label: "Total", align: "RIGHT") }, rows: { a!gridRowLayout( contents: { a!textField( value: local!items[1].item, saveInto: local!items[1].item ), a!integerField( value: local!items[1].qty, saveInto: local!items[1].qty ), a!floatingPointField( value: local!items[1].unitPrice, saveInto: local!items[1].unitPrice ), a!textField( value: a!currency( isoCode: "USD", value: tointeger(local!items[1].qty) * todecimal(local!items[1].unitPrice) ), readOnly: true, align: "RIGHT" ) } ), a!gridRowLayout( contents: { a!textField( value: local!items[2].item, saveInto: local!items[2].item ), a!integerField( value: local!items[2].qty, saveInto: local!items[2].qty ), a!floatingPointField( value: local!items[2].unitPrice, saveInto: local!items[2].unitPrice ), a!textField( value: a!currency( isoCode: "USD", value: tointeger(local!items[2].qty) * todecimal(local!items[2].unitPrice) ), readOnly: true, align: "RIGHT" ) } ) }, rowHeader: 1 ) )
This is a good started: https://docs.appian.com/suite/help/24.2/Adapt_a_SAIL_Recipe_to_Work_with_My_Applications.html
I assume your ruleInput is a record... but what do you want to achieve with these two lines? Does the error persist if you change the "value" to a fixed value...? (just to know where the error is generated)
a!save( target: ri!AOS_PhysChemDetails['recordType!{45e1c911-2882-4182-a967-cf53ca64dedd}AOS_Phys_Chem_Details.fields.{ccaef7c1-7157-4e57-a526-485f924be718}value'], value: ri!AOS_PhysChemDetails['recordType!{45e1c911-2882-4182-a967-cf53ca64dedd}AOS_Phys_Chem_Details.fields.{ccaef7c1-7157-4e57-a526-485f924be718}value'], ),
This is the full code of the table, it contains 17 different properties which based on some condition I want to see all or less which is already completed with showWhen property. So now I want to be able to save them in my rule input which is a record:
a!gridLayout( label: "", labelPosition: "ABOVE", headerCells: { a!gridLayoutHeaderCell(label: "Properties", align: "LEFT"), a!gridLayoutHeaderCell(label: "Value"), a!gridLayoutHeaderCell(label: "Unit"), a!gridLayoutHeaderCell(label: "Concentration"), a!gridLayoutHeaderCell(label: "Temperature"), a!gridLayoutHeaderCell(label: "Temperature Unit"), a!gridLayoutHeaderCell( label: "Explanation for Absence of data", helpTooltip: "Explanation for Absence of data is required if value is not provided" ) }, columnConfigs: { a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3) }, rows: { a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Melting Point"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Freezing Point"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Boiling Point"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Flammability"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Upper Explosive Limit"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Lower Exposive Limit"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Flash Point"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Auto-ignition Temperature"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Decomposition Temperature"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"pH"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Kinematic Viscosity"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Dynamic Viscosity"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Partition Coefficient"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Vapour Pressure"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Density"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Relative Density"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Solid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ), a!gridRowLayout( contents: { a!richTextDisplayField( labelPosition: "COLLAPSED", value: { a!richTextItem( text: {"Relative Vapour Density"} ) } ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", disabled: false, validations: {} ), a!dropdownField( choiceLabels: {"g/cm3", "kg/m3"}, choiceValues: {"g/cm3", "kg/m3"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!textField( label: "Text", labelPosition: "ABOVE", saveInto: {}, refreshAfter: "UNFOCUS", validations: {} ), a!dropdownField( choiceLabels: {"℃", "℉"}, choiceValues: {"℃", "℉"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "Select", saveInto: {}, searchDisplay: "AUTO", validations: {} ), a!dropdownField( choiceLabels: {"Property has not been measured"}, choiceValues: {"Property has not been measured"}, label: "Dropdown", labelPosition: "ABOVE", placeholder: "--- Select a Value ---", saveInto: {}, searchDisplay: "AUTO", validations: {} ) }, showWhen: if( or( ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "Gas", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "LIquid", ri!AOS_PhysChem['recordType!{1ddc2dbc-133e-49a3-a416-3e896db0beb4}AOS_Phys_chem.fields.{6862862b-7cbf-4b5d-be70-7944f6a23f5b}PhysicalState'] = "" ), true, false) ) }, selectionSaveInto: {}, validations: {}, shadeAlternateRows: true, spacing: "STANDARD", borderStyle: "STANDARD"
Do you have a specific reason to use a grid for this?