View this page in the latest version of Appian. a!gridField_26r2 Component Share Share via LinkedIn Reddit Email Copy Link Print On This Page This page contains information related to an old version of the Read-Only Grid Component. To take advantage of the latest features and improvements, we always recommend you use the latest version whenever possible. See the latest version's page for information about what's been changed. Function a!gridField_26r2( label, labelPosition, instructions, helpTooltip, emptyGridMessage, data, columns, pageSize, initialSorts, secondarySorts, pagingSaveInto, selectable, selectionStyle, selectionValue, selectionSaveInto, selectionRequired, selectionRequiredMessage, disableRowSelectionWhen, validations, validationGroup, showWhen, spacing, height, borderStyle, shadeAlternateRows, rowHeader, accessibilityText, refreshAlways, refreshAfter, refreshInterval, refreshOnReferencedVarChange, refreshOnVarChange, userFilters, showSearchBox, showRefreshButton, showExportButton, recordActions, openActionsIn, actionsDisplay, actionsStyle, maxSelections, showSelectionCount, loadDataAsync, similarityScoreThreshold ) Displays a grid of data as rich text, links, images, buttons, tags, record actions, or progress bars. This grid component also supports searching, filtering, selecting, sorting, and paging. For example: Scroll or drag to pan · ⌘+/⌘− to zoom · Esc to close To organize editable inputs in a tabular layout, use an editable grid. See also: Grid Tutorial: Learn how to build a read-only grid with selection, conditional formatting, row filtering, and dynamically displaying content. Configuring the Read-Only Grid: Understand different configuration and data options for read-only grids. Parameters Note: Not all parameters are immediately available in design mode; some display only after enabling others. For example, after selecting Selectable, other selection-related parameters will be available. Name Keyword Types Description Label label Text Text to display as the grid label. Label Position labelPosition Text Determines where the label appears. Valid values: ABOVE (default) Displays the label above the component. ADJACENT Displays the label to the left of the component. COLLAPSED Hides the label. The label will still be read by screen readers; see accessibility considerations for more information. JUSTIFIED Aligns the label alongside the component starting at the edge of the page. Instructions instructions Text Supplemental text about this grid. Help Tooltip helpTooltip Text Displays a help icon with the specified text as a tooltip. The tooltip displays a maximum of 500 characters. The help icon does not show when the label position is "COLLAPSED". Empty Grid Message emptyGridMessage Text Text to display in the grid when no data is available. Default is "No items available". Data Source data recordType, List of Map and List of Dictionary, DataSubset, or PortalReportDataSubset The data to display in the grid. Use a record type reference or a!recordData() to source your data from records and utilize records functionality, such as user filters and export to Excel. For other cases, you can use a query, such as a!queryEntity() with pagingInfo set as fv!pagingInfo to have the grid automatically manage paging. The function a!queryProcessAnalytics(), a Data Subset, a list of Dictionary, or an array of data can also be used. When using a query that returns a datasubset, you must pass the total count (fetchTotalCount: true on the query). Columns columns List of a!gridColumn() The columns to display in the grid, configured using a!gridColumn(). Rows to Display Per Page pageSize Number (Integer) The maximum number of rows to display at a time. Default: 10 Initial Sorts initialSorts List of SortInfo Sorts applied to the grid upon initial load only. Each sort is applied in the order listed. The first sort in the list will display an active-sort arrow indicator (either up or down for ascending or descending) in its corresponding grid column (if applicable). Secondary Sorts secondarySorts List of SortInfo Sorts applied to the grid after every user interaction. If the user activates a sort on a column, these sorts will be applied to the other columns in the order they're listed. For example, adding a secondary sort on Month will keep them in order when the user sorts on Year. Secondary sorts do not display an active-sort indicator. Paging Save Into pagingSaveInto List of Save One or more variables that are updated only when user invokes a paging action on the grid. You can reference the current paging of the grid using fv!pagingInfo. Selectable selectable Boolean Determines if grid rows are selectable. When selection style is "CHECKBOX" (default), the selection column is displayed. Default: false. Selection Style selectionStyle Text Determines the style when a row is selected. Valid values: "CHECKBOX" (default), "ROW_HIGHLIGHT". Selection Value selectionValue Text Array or Integer Array Identifiers of the rows that should appear as selected. Can be set to have rows be pre-selected for the user. Supported types: Text Array and Integer Array. Save Selection To selectionSaveInto List of Save One or more variables that are updated with the selected identifiers when the user changes selections. Use a!save() to save a modified or alternative value to a variable. You can reference the rows selected and deselected in the most recent user interaction (not all selected or deselected rows) using fv!selectedRows and fv!deselectedRows respectively. Selection required selectionRequired Boolean Determines if a selection is required to submit the form. Default: false. Selection Required Message selectionRequiredMessage Text Custom message to display when a selection is required and not provided. Disable Row Selection disableRowSelectionWhen Boolean Determines for each row if selection is disabled. The condition defined in this parameter is evaluated once for each row. Reference fields from the source using dot notation, such as fv!row.status, or the identifier of the row using fv!identifier. Grids that use record data must use the recordType! domain to reference a record field or related record field. For example, fv!row[recordType!Case.fields.caseName]. Default: false. Validations validations List of Variant Validation errors to display below the grid when the data is invalid, configured using a!validationMessage(). You can reference the current page of data using fv!currentPage. Validation Group validationGroup Text When present, the requiredness of the field is only evaluated when a button in the same validation group is pressed. The value for this parameter cannot contain spaces. For example, “validation group” is not a valid value. You need to add an underscore between words: “validation_group”. See the following recipes for more information: Configure Buttons with Conditional Requiredness Validation Groups for Buttons with Multiple Validation Rules' Show When showWhen Boolean Determines whether the component is displayed on the interface. When set to false, the component is hidden and is not evaluated. Default: true. Spacing spacing Text Determines the spacing within grid cells. Valid values: "STANDARD", "DENSE". Auto default: Uses "STANDARD" in browsers and "DENSE" in Appian Mobile. Height height Text Determines height of the grid. Valid values: "SHORT", "SHORT_PLUS", "MEDIUM", "MEDIUM_PLUS", "TALL", "TALL_PLUS", "EXTRA_TALL","AUTO" (default). All grid heights besides AUTO have fixed headers that will remain at the top of the grid when scrolling. Border Style borderStyle Text Determines the style of the grid border. Valid values: "STANDARD", "LIGHT" (default). Shade Alternate Rows shadeAlternateRows Boolean Determines whether alternate rows are shaded. Default: false. Row Header rowHeader Number (Integer) Index of the column to be used as the row header. Screen readers will announce the value in each row header when navigating to other cells within that row. Used only for accessibility; produces no visible change. Accessibility Text accessibilityText Text Additional text to be announced by screen readers. Used only for accessibility; produces no visible change. Refresh after each user interaction refreshAlways Boolean When true, grid data will be refreshed after each user interaction and each interval refresh. Default: false. Refresh after record action completes refreshAfter List of Text String Refreshes grid data each time a specified action completes. Valid values: "RECORD_ACTION". Refresh after an interval of time refreshInterval Number (Decimal) How often grid data gets refreshed in minutes. When null, grid data will not be refreshed on an interval. Valid values: "0.5", "1, 2", "3", "4", "5", "10", "30", and "60". Refresh after referenced variable changes refreshOnReferencedVarChange Boolean When true, grid data will be refreshed each time the value of any variable referenced in the data parameter is updated. To refresh grid data when another variable that is not used in the data parameter changes, use refreshOnVarChange. Default: true. Refresh after variable changes refreshOnVarChange Any Type Refreshes grid data each time any of these specific variables change. This allows you to refresh the grid data when a variable that is not referenced in the data parameter is updated. You can define a single variable (e.g. refreshOnVarChange: local!var1) or a list of variables (e.g. refreshOnVarChange: {local!var1, local!var2}). User Filters userFilters List of Variant List of user filter references to display, configured using the recordType! domain. For example, recordType!Case.filters.status. You may only reference user filters defined on the source record type used for the grid data. This parameter only applies when a record type is used as the source in the data parameter. Show search box showSearchBox Boolean Determines if the record search box should be shown. This parameter only applies when a record type is used as the source in the data parameter. Default: true. Show Refresh Button showRefreshButton Boolean Determines if the grid should include a refresh button to manually refresh data. This parameter only applies when a record type is used as the source in the data parameter. Default: true. Show Export to Excel Button showExportButton Boolean Determines if grid data can be exported. This parameter only applies when a record type is used as the source in the data parameter. Default: false. Record Actions recordActions List of Variant List of record action items to display above the grid, configured using a!recordActionItem(). If you use fv!identifier in the identifier parameter of a!recordActionItem(), you will also need to configure selection for the grid. This parameter only applies when a record type is used as the source in the data parameter. Open Actions In openActionsIn Text Determines how record actions should open to the user. Valid values: "DIALOG" (default), "NEW_TAB", "SAME_TAB". Actions Display actionsDisplay Text Determines which details are shown for record actions, regardless of style. Valid values: "LABEL_AND_ICON" (default), "LABEL", "ICON". Actions Display actionsStyle Text Determines how the list of actions should be displayed above the grid. Valid values: "TOOLBAR" (default), "TOOLBAR_PRIMARY". Learn more. Maximum Selections maxSelections Number (Integer) The maximum number of items the user can select. When the user selects the maximum number of items, row selection is disabled. Show Selection Count showSelectionCount Text Determines when the number of selected items displays below the grid. Valid values: "AUTO" (default), "ON", "OFF". "AUTO" displays the selection count if the value of the maxSelections parameter is greater than 1. Load Grid Data in Background loadDataAsync Boolean When a record type is used as the grid's data source, set this to true to load the grid data and filters independently from the rest of the interface. To asynchronously load data that is used in other components as well, instead of setting this to true, use a!asyncVariable to define a local variable and use the local variable in the data parameter. See Asynchronous Loading for more information. Default: false. Similarity Score Threshold similarityScoreThreshold Number (Decimal) When smart search is available, it returns records that match the user's search for fields with smart search enabled, as long as they appear in the grid and meet or exceed the similarity score. Default: 1. A value of 1 means that only keyword matches will be displayed. Usage considerations Choosing the source of the grid The fastest way to configure a read-only grid is from design mode. When you drag and drop the component into the live view and go to the Data tab of the Component Configuration pane, you can select one of the following options as the grid's data source: Data Source Action Record type Select a record type to use as the source. Grids that use a record type as the source are referred to as a records-powered grids.When you select a record type as the data source, the grid will populate with the record list configured on the record type. You can also reuse other elements from the record type. Query Create an a!queryEntity() expression from the query editor and use the resulting query as the source. Variable Select a rule input or local variable as the source. Rule Select an expression rule to use as the source. Expression Write an expression directly in the component to use as the source. Using records-powered grids Consider the following when creating a records-powered grid. Using records-powered grids in a portal When you use a records-powered grid in a portal, there are a few things to keep in mind: Some record components don't work in portals: Certain record components, such as record links and record actions, are incompatible with portals. When you create a read-only grid using a record type, it may automatically use these components, so be sure to remove the incompatible components before publishing your portal. Users can't save their filters in a portal: The record list search, refresh button, export to Excel, and user filters will all function in a portal. However, users can't save their filters in a portal since they aren't signed in. The Manage filters button is replaced with a Clear Filters button in a published portal. Asynchronous loading is not compatible with portals. Scroll or drag to pan · ⌘+/⌘− to zoom · Esc to close See Working with Data in Portals for more information about using records as the source for read-only grids in portals. Autopopulate a grid with a record list When a record type is used as the data source for your read-only grid, Appian automatically generates grid columns based on the columns configured for the record list. Specify which fields to query and when By default, a grid will query and display all the data specified in the columns, pagingSaveInto, and selectionSaveInto parameters. This default behavior can potentially impact performance if your grid includes dynamic behavior since it may result in querying more data than necessary. For example, let's say you configured the showWhen parameter on the columns in your grid so that certain columns only appear to managers. Even when columns are hidden from the grid, those fields will still be queried since they're specified in the columns parameter of the grid. To alter this default behavior, you can specify when the grid should query the fields in your columns using the fields parameter in a!recordData(). Learn more about using the fields parameter in a!recordData(). Reference related data If your record type has relationships configured, you can also reference related record fields in your grid. Filter, limit, and sort related one-to-many data If you reference a related record field from a one-to-many relationship as a column in the grid, the maximum number of related records returned for each base record is 100. To filter, limit, and sort the related record set returned from the one-to-many relationship, you can leverage the relatedRecordData parameter in a!recordData(). Avoid using relationship references to display related one-to-many data. Instead, you should only reference the specific related record field you want to display. This avoids querying more data than necessary, which can impact the grid's performance and export behavior. For example, to display a list of cases associated with each customer, you should use the related record field reference recordType!Customer.relationships.cases.fields.title in the grid column. You should not use the relationship reference recordType!Customer.relationships.cases. Use records-specific components You can use the following components on any records-powered grid: User filters Search Export to Excel button Record actions Smart search Export data to Excel When set to true, the showExportButton parameter allows users to export the grid data to Microsoft Excel. By default, any columns visible in the grid will export to Excel. You can specify which columns are exported by configuring the exportWhen parameter on individual grid columns. Users should only export grid data from applications and sites. You should not export grid data from an interface in Appian Designer. Review how much data can be exported from the grid, and how certain display elements are exported to Excel. Display and style record actions The recordActions parameter allows you to display record actions, like related actions or record list actions, on the grid. You can display actions from different record types. You can then use the actionsStyle parameter to determine whether all actions display as with standard styling, or if the first record action displays as a primary button style. Appian recommends using the "TOOLBAR_PRIMARY" option when you want the first action, typically the most common action, to stand out. When actionsStyles is set to "TOOLBAR", the buttons display like this: Scroll or drag to pan · ⌘+/⌘− to zoom · Esc to close When actionsStyles is set to "TOOLBAR_PRIMARY", the buttons display like this: Scroll or drag to pan · ⌘+/⌘− to zoom · Esc to close See the record action component for other details to consider when adding record actions to a grid. Record action security Each action specified in the recordActions parameter has security that is checked to ensure only the right users can see the right actions. In most cases where you use security rules, Appian evaluates the security for the entire grid before it is shown to the user. Because security rules are verified in bulk, the overall grid loading time will be shorter than if security expressions are used. Note: If you use a!localVariables() inside an a!recordActionItem(), Appian cannot perform a bulk security evaluation, so the grid may load slower than expected. Whenever possible, create local variables outside a!recordActionItem(). Row limit for records-powered components Interface components that use a record type as the data source are known as records-powered components. Records-powered components can display a maximum of 5,000 rows. As a best practice, you should not display all 5,000 rows in a component since it may impact performance. Async loading considerations Asynchronous (async) loading can provide a better user experience. When you configure a grid to load asynchronously, a placeholder will display in the grid's place, enabling users to interact with other parts of the interface while the grid's data loads in the background. Using loadDataAsync vs a!asyncVariable() There are two ways to enable async loading in a read-only grid: Using the loadDataAsync parameter: When you use a record type as the grid's data source, you can set the loadDataAsync parameter to true. Use an async local variable for the data parameter using the a!asyncVariable() function: If the grid's data is reused elsewhere in the interface, use a!asyncVariable() to create an async variable instead. See Asynchronous Loading for detailed guidance on how async loading works and when to use it. Note: While you can use the loadDataAsync parameter when you are using a query function in the data parameter, we don't recommend it. Instead, use an async local variable for reused data or a record type for grid-only data. Offline and portal considerations In offline mobile and portal interfaces, read-only grids that are configured to load asynchronously will load with the rest of the interface, instead of loading in the background. Async loading placeholder If the grid data uses async loading, a placeholder will be displayed for the entire grid until the async data is finished loading. For grids with one or two columns that load slowly, you can wrap the column's value parameter in a rich text display component to display a placeholder for the column while the rest of the grid loads normally. The data for the column must be queried separately in an async local variable and be used directly in the read-only grid column component. See Async column example for an example expression. See a!asyncVariable() for more information on how the placeholder behavior works. Configuring grid display If the value for a column is empty or null, the grid still renders the column with just the label. The selectionStyle of ROW_HIGHLIGHT does not have any visual indicator when selection is disabled through the disableRowSelectionWhen parameter. For accessibility purposes, every grid should have a row header configured. The first column containing text is usually the correct choice for row header. See the SAIL Design System for more information. Configuring grid paging To reduce clutter on smaller grids, the following happens: No paging controls are displayed when all rows are on one page. Paging controls to jump to the first or last page are not displayed when a grid has less than 3 pages. When a read-only grid is used offline, paging and sorting don't function and images won't render. If you are managing your own paging, you cannot pass a datasubset which has a paging configuration that uses a batch size of -1. When entering a query in the data parameter (either directly, or indirectly from a rule reference), the query must return the total count (fetchTotalCount: true). Grid height and column width Grid heights behave as a fixed height on web but a maximum height on mobile. For columns using the "AUTO" width, each column's width is determined by the length of the longest value in that column. See the read-only grid column component for more information on using the "AUTO" width. For complete guidance on when and how to use column widths, see Column Widths. Design mode guidance Note: This guidance does not apply to grids that use a record type as the data source. See Configuring the Read-Only Grid to learn how to configure a records-powered grid in design mode. The following guidance applies when configuring a read-only grid in design mode: Generated columns: When you populate the data parameter from design mode and let the grid manage the paging, the grid will automatically generate an initial set of columns in the order they appear. Grid columns are not automatically generated when you select VARIABLE as the data source and use a local variable to power the read-only grid. The initial values for automatically-generated columns are: Parameter Value Description label fv!row.<fieldname> The field name is converted to title case. If the field name is in camel case, it will be split and converted to title case. If the field name is too long, it will be truncated with ellipses (...). value fv!row.<fieldname> The field value to display. sortField <fieldname> The field name of the primary key. align "END" or fixed() The alignment depends on the field's data type. If the data type for the column value is numerical or date-based, then it will set align : "END". If the data type for the column value is a decimal, then it will be wrapped in the fixed() function to two decimal places. Ex. value: fixed(fv!row.cost, 2). Updating columns: After initial columns have been generated, the grid will automatically update with new columns to match any new fields added to the data source. However, automatic updates do not occur when the data source is an RULE or EXPRESSION. To update the columns displayed in the grid, you must update the data source, and add or remove the columns manually. Selecting QUERY as the data source: If you select QUERY as the data source, you'll use the query editor to configure the query that powers your grid. Appian will automatically use the following query values in your grid: The query's batchSize will be the value of the grid's pageSize parameter. The query's sortInfo will be used as the grid's initialSort parameter. Batch size limitation: The grid cannot use a query that has a paging info with a batch size of -1 in design mode. Using smart search By default, the search box in a read-only grid uses a keyword search to find exact matches to a user's search terms. You can implement semantic search in this default search box, or by building a custom search box for the grid. Depending on which search box you’re using, the way you implement semantic search and how it behaves will differ: In the default search box: When implemented, both smart search and keyword search are applied to the grid. Smart search will apply to all columns that reference fields with smart search enabled, and keyword search will apply to all columns with text and number (integer) fields. Learn how to implement smart search in the default search box. In a custom search box: When implemented, smart search is only applied to fields that are filtered by a "search" operator. Learn how to implement smart search in a custom search box. Using the Similarity Score Threshold parameter The similarityScoreThreshold parameter controls how closely results must match the search term to be returned in the grid. This parameter is only available when the showSearchBox parameter is true. Using higher values in this parameter will set a stricter similarity requirement, returning fewer and more relevant results. Lower values will return more results with a broader range of relevance. By default, this parameter is 1 to return only exact or partial keyword matches. To use both keyword search and smart search in the grid, lower this value. Appian recommends starting with a lower threshold to test the types of results returned. You can then raise the threshold based on your observations to find the best score for your specific data and use case. See general guidelines for interpreting similarity scores to help pick your threshold. Sort by similarity score You can sort a read-only grid by similarity score to show the most relevant search matches first. When you sort by similarity score, you must also configure a secondary sort. The secondary sort determines the grid's order when a user has not entered a search term, which means the similarity score is null. To sort the grid by the highest similarity score: In the initialSorts parameter of the read-only grid, define an array {} containing two a!sortInfo() functions. In the first a!sortInfo() function, configure the following: For field, enter recordType!<Record Type Name>.searchResults.allSearchFields.similarityScore. This will sort by the primary similarity score. For ascending, enter false. This will sort from highest to lowest similarity score, placing more relevant results first in the list. In the second a!sortInfo() function, choose a field to sort by when the grid first loads or when the search box is empty. For example: 1 2 3 4 5 6 7 8 9 10 11 12 initialSorts: { /* Sorts by similarity score in descending order if there is a search */ a!sortInfo( field: recordType!SSTA Case.searchResults.allSearchFields.similarityScore, ascending: false() ), /* Defaults to sorting by id field when there is no search */ a!sortInfo( field: recordType!SSTA Case.fields.id, ascending: true ) }, Tips for smart search Setup: Verify that the fields you want to search are enabled for smart search. Confirm that the smart search indexing status for your record type is Completed. Ensure the fields with smart search enabled are displayed as columns in the grid. Sorting and filtering: In the initialSorts parameter, add a sort on the similarity score to show the most relevant results first by default. You should also add a secondary sort to determine how to sort the grid when the search box is empty. Use recordType!<Record Type Name>.searchResults.allSearchFields.similarityScore whenever possible to sort and filter since it will use the primary similarity score. Only use recordType!<Record Type Name>.searchResults.<Field Name>.similarityScore to sort or filter by a similarity score for a specific field if your use case requires it. Display: Add a column to the grid to illustrate the search result quality, so users understand why certain results are higher than others. See the Display Smart Search Match Quality in a Read-Only Grid recipe for an example. Performance: Search time increases as the number of rows and searchable fields grows. To improve performance, limit the number of fields and rows being searched when possible. For example, searching 10,000 rows is faster than searching 1 million rows. Examples You can find example configurations of the grid at Configuring the Read-Only Grid and Grid Tutorial. These examples only use keyword search to search through the grid. To experiment with examples, copy and paste the expression into an interface object. Record type object references are specific to each environment. If you copy and paste these examples into your interface, they will not evaluate. Use them as a reference only. Async column example This example shows how to use async loading for a specific column while the rest of the grid loads normally. The status column uses an async local variable to query data separately and displays a placeholder until the data loads. This works great in an interface that is primarily made up of a grid and you know that one or two columns in particular will take longer than the rest of the grid to load. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 a!localVariables( local!statusId: a!asyncVariable( a!queryRecordType( recordType: recordType!IT Task, fields: { recordType!IT Task.fields.statusId }, pagingInfo: a!pagingInfo(startIndex: 1, batchSize: 10) ).data ), { a!gridField( label: "Record List", data: recordType!IT Task, columns: { a!gridColumn( label: "Tasks", value: fv!row[recordType!IT Task.fields.task] ), a!gridColumn( label: "Grid Column", value: a!richTextDisplayField( value: { a!match( value: index( local!statusId, fv!identifier, recordType!IT Task.fields.statusId, null ), equals: 1, then: { a!richTextIcon(icon: "circle-o-notch", color: "SECONDARY"), " Not Started" }, equals: 2, then: { a!richTextIcon(icon: "spinner", color: "ACCENT"), " In Progress" }, equals: 3, then: { a!richTextIcon(icon: "check-circle", color: "POSITIVE"), " Done" }, default: "-" ) } ) ) } ) } ) Feature compatibility The table below lists this component's compatibility with various features in Appian. Feature Compatibility Note Portals Compatible Offline Interfaces Compatible Sync-Time Custom Record Fields Incompatible Real-Time Custom Record Fields Incompatible Custom record fields that evaluate in real time must be configured using one or more Custom Field functions. Process Reports Incompatible Cannot be used to configure a process report. Process Events Incompatible Cannot be used to configure a process event node, such as a start event or timer event. Process Autoscaling Incompatible Cannot be used in autoscaled processes. Event Consumer Filter Conditions Compatible Can be used in filter conditions. Event Consumer Event Handlers Compatible Can be used in event handler expressions. Feedback Was this page helpful? SHARE FEEDBACK Loading...