Free cookie consent management tool by TermsFeed

Record Action Component

On This Page
SAIL Design System guidance available for Record Actions

Make taking action on your data quick, easy, and painless with record actions. Learn how to launch actions directly from any interface to save time and get your work done faster.

About the record action component

Displays a list of record actions with a consistent style. A record action is an end-user action configured within a record type object, such as a related action or record list action.

See also:

Parameters

a!recordActionField( actions, style, display, openActionsIn, align, accessibilityText, showWhen, securityOnDemand )

Name Keyword Types Description

Actions

actions

Any Type

List of record action items to display, configured using a!recordActionItem().

Display Style

style

Text

Determines how the list of actions should be displayed on the interface. Valid values: "TOOLBAR" (default), "LINKS", "CARDS", "SIDEBAR", "CALL_TO_ACTION", "MENU", "MENU_ICON", "TOOLBAR_PRIMARY", "SIDEBAR_PRIMARY". See the record action design guidance for details on how to use different styles effectively.

Display

display

Text

Determines how the given action labels will be displayed in each item. Valid values: "LABEL_AND_ICON" (default), "LABEL", "ICON".

Action Behavior

openActionsIn

Text

Determines how actions should open to the user. Valid values: "DIALOG" (default), "NEW_TAB", "SAME_TAB". This parameter doesn't apply to Appian Mobile.

Alignment

align

Text

Determines alignment of the action(s). Valid values: "START", "CENTER", "END".

Accessibility Text

accessibilityText

Text

Additional text to be announced by screen readers. Used only for accessibility; produces no visible change.

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.

Security On Demand

securityOnDemand

Boolean

Determines when record action security is evaluated for "MENU" and "MENU_ICON" styled actions. By default (true), security is evaluated when the user clicks the record action. When false, security is evaluated when the interface loads.

Using the record action component

The following sections cover important details about the record action component.

Appian Mobile considerations

In Appian Mobile, a record action form always displays as a full screen mobile view. After the form is submitted:

  • The user is returned to the page where they launched the action from.
  • That page is automatically refreshed.

Using the openActionsIn parameter

The openActionsIn parameter controls how record actions open.

You can open actions in the following locations:

  • Dialog: Use for quick edits or data entry that don't require full page navigation. This is the only option that supports automatic refresh.
  • New tab: Use for complex forms or when users need to reference other data while completing the action.
  • Same tab: Use for simple navigation or when the action replaces the current context.

Configure dialog boxes for record actions

When you set the openActionsIn parameter to "DIALOG", you'll want to also configure the following dialog elements:

  • Configure the dialog size in the record type. Each record action can have its own dialog size.
  • Configure dialog rounding for all dialogs site-wide in the site object.

Refresh behavior after dialog submission

When a record action form submits in a dialog, the dialog closes and the page refreshes automatically. Actions that open in a new tab or the same tab don't trigger refresh because the user navigates away from the page.

After dialog submission:

  • All record actions in that record action field refresh automatically. This updates visibility conditions, labels, context, and descriptions as needed.
  • If you have multiple record action fields on an interface (such as in different grids), only the field where the action was launched will refresh. This selective refresh improves performance and maintains the state of other interface elements.

To refresh other data on the page after dialog submission, use local variable refresh behavior with refreshAfter: "RECORD_ACTION".

Using the record action component with multiple record types

Within an a!recordActionField() function, you can use multiple a!recordActionItem() functions to display record actions from different record types. This allows you to display all actions in a consistent format, like in the example below, and leverage the performance benefits included in "MENU" and "MENU_ICON" styled actions.

Using the securityOnDemand parameter

The securityOnDemand parameter allows you to determine when record action security is evaluated on "MENU" and "MENU_ICON" styled actions.

By default, this parameter is set to true, and security is evaluated when the user clicks the record action. Deferring this check until it's needed means the interface will load faster, especially if you have multiple actions on a single page or if you have complex record action security configured.

Users may see a short delay when they want to view available record actions, but this experience is often preferable to the alternative (checking action security for every row before showing the grid).

Record action security evaluation on menu button

See the SAIL Design System recommendation for more guidance on using the "MENU" or "MENU_ICON" action styles.

