---
category: [Administration & Integrations, Platform and Product Extensions, Platform and Product Extensions/Integration, Administration & Integrations/Custom Integrations & Apps, Platform and Product Extensions/Workday Extend]
keyword: [Extend, Presentation Components, widgets, tags, UI components]
nav: wcp_docs
parent_url: /wcp_docs/
title: bpExtender
layout: subsection
wd_wcptag: bpExtender
---

<a id="section_xz1_wjc_ccb"></a>
Extends an edit page with a container of widgets that help facilitate a business process. A `bpExtender` contains business process-related widgets that conform to the standard Workday look and feel. These widgets are the required PMD tags (in display order):

-   `image`: An image that displays next to the comment, typically the image of the comment author.
-   `comment`: A text area for posting a comment. You must at least include a `comment` in a `bpExtender`.
-   `commentHistory`: A list of comments with related information.
-   `processHistory`: A list of process events with related information.
-   `attachment`: An area for uploading files.
-   `bpButtons[]`: A set of business process buttons such as <b>Review</b>, <b>Approve</b>, and <b>Deny</b>. The `bpButton` widgets replace the standard <b>OK</b> button at the bottom of an edit page. The <b>Cancel</b> button always displays.


<a id="section_klq_1bt_tgb"></a>
Use `bpExtender` only on edit pages. Specify the `bpExtender` tag in the `extender` subschema of `presentation`. `extender` is at the same level as `body`, which contains the editable widgets of the edit page. Note that `bpExtender` displays at the bottom of the footer, which you can remove.

You can use Workday or third-party business process REST APIs to interact with the widgets in `bpExtender`.

## <a id="section_ibj_bct_zhb"></a>Example

This sample edit page includes a `bpExtender`:

![](GUID-7e74a874-16ef-4079-b9b5-f05e736d3a57-enHYPHENus.png)

This snippet displays the `presentation` of the sample edit page. The `body` is followed by the `extender` subschema containing `bpExtender`:

```
"presentation" : {
   "title" : {
     "type" : "title",
     "label" : "Approve or Deny the Request"
   },
   "body" : {
     "type" : "section",
     "children" : [ {
       "id" : "approveText",
       "type" : "text",
       "label" : "If you approve the request, enter a reason and click Approve.",
       "value" : "Enter approval reason.",
       "required" : "false",
       "valueOutBinding" : "approveEndpoint.comment"
     }, {
       "id" : "denyText",
       "type" : "text",
       "label" : "If you deny the request, enter a reason and click Deny.",
       "value" : "Enter denial reason.",
       "required" : "false",
       "valueOutBinding" : "denyEndpoint.comment"
     }, {
       "type" : "textArea",
       "label" : "See related information below (thanks to bpExtender).",
       "value" : "You can add a comment, view the comment and process history, and attach text files.",
       "enabled" : false
     } ]
   },
   "extender" : {
     "type" : "bpExtender",
     "bpButtons" : [ {
       "id" : "approveButtonId",
       "type" : "bpButton",
       "buttonType" : "PRIMARY",
       "label" : "Approve"
     }, {
       "id" : "denyButtonId",
       "type" : "bpButton",
       "buttonType" : "AUXILIARY",
       "label" : "Deny"
     }, {
       "id" : "dontShow",
       "type" : "bpButton",
       "buttonType" : "AUXILIARY",
       "label" : "Dont Show",
       "render" : false
     } ],
     "attachment" : {
       "type" : "fileUploader",
       "valueOutBinding" : "attachmentEndpoint",
       "validations" : [ {
         "regex" : ".*",
         "errorMessage" : "Invalid file type."
       } ]
     },
     "comment" : {
       "type" : "textArea",
       "valueOutBinding" : "approveEndpoint.comment"
     },
     "image" : {
       "type" : "image",
       "id" : "samplePhoto",
       "imageUri" : "https://imageHost/samplePhoto.jpg"
     },
     "commentHistory" : {
       "type" : "bpTemplatedList",
       "on" : "<% commentHistoryApi.data %>",
       "as" : "commentData",
       "template" : {
         "type" : "commentHistory",
         "author" : {
           "type" : "instanceList",
           "instanceList" : [ {
             "id" : "1",
             "descriptor" : "<% commentData.person.descriptor %>"
           } ]
         },
         "text" : {
           "type" : "text",
           "value" : "<% commentData.comment %>"
         },
         "date" : {
           "type" : "date",
           "datePrecision": "SECOND",
           "dateFormat": "yyyy-MM-dd'T'HH:mm:ss",
           "displayTimeZone": "<% userInfo.data[0].timezone %>",
           "value" : "<% commentData.commentDate %>"
         }
       }
     },
     "processHistory" : {
       "type" : "bpTemplatedList",
       "on" : "<% processHistoryApi.data %>",
       "as" : "processData",
       "template" : {
         "type" : "processHistory",
         "actionEvent" : {
           "type" : "instanceList",
           "instanceList" : [ {
             "id" : "1",
             "descriptor" : "Some Process"
           } ]
         },
         "workflowStep" : {
           "type" : "instanceList",
           "instanceList" : [ {
             "id" : "1",
             "descriptor" : "<% processData.descriptor %>"
           } ]
         },
         "status" : {
           "type" : "text",
           "value" : "<% processData.status.descriptor %>"
         },
         "completedDate" : {
           "type" : "date",
           "datePrecision": "SECOND",
           "dateFormat": "yyyy-MM-dd'T'HH:mm:ss",
           "displayTimeZone": "<% userInfo.data[0].timezone %>",
           "value" : "<% processData.completedDate %>"
         },
         "user" : {
           "type" : "instanceList",
           "instanceList" : [ {
             "id" : "1",
             "descriptor" : "<% processData.completedByPerson.descriptor %>"
           } ]
         },
         "delegationMessage" : {
           "type" : "text",
           "value" : "<% processData.event.descriptor %>"
         }
       }
     }
   }
 }
```