Examples

The following examples demonstrate the record action component.

These examples reference record types from another environment and will error if you try to use them in yours. Use them as a reference only.

Record action field with no configurations

Scroll or drag to pan · ⌘+/⌘− to zoom · Esc to closeimages/record_components/simple_record_action_field.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a!recordActionField(
  actions: {
   /* For each of the "action" parameters below, replace the record action reference 
    * with a valid record action reference in your environment.
    */
    a!recordActionItem(
     action: recordType!Department.actions.update,
     identifier: ri!departmentId
    ),
    a!recordActionItem(
     action: recordType!Customer.actions.flag,
     identifier: ri!customerId
    )
  }
)

Record action field with primary button styling

Scroll or drag to pan · ⌘+/⌘− to zoom · Esc to closeimages/record_components/record-action-primary-style.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
a!recordActionField(
 actions: {
   /* For each of the "action" parameters below, replace the record action reference 
    * with a valid record action reference in your environment.
    */
    a!recordActionItem(
      action: recordType!Order.actions.newOrder
    ),
    a!recordActionItem(
      action: recordType!Order.actions.updateOrder,
      identifier: 1
    ),
    a!recordActionItem(
      action: recordType!Order.actions.discountOrder,
      identifier: 1
    )
  },
  style: "SIDEBAR_PRIMARY",
  display: "LABEL_AND_ICON"
)

Record action field with refresh variables

Scroll or drag to pan · ⌘+/⌘− to zoom · Esc to closeimages/record_components/refresh_record_action_example.png

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
a!localVariables(
 /*
  * The parameter 'refreshAfter' in a!refreshVariable() can be used to refresh data when
  * record action dialogs are submitted. Do this to update data related to the record action.
  */
  local!case: a!refreshVariable(
    /* Replace all record type references below with a valid   
     * record type references in your environment.
     */
    value: a!queryRecordType(
        recordType: recordType!Case,
        fields: {
            recordType!Case.fields.id,
            recordType!Case.fields.priority,
            recordType!Case.fields.status,
            recordType!Case.fields.createdBy,
            recordType!Case.fields.createdOn
        },
        filters: {
            filter: a!queryFilter(recordType!Case.fields.id, "=", ri!CaseId)
        },
        pagingInfo: a!pagingInfo(1, 1)
    ).data,
    refreshAfter: "RECORD_ACTION"
  ),
  {
    a!sideBySideLayout(
      items: {
        a!sideBySideItem(
          item: a!richTextDisplayField(
            labelPosition: "COLLAPSED",
            value: {
              a!richTextHeader(
                text: "Case Details"
              )
            }
          )
        ),
        a!sideBySideItem(
          item: a!recordActionField(
            actions: {
              a!recordActionItem(
                action: recordType!Case.actions.edit,
                identifier: local!case[recordType!Case.fields.id]
              )
            },
            openActionsIn: "DIALOG",
            style: "LINKS",
            display: "LABEL_AND_ICON",
            showIcon: true,
            align: "END"
          )
        )
      },
      alignvertical: "MIDDLE"
    ),
    a!columnsLayout(
      columns: {
        a!columnLayout(
          contents: {
            a!textField(
              label: "Priority",
              labelPosition: "JUSTIFIED",
              value: local!case[recordType!Case.fields.priority],
              readonly: true
            ),
            a!textField(
              label: "Status",
              labelPosition: "JUSTIFIED",
              value: local!case[recordType!Case.fields.status],
              readonly: true
            ),
          }
        ),
        a!columnLayout(
          contents: {
            a!textField(
              label: "Created On",
              labelPosition: "JUSTIFIED",
              value: local!case[recordType!Case.fields.createdOn],
              readonly: true
            ),
            a!textField(
              label: "Created By",
              labelPosition: "JUSTIFIED",
              value: local!case[recordType!Case.fields.createdBy],
              readonly: true
            )
          }
        )
      }
    )
  }
)

Tip:  If your data isn't refreshing after the record action completes, see Troubleshooting refresh behavior for common causes and solutions.

Record action field in a column of a read-only grid

Scroll or drag to pan · ⌘+/⌘− to zoom · Esc to closeimages/record_components/actions_in_grid.png

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
{
  /* Replace the record type references below with a valid   
   * record type references in your environment.
   */
  a!gridField(
    label: "Read-only Grid",
    labelPosition: "ABOVE",
    data: recordType!Customer,
    columns: {
      a!gridColumn(
        label: "Display Name",
        sortField: recordType!Customer.fields.displayName,
        value: a!linkField(
          links: {
            a!recordLink(
              label: fv!row[recordType!Customer.fields.displayName],
              recordType: {
                recordType!Customer
              },
              identifier: fv!row[recordType!Customer.fields.id]
            )
          }
        )
      ),
      a!gridColumn(
        label: "District",
        sortField: recordType!Customer.fields.districtId,
        value: a!linkField(
          links: {
            a!recordLink(
              label:fv!row[recordType!Customer.relationships.district.fields.name],
              recordType: recordType!District,
              identifier: fv!row[recordType!Customer.fields.districtId]
            )
          }
        ),
        align: "START"
      ),
      a!gridColumn(
        label: "Active",
        sortField: recordType!Customer.fields.isActive,
        value: if(
          fv!row[recordType!Customer.fields.isActive],
          "Active",
          "Inactive"
        )
      ),
      a!gridColumn(
        label: "Address",
        sortField: recordType!Customer.fields.addressId,
        value: rule!RE_formatAddress(
          street1: fv!row[recordType!Customer.relationships.address.fields.street1],
          street2: fv!row[recordType!Customer.relationships.address.fields.street2],
          city: fv!row[recordType!Customer.relationships.address.fields.city],
          state: fv!row[recordType!Customer.relationships.address.fields.state],
          zip: fv!row[recordType!Customer.relationships.address.fields.zip]
          
        ),
        align: "START"
      ),
      a!gridColumn(
        label: "# Payments",
        sortField: recordType!Customer.fields.paymentCount,
        value: fv!row[recordType!Customer.fields.paymentCount],
        align: "END"
      ),
      a!gridColumn(
        label: "# Deliveries",
        sortField: recordType!Customer.fields.deliveryCount,
        value: fv!row[recordType!Customer.fields.deliveryCount],
        align: "END"
      ),
      a!gridColumn(
        label: "Customer Since",
        sortField: 'recordType!Customer.fields.customerSince',
        value: if(
          isnull(
            fv!row[recordType!Customer.fields.customerSince]
          ),
          fv!row[recordType!Customer.fields.customerSince],
          datetext(
            fv!row[recordType!Customer.fields.customerSince],
            "default"
          )
        ),
        align: "END"
      ),
   /* In the "value" parameter of a!gridColumn, use a!recordActionField()
    * to display one or more record actions on each row of the grid.
    */
      a!gridColumn(
        label: "",
        value: a!recordActionField(
          actions:{
          /* Replace the record action references below with valid 
           * record action references in your environment.
           */
            a!recordActionItem(
              action: recordType!Customer.actions.updateCustomer,                 
              identifier: fv!identifier 
              ),
            a!recordActionItem(
              action: recordType!Customer.actions.deleteReCustomer,                 
              identifier: fv!identifier 
              )
          },
        style: "MENU_ICON"
        )
      )
    },
    validations: {},
    refreshAfter: "RECORD_ACTION",
    showSearchBox: true,
    showRefreshButton: true,
    recordActions: {
      a!recordActionItem(
        action: recordType!Customer.actions.newCustomer
      )
    }
  )
}

Feature compatibility

The table below lists this component's compatibility with various features in Appian.
Feature Compatibility Note
Portals Incompatible
Offline Interfaces Incompatible
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.

Old versions

There are older versions of this interface component. You can identify older versions by looking at the name to see if there is a version suffix. If you are using an old version, be sure to refer to the corresponding documentation from the list below.

Old Versions Reason for Update
a!recordActionField_23r3

Added the securityOnDemand parameter to determine when record action security is evaluated for the "MENU" and "MENU_ICON"` action styles. By default, security for the menu styles is evaluated when the user clicks the button.

To learn more about how Appian handles this kind of versioning, see the Function and Component Versions page.

Feedback