## <a id="section-mobile-support"></a>Mobile Support

Android, iOS

## <a id="section_qpw_1kc_ccb"></a>Attributes

-   <b>attachment</b>

    Data type: fileUploader

    (Required) A `fileUploader` tag that enables a user to upload files on `bpExtender`. Set the `valueOutBinding` attribute to the outbound endpoint that uploads the file.

    Example:

    ```
    "attachment" : {
      "type" : "fileUploader",
      "valueOutBinding" : "attachmentEndpoint",
      "validations" : [ {
        "regex" : ".*",
        "errorMessage" : "Invalid file type."
      } ]
    }
    ```

-   <b>bpButtons</b>

    Data type: list

    (Required) Contains `bpButton` tags that replace the standard <b>OK</b> button on an edit page. If you don't specify `bpButtons[]`, the standard <b>OK</b> button displays. The <b>Cancel</b> button always displays.

    See `bpButton` for details and for page flow requirements.

-   <b>comment</b>

    Data type: textArea

    (Required) A `textArea` tag that enables a user to enter a comment on `bpExtender`. Set the `valueOutBinding` attribute to the outbound endpoint and data for submitting the comment.

    Example:

    ```
    "comment" : {
          "type" : "textArea",
          "valueOutBinding" : "approveEndpoint.comment"
    }
    ```

    <b>Notes:</b>

    -   The `comment` label is always "Enter your comment", and cannot be overridden.
    -   To display or hide the comment box, use the `visible` attribute (not the `render` attribute).

-   <b>commentHistory</b>

    Data type: bpTemplatedList

    (Required) A `bpTemplatedList` tag that displays a list of comments on `bpExtender`. See `bpTemplatedList` for details.

-   <b>id</b>

    Data type: binding-String

    Unique identifier used to reference this widget from other tags.

    Notes:

    -   The `id` must start with a letter.
    -   The `id` must be unique per page.
    -   To enable other widgets to reference this widget `id`, place this widget before the other widgets on the PMD. The PMD validation returns an "Undefined variable" error if it doesn't find a previously defined `id` in the PMD.
    -   Workday recommends that you include the `id` in your tag definitions for debugging purposes.

-   <b>image</b>

    Data type: image

    (Required) An `image` tag that displays next to the comment on a `bpExtender`. The default is a cloud image.

    This sample image uses `imageUri`:

    ```
    "image": {
          "type": "image",
          "id": "Worker photo",
          "imageUri": "https://imageHost/workerImage.jpg"
    }
    ```

    This sample image uses the worker photo from the <i>workerImageGet</i> endpoint. The `userPhoto` attribute enables a round image display.

    ```
    "image": {
    "type": "image",
    "id": "WorkerId",
    "endPoint": {
      "url": "<% workerImageGet.workerPhotos.href %>",
      "authType": "sso"
    },
    "userPhoto": true
    }
    ```

    The sample <i>workerImageGet</i> in the AMD:

    ```
    {
    "name": "workerImageGet",
    "baseUrlType": "workday-common",
    "url": "workers/me?view=workerPhotoWIDView",
    "authType": "sso"
    }
    ```

-   <b>processHistory</b>

    Data type: bpTemplatedList

    (Required) A `bpTemplatedList` tag that displays a list of process events on `bpExtender`. See `bpTemplatedList` for details.



### Related Information

[bpButton](/wcp_docs/awq1559797247759.html)

[bpTemplatedList](/wcp_docs/bvi1559973927931.html)

